This is an automated email from the ASF dual-hosted git repository.

mhubail pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git

commit bf83382c5e5051e011e67ec80ee1b674ac9edd4a
Author: Ali Alsuliman <[email protected]>
AuthorDate: Tue Apr 8 01:31:47 2025 -0700

    [ASTERIXDB-3594][OTH] Add metric for failed IO operations
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    - failed flushes
    - failed merges
    
    Ext-ref: MB-65335
    
    Change-Id: I5b0a80b61e73eb35d105827e9116a9a1a715b35f
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19630
    Reviewed-by: Murtadha Hubail <[email protected]>
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Ali Alsuliman <[email protected]>
---
 .../apache/asterix/common/context/DatasetInfo.java | 24 ++++++++++++++++++++++
 .../common/context/DatasetLifecycleManager.java    |  2 ++
 .../ioopcallbacks/LSMIOOperationCallback.java      |  1 +
 .../asterix/common/storage/StorageIOStats.java     | 18 ++++++++++++++++
 4 files changed, 45 insertions(+)

diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetInfo.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetInfo.java
index 7f3642bb1f..2803f219d1 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetInfo.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetInfo.java
@@ -23,6 +23,7 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.asterix.common.api.IIOBlockingOperation;
 import org.apache.asterix.common.transactions.ILogManager;
@@ -47,6 +48,8 @@ public class DatasetInfo extends Info implements 
Comparable<DatasetInfo> {
     private final int datasetID;
     private final ILogManager logManager;
     private final LogRecord waitLog = new LogRecord();
+    private final AtomicInteger failedFlushes = new AtomicInteger();
+    private final AtomicInteger failedMerges = new AtomicInteger();
     private int numActiveIOOps;
     private int pendingFlushes;
     private int pendingMerges;
@@ -317,4 +320,25 @@ public class DatasetInfo extends Info implements 
Comparable<DatasetInfo> {
     public synchronized int getPendingReplications() {
         return pendingReplications;
     }
+
+    public int getFailedFlushes() {
+        return failedFlushes.get();
+    }
+
+    public int getFailedMerges() {
+        return failedMerges.get();
+    }
+
+    public void incrementFailedIoOp(ILSMIOOperation.LSMIOOperationType 
operation) {
+        switch (operation) {
+            case FLUSH:
+                failedFlushes.incrementAndGet();
+                break;
+            case MERGE:
+                failedMerges.incrementAndGet();
+                break;
+            default:
+                break;
+        }
+    }
 }
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLifecycleManager.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLifecycleManager.java
index fc27bf6936..012829704a 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLifecycleManager.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLifecycleManager.java
@@ -955,6 +955,8 @@ public class DatasetLifecycleManager implements 
IDatasetLifecycleManager, ILifeC
             stats.addPendingFlushes(dsr.getDatasetInfo().getPendingFlushes());
             stats.addPendingMerges(dsr.getDatasetInfo().getPendingMerges());
             
stats.addPendingReplications(dsr.getDatasetInfo().getPendingReplications());
+            stats.addFailedFlushes(dsr.getDatasetInfo().getFailedFlushes());
+            stats.addFailedMerges(dsr.getDatasetInfo().getFailedMerges());
         }
         return stats;
     }
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMIOOperationCallback.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMIOOperationCallback.java
index 52af32909a..6887782a0b 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMIOOperationCallback.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMIOOperationCallback.java
@@ -143,6 +143,7 @@ public class LSMIOOperationCallback implements 
ILSMIOOperationCallback {
 
     @Override
     public void afterFailure(ILSMIOOperation operation) {
+        dsInfo.incrementFailedIoOp(operation.getIOOperationType());
         if (isMerge(operation)) {
             try {
                 ioManager.delete(getOperationMaskFilePath(operation));
diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/StorageIOStats.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/StorageIOStats.java
index b58f63deff..2e2a4a78ed 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/StorageIOStats.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/StorageIOStats.java
@@ -23,6 +23,8 @@ public class StorageIOStats {
     private int pendingFlushes;
     private int pendingMerges;
     private int pendingReplications;
+    private int failedFlushes;
+    private int failedMerges;
 
     public void addPendingFlushes(int pending) {
         pendingFlushes += pending;
@@ -36,6 +38,22 @@ public class StorageIOStats {
         pendingReplications += pending;
     }
 
+    public void addFailedFlushes(int failed) {
+        failedFlushes += failed;
+    }
+
+    public void addFailedMerges(int failed) {
+        failedMerges += failed;
+    }
+
+    public int getFailedFlushes() {
+        return failedFlushes;
+    }
+
+    public int getFailedMerges() {
+        return failedMerges;
+    }
+
     public int getPendingFlushes() {
         return pendingFlushes;
     }

Reply via email to