diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerCache.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerCache.java index 4ddb4e48792..04eb30fe2a8 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerCache.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerCache.java @@ -160,4 +160,19 @@ public void removeDB(String containerDBPath) { lock.unlock(); } } + + /** + * Add a DB handler into cache. + * + * @param containerDBPath - DB path of the container. + * @param db - DB handler + */ + public void addDB(String containerDBPath, ReferenceCountedDB db) { + lock.lock(); + try { + this.putIfAbsent(containerDBPath, db); + } finally { + lock.unlock(); + } + } } diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/BlockUtils.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/BlockUtils.java index 35e0b0c15a7..7ceb622eb43 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/BlockUtils.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/BlockUtils.java @@ -95,6 +95,20 @@ public static void shutdownCache(ContainerCache cache) { cache.shutdownCache(); } + /** + * Add a DB handler into cache. + * + * @param db - DB handler. + * @param containerDBPath - DB path of the container. + * @param conf configuration. + */ + public static void addDB(ReferenceCountedDB db, String containerDBPath, + Configuration conf) { + ContainerCache cache = ContainerCache.getInstance(conf); + Preconditions.checkNotNull(cache); + cache.addDB(containerDBPath, db); + } + /** * Parses the {@link BlockData} from a bytes array. * diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/KeyValueContainerUtil.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/KeyValueContainerUtil.java index 501680ae84e..d4ea45950dd 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/KeyValueContainerUtil.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/KeyValueContainerUtil.java @@ -73,14 +73,6 @@ public static void createContainerMetaData(File containerMetaDataPath, File throw new IOException("Unable to create directory for metadata storage." + " Path: " + containerMetaDataPath); } - MetadataStore store = MetadataStoreBuilder.newBuilder().setConf(conf) - .setCreateIfMissing(true).setDbFile(dbFile).build(); - - // we close since the SCM pre-creates containers. - // we will open and put Db handle into a cache when keys are being created - // in a container. - - store.close(); if (!chunksPath.mkdirs()) { LOG.error("Unable to create chunks directory Container {}", @@ -91,6 +83,13 @@ public static void createContainerMetaData(File containerMetaDataPath, File throw new IOException("Unable to create directory for data storage." + " Path: " + chunksPath); } + + MetadataStore store = MetadataStoreBuilder.newBuilder().setConf(conf) + .setCreateIfMissing(true).setDbFile(dbFile).build(); + ReferenceCountedDB db = + new ReferenceCountedDB(store, dbFile.getAbsolutePath()); + //add db handler into cache + BlockUtils.addDB(db, dbFile.getAbsolutePath(), conf); } /**