diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java index 505096c9ebcc..918cb3ec5635 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java @@ -1216,6 +1216,7 @@ private OmKeyInfo createFakeDirIfShould(String volume, String bucket, Table keyTable = metadataManager.getKeyTable(layout); Iterator, CacheValue>> cacheIterator = keyTable.cacheIterator(); + Set deletedKeys = new HashSet<>(); while (cacheIterator.hasNext()) { Map.Entry, CacheValue> cacheEntry = cacheIterator.next(); @@ -1228,6 +1229,12 @@ private OmKeyInfo createFakeDirIfShould(String volume, String bucket, LOG.debug("Fake dir {} required for {}", targetKey, cacheKey); return createDirectoryKey(cacheValue.getCacheValue(), dirKey); } + // deletedKeys may contain deleted entry while iterating cache iterator + // To avoid race condition of flush of cache while iterating + // table iterator. + if (!exists) { + deletedKeys.add(cacheKey); + } } try (TableIterator> @@ -1242,7 +1249,7 @@ private OmKeyInfo createFakeDirIfShould(String volume, String bucket, // in different volume/bucket, such as "/vol1/bucket2/dir2/key2". if (key.startsWith(targetKey)) { if (!Objects.equals(key, targetKey) - && !isKeyDeleted(key, keyTable)) { + && !deletedKeys.contains(key)) { LOG.debug("Fake dir {} required for {}", targetKey, key); return createDirectoryKey(keyValue.getValue(), dirKey); }