This is an automated email from the ASF dual-hosted git repository.
adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 6ca1750531 HDDS-8526. Intermittent failure: Directory is not empty
(#5051)
6ca1750531 is described below
commit 6ca1750531635ac3cc52863f385a6f2e56c859be
Author: ashishkumar50 <[email protected]>
AuthorDate: Thu Jul 13 14:56:27 2023 +0530
HDDS-8526. Intermittent failure: Directory is not empty (#5051)
---
.../hadoop/ozone/om/OmMetadataManagerImpl.java | 60 ++++++----------------
1 file changed, 16 insertions(+), 44 deletions(-)
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
index f51af41bab..86f3725408 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
@@ -49,7 +49,6 @@ import org.apache.hadoop.hdds.utils.db.RocksDBConfiguration;
import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.hdds.utils.db.Table.KeyValue;
import org.apache.hadoop.hdds.utils.db.TableIterator;
-import org.apache.hadoop.hdds.utils.db.TypedTable;
import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import org.apache.hadoop.hdds.utils.db.cache.TableCache.CacheType;
@@ -895,43 +894,13 @@ public class OmMetadataManagerImpl implements
OMMetadataManager,
public boolean isVolumeEmpty(String volume) throws IOException {
String volumePrefix = getVolumeKey(volume + OM_KEY_PREFIX);
- // First check in bucket table cache.
- Iterator<Map.Entry<CacheKey<String>, CacheValue<OmBucketInfo>>> iterator =
- ((TypedTable< String, OmBucketInfo>) bucketTable).cacheIterator();
- while (iterator.hasNext()) {
- Map.Entry< CacheKey< String >, CacheValue< OmBucketInfo > > entry =
- iterator.next();
- String key = entry.getKey().getCacheKey();
- OmBucketInfo omBucketInfo = entry.getValue().getCacheValue();
- // Making sure that entry is not for delete bucket request.
- if (key.startsWith(volumePrefix) && omBucketInfo != null) {
- return false;
- }
+ // First check in bucket table cache.
+ if (isKeyPresentInTableCache(volumePrefix, bucketTable)) {
+ return false;
}
- try (TableIterator<String, ? extends KeyValue<String, OmBucketInfo>>
- bucketIter = bucketTable.iterator()) {
- KeyValue<String, OmBucketInfo> kv = bucketIter.seek(volumePrefix);
-
- if (kv != null) {
- // Check the entry in db is not marked for delete. This can happen
- // while entry is marked for delete, but it is not flushed to DB.
- CacheValue<OmBucketInfo> cacheValue =
- bucketTable.getCacheValue(new CacheKey(kv.getKey()));
- if (cacheValue != null) {
- if (kv.getKey().startsWith(volumePrefix)
- && cacheValue.getCacheValue() != null) {
- return false; // we found at least one bucket with this volume
- // prefix.
- }
- } else {
- if (kv.getKey().startsWith(volumePrefix)) {
- return false; // we found at least one bucket with this volume
- // prefix.
- }
- }
- }
-
+ if (isKeyPresentInTable(volumePrefix, bucketTable)) {
+ return false; // we found at least one key with this vol/
}
return true;
}
@@ -1028,7 +997,7 @@ public class OmMetadataManagerImpl implements
OMMetadataManager,
* @throws IOException
*/
private <T> boolean isKeyPresentInTable(String keyPrefix,
- Table<String, T> table)
+ Table<String, T> table)
throws IOException {
try (TableIterator<String, ? extends KeyValue<String, T>>
keyIter = table.iterator()) {
@@ -1045,15 +1014,18 @@ public class OmMetadataManagerImpl implements
OMMetadataManager,
// Case 1: We found an entry, but no cache entry.
if (cacheValue == null) {
// we found at least one key with this prefix.
+ // There is chance cache value flushed when
+ // we iterate through the table.
+ // Check in table whether it is deleted or still present.
+ if (table.getIfExist(kv.getKey()) != null) {
+ // Still in table and no entry in cache
+ return true;
+ }
+ } else if (cacheValue.getCacheValue() != null) {
+ // Case 2a:
+ // We found a cache entry and cache value is not null.
return true;
}
-
- // Case 2a:
- // We found a cache entry and cache value is not null.
- if (cacheValue.getCacheValue() != null) {
- return true;
- }
-
// Case 2b:
// Cache entry is present but cache value is null, hence this key is
// marked for deletion.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]