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

JackieTien97 pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/dev/1.3 by this push:
     new e1a6847aef4 [To dev/1.3] Fixed multiple bugs related to schema 
(#17405) (#17420)
e1a6847aef4 is described below

commit e1a6847aef4885ab7e8aa0052104b31e0708ee4b
Author: Caideyipi <[email protected]>
AuthorDate: Wed Apr 29 14:55:16 2026 +0800

    [To dev/1.3] Fixed multiple bugs related to schema (#17405) (#17420)
---
 .../db/schemaengine/rescon/MemSchemaRegionStatistics.java  |  2 +-
 .../db/schemaengine/schemaregion/SchemaRegionPlanType.java |  1 +
 .../schemaregion/impl/SchemaRegionMemoryImpl.java          |  4 ++--
 .../impl/mem/mnode/iterator/AbstractTraverserIterator.java |  3 +++
 .../impl/mem/mnode/iterator/MemoryTraverserIterator.java   | 14 ++++++++++----
 .../pbtree/mnode/iterator/CachedTraverserIterator.java     |  7 +++++++
 .../mtree/impl/pbtree/schemafile/WrappedSegment.java       | 12 +++++-------
 .../metadata/schemaRegion/SchemaRegionManagementTest.java  | 12 ++++++++++++
 .../apache/iotdb/commons/schema/filter/SchemaFilter.java   |  7 ++++++-
 .../java/org/apache/iotdb/commons/schema/ttl/TTLCache.java |  3 +++
 10 files changed, 50 insertions(+), 15 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/MemSchemaRegionStatistics.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/MemSchemaRegionStatistics.java
index be960b3807b..a3a833f06ab 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/MemSchemaRegionStatistics.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/rescon/MemSchemaRegionStatistics.java
@@ -168,7 +168,7 @@ public class MemSchemaRegionStatistics implements 
ISchemaRegionStatistics {
     memoryUsage.getAndSet(0);
     measurementNumber.getAndSet(0);
     devicesNumber.getAndSet(0);
-    viewNumber.getAndAdd(0);
+    viewNumber.getAndSet(0);
     templateUsage.forEach(
         (templateId, cnt) -> 
schemaEngineStatistics.deactivateTemplate(templateId, cnt));
     templateUsage.clear();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanType.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanType.java
index 09a69f2b4f6..41ec8e649c5 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanType.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/SchemaRegionPlanType.java
@@ -39,6 +39,7 @@ public enum SchemaRegionPlanType {
   ACTIVATE_TEMPLATE_IN_CLUSTER((byte) 63),
   PRE_DELETE_TIMESERIES_IN_CLUSTER((byte) 64),
   ROLLBACK_PRE_DELETE_TIMESERIES((byte) 65),
+
   // endregion
 
   PRE_DEACTIVATE_TEMPLATE((byte) 0),
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
index 6fc556a1089..a55de193914 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
@@ -857,8 +857,8 @@ public class SchemaRegionMemoryImpl implements 
ISchemaRegion {
           regionStatistics.getGlobalMemoryUsage(), 
regionStatistics.getGlobalSeriesNumber());
     }
 
+    final List<PartialPath> pathList = plan.getViewPathList();
     try {
-      List<PartialPath> pathList = plan.getViewPathList();
       Map<PartialPath, ViewExpression> viewPathToSourceMap =
           plan.getViewPathToSourceExpressionMap();
       for (PartialPath path : pathList) {
@@ -873,7 +873,7 @@ public class SchemaRegionMemoryImpl implements 
ISchemaRegion {
       throw new RuntimeException(e);
     }
     // update statistics
-    regionStatistics.addView(1L);
+    regionStatistics.addView(pathList.size());
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/AbstractTraverserIterator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/AbstractTraverserIterator.java
index f7f6d7d1ae6..e9aa30333c7 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/AbstractTraverserIterator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/AbstractTraverserIterator.java
@@ -107,12 +107,15 @@ public abstract class AbstractTraverserIterator<N extends 
IMNode<N>> implements
       if (skipPreDeletedSchema
           && nextMatchedNode.isMeasurement()
           && nextMatchedNode.getAsMeasurementMNode().isPreDeleted()) {
+        releaseSkippedNode(nextMatchedNode);
         nextMatchedNode = null;
       }
     }
     return true;
   }
 
+  protected abstract void releaseSkippedNode(final N node);
+
   @Override
   public N next() {
     if (!hasNext()) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/MemoryTraverserIterator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/MemoryTraverserIterator.java
index 15eb95df4ab..684b398c472 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/MemoryTraverserIterator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/iterator/MemoryTraverserIterator.java
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.iterator;
 
 import org.apache.iotdb.commons.exception.MetadataException;
@@ -30,11 +31,16 @@ import java.util.Map;
 // only use for IConfigMNode and IMemMNode
 public class MemoryTraverserIterator<N extends IMNode<N>> extends 
AbstractTraverserIterator<N> {
   public MemoryTraverserIterator(
-      IMTreeStore<N> store,
-      IDeviceMNode<N> parent,
-      Map<Integer, Template> templateMap,
-      IMNodeFactory<N> nodeFactory)
+      final IMTreeStore<N> store,
+      final IDeviceMNode<N> parent,
+      final Map<Integer, Template> templateMap,
+      final IMNodeFactory<N> nodeFactory)
       throws MetadataException {
     super(store, parent, templateMap, nodeFactory);
   }
+
+  @Override
+  protected void releaseSkippedNode(final N node) {
+    // Do nothing
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/iterator/CachedTraverserIterator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/iterator/CachedTraverserIterator.java
index 0d14e2251c4..0654c93b834 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/iterator/CachedTraverserIterator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/iterator/CachedTraverserIterator.java
@@ -48,4 +48,11 @@ public class CachedTraverserIterator extends 
AbstractTraverserIterator<ICachedMN
     }
     super.close();
   }
+
+  @Override
+  protected void releaseSkippedNode(final ICachedMNode node) {
+    if (usingDirectChildrenIterator) {
+      store.unPin(node);
+    }
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/schemafile/WrappedSegment.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/schemafile/WrappedSegment.java
index e46f1aea025..65e1edebcf9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/schemafile/WrappedSegment.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/schemafile/WrappedSegment.java
@@ -105,17 +105,16 @@ public class WrappedSegment implements 
ISegment<ByteBuffer, ICachedMNode> {
     }
   }
 
-  public WrappedSegment(ByteBuffer buffer) throws RecordDuplicatedException {
+  public WrappedSegment(ByteBuffer buffer) {
     this(buffer, true);
   }
 
   @TestOnly
-  public WrappedSegment(int size) throws RecordDuplicatedException {
+  public WrappedSegment(int size) {
     this(ByteBuffer.allocate(size));
   }
 
-  public static ISegment<ByteBuffer, ICachedMNode> initAsSegment(ByteBuffer 
buffer)
-      throws RecordDuplicatedException {
+  public static ISegment<ByteBuffer, ICachedMNode> initAsSegment(ByteBuffer 
buffer) {
     if (buffer == null) {
       return null;
     }
@@ -559,7 +558,6 @@ public class WrappedSegment implements ISegment<ByteBuffer, 
ICachedMNode> {
 
   @Override
   public int updateRecord(String key, ByteBuffer uBuffer) throws 
MetadataException {
-
     int idx = binarySearchOnKeys(key);
     if (idx < 0) {
       throw new MetadataException(String.format("Record[key:%s] Not Existed.", 
key));
@@ -614,8 +612,8 @@ public class WrappedSegment implements ISegment<ByteBuffer, 
ICachedMNode> {
     }
 
     // shift offsets forward
-    if (idx != recordNum) {
-      int shift = recordNum - idx;
+    if (idx != recordNum - 1) {
+      int shift = recordNum - idx - 1;
       this.buffer.position(SchemaFileConfig.SEG_HEADER_SIZE + idx * 2);
       ShortBuffer lb = this.buffer.asReadOnlyBuffer().asShortBuffer();
       lb.get();
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaRegionManagementTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaRegionManagementTest.java
index d0278711219..2d79a6a4766 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaRegionManagementTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/schemaRegion/SchemaRegionManagementTest.java
@@ -27,6 +27,7 @@ import org.apache.iotdb.consensus.ConsensusFactory;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.schemaengine.schemaregion.ISchemaRegion;
+import org.apache.iotdb.db.schemaengine.schemaregion.SchemaRegionPlanType;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.read.resp.info.ISchemaInfo;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.read.resp.info.ITimeSeriesSchemaInfo;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.write.req.SchemaRegionWritePlanFactory;
@@ -40,6 +41,7 @@ import org.junit.Ignore;
 import org.junit.Test;
 
 import java.io.File;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -229,4 +231,14 @@ public class SchemaRegionManagementTest extends 
AbstractSchemaRegionTest {
       
config.setSchemaRegionConsensusProtocolClass(schemaRegionConsensusProtocolClass);
     }
   }
+
+  @Test
+  public void testSchemaRegionPlanType() throws Exception {
+    Assert.assertEquals(
+        SchemaRegionPlanType.values().length,
+        Arrays.stream(SchemaRegionPlanType.values())
+            .map(SchemaRegionPlanType::getPlanType)
+            .distinct()
+            .count());
+  }
 }
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/filter/SchemaFilter.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/filter/SchemaFilter.java
index a9e5fea0b73..d59e59ba2bc 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/filter/SchemaFilter.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/filter/SchemaFilter.java
@@ -91,7 +91,12 @@ public abstract class SchemaFilter {
   }
 
   private static void internalExtract(
-      List<SchemaFilter> result, SchemaFilter schemaFilter, SchemaFilterType 
filterType) {
+      final List<SchemaFilter> result,
+      final SchemaFilter schemaFilter,
+      final SchemaFilterType filterType) {
+    if (schemaFilter == null) {
+      return;
+    }
     if (schemaFilter.getSchemaFilterType().equals(filterType)) {
       result.add(schemaFilter);
     }
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/ttl/TTLCache.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/ttl/TTLCache.java
index b3a3e3a891c..59f4653f0ae 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/ttl/TTLCache.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/ttl/TTLCache.java
@@ -335,6 +335,9 @@ public class TTLCache {
   public void clear() {
     ttlCacheTree.removeAllChildren();
     ttlCacheTree.addChild(IoTDBConstant.MULTI_LEVEL_PATH_WILDCARD, 
Long.MAX_VALUE);
+
+    // root.**
+    ttlCount = 1;
   }
 
   static class CacheNode {

Reply via email to