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;
+ }
+ }
}