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

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


The following commit(s) were added to refs/heads/master by this push:
     new 3e1061717bd Fix VolatileSubtreeIterator missing update buffer if all 
nodes in new buffer are not qualified (#12093)
3e1061717bd is described below

commit 3e1061717bda2abe476cd27420e14c7857ca087e
Author: Chen YZ <[email protected]>
AuthorDate: Wed Feb 28 09:30:48 2024 +0800

    Fix VolatileSubtreeIterator missing update buffer if all nodes in new 
buffer are not qualified (#12093)
    
    Fix VolatileSubtreeIterator missing update buffer if all nodes in new 
buffer are not qualified
---
 .../mtree/impl/pbtree/memory/MemoryManager.java    | 42 +++++++++++++++-------
 1 file changed, 30 insertions(+), 12 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memory/MemoryManager.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memory/MemoryManager.java
index f0b793864db..99985a11da9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memory/MemoryManager.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/memory/MemoryManager.java
@@ -38,6 +38,8 @@ import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.concurrent.atomic.AtomicLong;
 
+import static 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.memory.MemoryManager.STATUS.ITERATE_NEW_BUFFER;
+import static 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.memory.MemoryManager.STATUS.ITERATE_UPDATE_BUFFER;
 import static 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.container.ICachedMNodeContainer.getBelongedContainer;
 import static 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.container.ICachedMNodeContainer.getCachedMNodeContainer;
 
@@ -293,13 +295,13 @@ public class MemoryManager implements IMemoryManager {
 
     private final ICachedMNodeContainer container;
     private Iterator<ICachedMNode> bufferedNodeIterator;
-    private byte status;
+    private STATUS status;
     private ICachedMNode nextSubtree = null;
 
     private VolatileSubtreeIterator(ICachedMNodeContainer container) {
       this.container = container;
       this.bufferedNodeIterator = 
container.getNewChildFlushingBuffer().values().iterator();
-      this.status = 0;
+      this.status = ITERATE_NEW_BUFFER;
     }
 
     @Override
@@ -323,13 +325,16 @@ public class MemoryManager implements IMemoryManager {
     private void tryGetNext() {
       ICachedMNode node;
       CacheEntry cacheEntry;
-      if (!bufferedNodeIterator.hasNext() && status == 0) {
-        // flushingBuffer of NewChildBuffer has been traversed, and the 
flushingBuffer of
-        // UpdateChildBuffer needs to be traversed.
-        bufferedNodeIterator = 
container.getUpdatedChildFlushingBuffer().values().iterator();
-        status = 1;
-      }
-      while (bufferedNodeIterator.hasNext()) {
+      while (bufferedNodeIterator.hasNext() || status == ITERATE_NEW_BUFFER) {
+        if (!bufferedNodeIterator.hasNext()) {
+          // flushingBuffer of NewChildBuffer has been traversed, and the 
flushingBuffer of
+          // UpdateChildBuffer needs to be traversed.
+          bufferedNodeIterator = 
container.getUpdatedChildFlushingBuffer().values().iterator();
+          status = ITERATE_UPDATE_BUFFER;
+          if (!bufferedNodeIterator.hasNext()) {
+            return;
+          }
+        }
         node = bufferedNodeIterator.next();
 
         // prevent this node being added buffer during the following check and 
potential flush
@@ -345,7 +350,7 @@ public class MemoryManager implements IMemoryManager {
           cacheEntry = getCacheEntry(node);
 
           synchronized (cacheEntry) {
-            if (status == 1
+            if (status == ITERATE_UPDATE_BUFFER
                 && 
container.getUpdatedChildReceivingBuffer().containsKey(node.getName())) {
               if (cacheEntry.hasVolatileDescendant()
                   && getCachedMNodeContainer(node).hasChildrenInBuffer()) {
@@ -356,13 +361,15 @@ public class MemoryManager implements IMemoryManager {
                 // return for flush
                 nextSubtree = node;
                 unlockImmediately = false;
+                return;
+              } else {
+                continue;
               }
-              return;
             }
 
             cacheEntry.setVolatile(false);
             memoryStatistics.removeVolatileNode();
-            if (status == 1) {
+            if (status == ITERATE_UPDATE_BUFFER) {
               container.moveMNodeFromUpdateChildBufferToCache(node.getName());
             } else {
               container.moveMNodeFromNewChildBufferToCache(node.getName());
@@ -625,4 +632,15 @@ public class MemoryManager implements IMemoryManager {
   public long getCacheNodeNum() {
     return nodeCache.getCacheNodeNum();
   }
+
+  enum STATUS {
+    ITERATE_NEW_BUFFER((byte) 0),
+    ITERATE_UPDATE_BUFFER((byte) 1);
+
+    private final byte status;
+
+    STATUS(byte status) {
+      this.status = status;
+    }
+  }
 }

Reply via email to