You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by zy...@apache.org on 2023/01/31 08:32:29 UTC

[iotdb] branch master updated: [IOTDB-5442] SchemaFile update StorageGroupNode asynchronously (#8939)

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

zyk 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 c807fca28b [IOTDB-5442] SchemaFile update StorageGroupNode asynchronously (#8939)
c807fca28b is described below

commit c807fca28b86dc6ad9f4b4006d6e89d4a2e0a6b8
Author: Chen YZ <43...@users.noreply.github.com>
AuthorDate: Tue Jan 31 16:32:24 2023 +0800

    [IOTDB-5442] SchemaFile update StorageGroupNode asynchronously (#8939)
    
    [IOTDB-5442] SchemaFile update StorageGroupNode asynchronously (#8939)
---
 .../db/metadata/mtree/store/CachedMTreeStore.java  | 37 ++++++++++-----------
 .../mtree/store/disk/cache/CacheManager.java       | 38 ++++++++++++++++++----
 .../mtree/store/disk/cache/ICacheManager.java      |  3 ++
 3 files changed, 53 insertions(+), 25 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/CachedMTreeStore.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/CachedMTreeStore.java
index fa6d1dda71..42a10458f5 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/CachedMTreeStore.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/CachedMTreeStore.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.db.exception.metadata.cache.MNodeNotCachedException;
 import org.apache.iotdb.db.metadata.mnode.IEntityMNode;
 import org.apache.iotdb.db.metadata.mnode.IMNode;
 import org.apache.iotdb.db.metadata.mnode.IMeasurementMNode;
+import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
 import org.apache.iotdb.db.metadata.mnode.MNodeUtils;
 import org.apache.iotdb.db.metadata.mnode.estimator.IMNodeSizeEstimator;
 import org.apache.iotdb.db.metadata.mnode.iterator.AbstractTraverserIterator;
@@ -267,25 +268,11 @@ public class CachedMTreeStore implements IMTreeStore {
    */
   @Override
   public void updateMNode(IMNode node) throws MetadataException {
-    if (node.isStorageGroup()) {
-      this.root = node;
-      writeLock.lock();
-      try {
-        file.updateStorageGroupNode(node.getAsStorageGroupMNode());
-      } catch (IOException e) {
-        logger.error(
-            "IOException occurred during updating StorageGroupMNode {}", node.getFullPath());
-        throw new MetadataException(e);
-      } finally {
-        writeLock.unlock();
-      }
-    } else {
-      readLock.lock();
-      try {
-        cacheManager.updateCacheStatusAfterUpdate(node);
-      } finally {
-        readLock.unlock();
-      }
+    readLock.lock();
+    try {
+      cacheManager.updateCacheStatusAfterUpdate(node);
+    } finally {
+      readLock.unlock();
     }
   }
 
@@ -483,6 +470,18 @@ public class CachedMTreeStore implements IMTreeStore {
   private void flushVolatileNodes() {
     writeLock.lock();
     try {
+      IStorageGroupMNode updatedStorageGroupMNode = cacheManager.collectUpdatedStorageGroupMNodes();
+      if (updatedStorageGroupMNode != null) {
+        try {
+          file.updateStorageGroupNode(updatedStorageGroupMNode);
+        } catch (IOException e) {
+          logger.error(
+              "IOException occurred during updating StorageGroupMNode {}",
+              updatedStorageGroupMNode.getFullPath(),
+              e);
+          return;
+        }
+      }
       List<IMNode> nodesToPersist = cacheManager.collectVolatileMNodes();
       for (IMNode volatileNode : nodesToPersist) {
         try {
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/cache/CacheManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/cache/CacheManager.java
index d9dc2301ed..985bd0ac01 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/cache/CacheManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/cache/CacheManager.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.metadata.mtree.store.disk.cache;
 import org.apache.iotdb.db.exception.metadata.cache.MNodeNotCachedException;
 import org.apache.iotdb.db.exception.metadata.cache.MNodeNotPinnedException;
 import org.apache.iotdb.db.metadata.mnode.IMNode;
+import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
 import org.apache.iotdb.db.metadata.mtree.store.disk.ICachedMNodeContainer;
 import org.apache.iotdb.db.metadata.mtree.store.disk.memcontrol.IMemManager;
 import org.apache.iotdb.db.metadata.mtree.store.disk.memcontrol.MemManagerHolder;
@@ -176,11 +177,15 @@ public abstract class CacheManager implements ICacheManager {
         // the status change affects the subTre collect in nodeBuffer
         cacheEntry.setVolatile(true);
       }
-      getBelongedContainer(node).updateMNode(node.getName());
-      // MNode update operation like node replace may reset the mapping between cacheEntry and node,
-      // thus it should be updated
-      updateCacheStatusAfterUpdate(cacheEntry, node);
-      removeFromNodeCache(cacheEntry);
+      if (!node.isStorageGroup()) {
+        // if node is StorageGroup, getBelongedContainer is null
+        getBelongedContainer(node).updateMNode(node.getName());
+        // MNode update operation like node replace may reset the mapping between cacheEntry and
+        // node,
+        // thus it should be updated
+        updateCacheStatusAfterUpdate(cacheEntry, node);
+        removeFromNodeCache(cacheEntry);
+      }
       addToBufferAfterUpdate(node);
     }
   }
@@ -193,7 +198,7 @@ public abstract class CacheManager implements ICacheManager {
    */
   private void addToBufferAfterUpdate(IMNode node) {
     if (node.isStorageGroup()) {
-      nodeBuffer.put(getCacheEntry(node), node);
+      nodeBuffer.setUpdatedStorageGroupMNode(node.getAsStorageGroupMNode());
       return;
     }
 
@@ -252,6 +257,18 @@ public abstract class CacheManager implements ICacheManager {
     addToNodeCache(cacheEntry, node);
   }
 
+  /**
+   * Collect updated storage group node.
+   *
+   * @return null if not exist
+   */
+  @Override
+  public IStorageGroupMNode collectUpdatedStorageGroupMNodes() {
+    IStorageGroupMNode storageGroupMNode = nodeBuffer.getUpdatedStorageGroupMNode();
+    nodeBuffer.setUpdatedStorageGroupMNode(null);
+    return storageGroupMNode;
+  }
+
   /**
    * Collect nodes in all volatile subtrees. All volatile nodes' parents will be collected. The
    * ancestor will be in front of the descendent in returned list.
@@ -502,6 +519,7 @@ public abstract class CacheManager implements ICacheManager {
 
     private static final int MAP_NUM = 17;
 
+    private IStorageGroupMNode updatedStorageGroupMNode;
     private Map<CacheEntry, IMNode>[] maps = new Map[MAP_NUM];
 
     NodeBuffer() {
@@ -510,6 +528,14 @@ public abstract class CacheManager implements ICacheManager {
       }
     }
 
+    public IStorageGroupMNode getUpdatedStorageGroupMNode() {
+      return updatedStorageGroupMNode;
+    }
+
+    public void setUpdatedStorageGroupMNode(IStorageGroupMNode updatedStorageGroupMNode) {
+      this.updatedStorageGroupMNode = updatedStorageGroupMNode;
+    }
+
     void put(CacheEntry cacheEntry, IMNode node) {
       maps[getLoc(cacheEntry)].put(cacheEntry, node);
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/cache/ICacheManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/cache/ICacheManager.java
index 532a90a44f..6394ea0223 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/cache/ICacheManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/store/disk/cache/ICacheManager.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.metadata.mtree.store.disk.cache;
 import org.apache.iotdb.db.exception.metadata.cache.MNodeNotCachedException;
 import org.apache.iotdb.db.exception.metadata.cache.MNodeNotPinnedException;
 import org.apache.iotdb.db.metadata.mnode.IMNode;
+import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
 
 import java.util.List;
 
@@ -38,6 +39,8 @@ public interface ICacheManager {
 
   void updateCacheStatusAfterPersist(IMNode node);
 
+  IStorageGroupMNode collectUpdatedStorageGroupMNodes();
+
   List<IMNode> collectVolatileMNodes();
 
   void remove(IMNode node);