From b86ec7e08c7457b5076a8a040ce9da275117e8fd Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Tue, 13 May 2025 19:26:51 -0400 Subject: [PATCH 01/17] HDDS-13031. Remove Lock set bits for SNAPSHOT_GC_LOCK Change-Id: Id3202dbe7a5a71c43526e80af34b18dd7b2ed66e --- .../org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java index 07b5d7938ea9..2b2de20698ee 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java @@ -587,7 +587,7 @@ public enum Resource { KEY_PATH_LOCK((byte) 5, "KEY_PATH_LOCK"), //63 PREFIX_LOCK((byte) 6, "PREFIX_LOCK"), //127 SNAPSHOT_LOCK((byte) 7, "SNAPSHOT_LOCK"), // = 255 - SNAPSHOT_GC_LOCK((byte) 8, "SNAPSHOT_GC_LOCK"); + SNAPSHOT_GC_LOCK("SNAPSHOT_GC_LOCK"); // level of the resource private byte lockLevel; @@ -667,6 +667,12 @@ long getStartWriteHeldTimeNanos() { this.name = name; } + Resource(String name) { + this.name = name; + this.mask = 0; + this.setMask = 0; + } + boolean canLock(short lockSetVal) { // For USER_LOCK, S3_SECRET_LOCK and PREFIX_LOCK we shall not allow From 40b6a83370d32cf70eecfab5dafd5d6ba3638b4b Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Wed, 14 May 2025 00:54:37 -0400 Subject: [PATCH 02/17] HDDS-13031. Fix Locking setbit issue Change-Id: I1712f2dd4138a1f679eb4e4676b3d5ac41c80583 --- .../org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java | 4 ++-- .../org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java index 2b2de20698ee..7354b4b1c24a 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java @@ -668,6 +668,7 @@ long getStartWriteHeldTimeNanos() { } Resource(String name) { + this.lockLevel = -1; this.name = name; this.mask = 0; this.setMask = 0; @@ -686,7 +687,6 @@ boolean canLock(short lockSetVal) { return false; } - // Our mask is the summation of bits of all previous possible locks. In // other words it is the largest possible value for that bit position. @@ -723,7 +723,7 @@ short clearLock(short lockSetVal) { * @param lockSetVal */ boolean isLevelLocked(short lockSetVal) { - return (lockSetVal & setMask) == setMask; + return setMask != 0 && (lockSetVal & setMask) == setMask; } String getName() { diff --git a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java index 3f1e7ca83c60..441f49fe00da 100644 --- a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java +++ b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java @@ -30,6 +30,7 @@ import java.util.Stack; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.metrics2.MetricsRecord; import org.apache.hadoop.metrics2.impl.MetricsCollectorImpl; From c962507c0ab9591140b34de5b1477b8f5e3f178f Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Wed, 14 May 2025 05:21:03 -0400 Subject: [PATCH 03/17] HDDS-13031. Fix checkstyle Change-Id: Id4a53d3eb8f23031ef517b3793dc73b067b11d62 --- .../org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java index 441f49fe00da..3f1e7ca83c60 100644 --- a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java +++ b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java @@ -30,7 +30,6 @@ import java.util.Stack; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.metrics2.MetricsRecord; import org.apache.hadoop.metrics2.impl.MetricsCollectorImpl; From 6f12aaeaec51a559842e655c4946238a8bedb9fd Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Fri, 16 May 2025 13:11:01 -0400 Subject: [PATCH 04/17] HDDS-13031. Implement a Flat Lock resource in OzoneManagerLock Change-Id: Ibaa9a25cfc9126593b9ec3ec913c4a09e0846258 --- .../ozone/om/S3SecretLockedManager.java | 2 +- .../ozone/om/lock/IOzoneManagerLock.java | 118 +++++- .../hadoop/ozone/om/lock/OmReadOnlyLock.java | 7 +- .../ozone/om/lock/OzoneManagerLock.java | 397 ++++++++++-------- .../ozone/om/lock/OzoneManagerLockUtil.java | 12 +- .../hadoop/ozone/om/lock/TestKeyPathLock.java | 20 +- .../ozone/om/lock/TestOzoneManagerLock.java | 97 +++-- .../hadoop/ozone/om/BucketManagerImpl.java | 2 +- .../hadoop/ozone/om/KeyManagerImpl.java | 2 +- .../apache/hadoop/ozone/om/ListIterator.java | 2 +- .../apache/hadoop/ozone/om/OzoneManager.java | 4 +- .../hadoop/ozone/om/PrefixManagerImpl.java | 2 +- .../hadoop/ozone/om/SstFilteringService.java | 2 +- .../hadoop/ozone/om/VolumeManagerImpl.java | 4 +- .../ozone/om/lock/OBSKeyPathLockStrategy.java | 4 +- .../om/lock/RegularBucketLockStrategy.java | 2 +- .../request/bucket/OMBucketCreateRequest.java | 4 +- .../request/bucket/OMBucketDeleteRequest.java | 4 +- .../bucket/OMBucketSetOwnerRequest.java | 2 +- .../bucket/OMBucketSetPropertyRequest.java | 2 +- .../bucket/acl/OMBucketAclRequest.java | 2 +- .../file/OMDirectoryCreateRequest.java | 2 +- .../file/OMDirectoryCreateRequestWithFSO.java | 2 +- .../om/request/file/OMFileCreateRequest.java | 2 +- .../file/OMFileCreateRequestWithFSO.java | 2 +- .../request/file/OMRecoverLeaseRequest.java | 2 +- .../request/key/OMAllocateBlockRequest.java | 2 +- .../key/OMAllocateBlockRequestWithFSO.java | 2 +- .../key/OMDirectoriesPurgeRequestWithFSO.java | 2 +- .../om/request/key/OMKeyCommitRequest.java | 2 +- .../key/OMKeyCommitRequestWithFSO.java | 2 +- .../key/OMKeyCreateRequestWithFSO.java | 2 +- .../om/request/key/OMKeyDeleteRequest.java | 2 +- .../key/OMKeyDeleteRequestWithFSO.java | 2 +- .../om/request/key/OMKeyRenameRequest.java | 2 +- .../key/OMKeyRenameRequestWithFSO.java | 2 +- .../ozone/om/request/key/OMKeyRequest.java | 2 +- .../om/request/key/OMKeySetTimesRequest.java | 2 +- .../key/OMKeySetTimesRequestWithFSO.java | 2 +- .../om/request/key/OMKeysDeleteRequest.java | 2 +- .../om/request/key/OMKeysRenameRequest.java | 2 +- .../request/key/OMOpenKeysDeleteRequest.java | 2 +- .../om/request/key/acl/OMKeyAclRequest.java | 2 +- .../key/acl/OMKeyAclRequestWithFSO.java | 2 +- .../key/acl/prefix/OMPrefixAclRequest.java | 2 +- ...S3ExpiredMultipartUploadsAbortRequest.java | 2 +- .../S3InitiateMultipartUploadRequest.java | 2 +- ...InitiateMultipartUploadRequestWithFSO.java | 2 +- .../S3MultipartUploadAbortRequest.java | 2 +- .../S3MultipartUploadCommitPartRequest.java | 2 +- .../S3MultipartUploadCompleteRequest.java | 2 +- .../tagging/S3DeleteObjectTaggingRequest.java | 2 +- .../S3DeleteObjectTaggingRequestWithFSO.java | 2 +- .../s3/tagging/S3PutObjectTaggingRequest.java | 2 +- .../S3PutObjectTaggingRequestWithFSO.java | 2 +- .../s3/tenant/OMTenantAssignAdminRequest.java | 2 +- .../OMTenantAssignUserAccessIdRequest.java | 2 +- .../s3/tenant/OMTenantCreateRequest.java | 4 +- .../s3/tenant/OMTenantDeleteRequest.java | 2 +- .../s3/tenant/OMTenantRevokeAdminRequest.java | 2 +- .../OMTenantRevokeUserAccessIdRequest.java | 2 +- .../snapshot/OMSnapshotCreateRequest.java | 4 +- .../snapshot/OMSnapshotDeleteRequest.java | 4 +- .../snapshot/OMSnapshotRenameRequest.java | 4 +- .../request/volume/OMQuotaRepairRequest.java | 4 +- .../request/volume/OMVolumeCreateRequest.java | 4 +- .../request/volume/OMVolumeDeleteRequest.java | 4 +- .../volume/OMVolumeSetOwnerRequest.java | 2 +- .../volume/OMVolumeSetQuotaRequest.java | 2 +- .../volume/acl/OMVolumeAclRequest.java | 2 +- .../snapshot/OMSnapshotPurgeResponse.java | 2 +- .../ozone/om/snapshot/MultiSnapshotLocks.java | 6 +- .../om/snapshot/filter/ReclaimableFilter.java | 5 +- .../om/snapshot/TestMultiSnapshotLocks.java | 2 +- .../filter/AbstractReclaimableFilterTest.java | 6 +- 75 files changed, 486 insertions(+), 338 deletions(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/S3SecretLockedManager.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/S3SecretLockedManager.java index 580b43470d55..d42df2acbd24 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/S3SecretLockedManager.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/S3SecretLockedManager.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.S3_SECRET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.S3_SECRET_LOCK; import java.io.IOException; import java.util.List; diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/IOzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/IOzoneManagerLock.java index ebe330c67ab1..01adde398eb0 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/IOzoneManagerLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/IOzoneManagerLock.java @@ -25,46 +25,128 @@ */ public interface IOzoneManagerLock { - OMLockDetails acquireReadLock(OzoneManagerLock.Resource resource, + OMLockDetails acquireReadLock(Resource resource, String... resources); - OMLockDetails acquireReadLocks(OzoneManagerLock.Resource resource, Collection resources); + OMLockDetails acquireReadLocks(Resource resource, Collection resources); - OMLockDetails acquireWriteLock(OzoneManagerLock.Resource resource, + OMLockDetails acquireWriteLock(Resource resource, String... resources); - OMLockDetails acquireWriteLocks(OzoneManagerLock.Resource resource, - Collection resources); + OMLockDetails acquireWriteLocks(Resource resource, + Collection resources); boolean acquireMultiUserLock(String firstUser, String secondUser); void releaseMultiUserLock(String firstUser, String secondUser); - OMLockDetails releaseWriteLock(OzoneManagerLock.Resource resource, - String... resources); + OMLockDetails releaseWriteLock(Resource resource, + String... resources); - OMLockDetails releaseWriteLocks(OzoneManagerLock.Resource resource, - Collection resources); + OMLockDetails releaseWriteLocks(Resource resource, + Collection resources); - OMLockDetails releaseReadLock(OzoneManagerLock.Resource resource, + OMLockDetails releaseReadLock(Resource resource, String... resources); - OMLockDetails releaseReadLocks(OzoneManagerLock.Resource resource, - Collection resources); + OMLockDetails releaseReadLocks(Resource resource, + Collection resources); @VisibleForTesting - int getReadHoldCount(OzoneManagerLock.Resource resource, - String... resources); + int getReadHoldCount(Resource resource, + String... resources); @VisibleForTesting - int getWriteHoldCount(OzoneManagerLock.Resource resource, - String... resources); + int getWriteHoldCount(Resource resource, + String... resources); @VisibleForTesting - boolean isWriteLockedByCurrentThread(OzoneManagerLock.Resource resource, - String... resources); + boolean isWriteLockedByCurrentThread(Resource resource, + String... resources); void cleanup(); OMLockMetrics getOMLockMetrics(); + + /** + * Defines a resource interface used to represent entities that can be + * associated with locks in the Ozone Manager Lock mechanism. A resource + * implementation provides a name and an associated {@link ResourceManager} + * to manage its locking behavior. + */ + interface Resource { + + String getName(); + + ResourceManager getResourceManager(); + } + + /** + * The ResourceManager class provides functionality for managing + * information about resource read and write lock usage. It tracks the time of + * read and write locks acquired and held by individual threads, enabling + * more granular lock usage metrics. + */ + class ResourceManager { + // This helps in maintaining read lock related variables locally confined + // to a given thread. + private final ThreadLocal readLockTimeStampNanos = + ThreadLocal.withInitial(LockUsageInfo::new); + + // This helps in maintaining write lock related variables locally confined + // to a given thread. + private final ThreadLocal writeLockTimeStampNanos = + ThreadLocal.withInitial(LockUsageInfo::new); + + ResourceManager() { + } + + /** + * Sets the time (ns) when the read lock holding period begins specific to a + * thread. + * + * @param startReadHeldTimeNanos read lock held start time (ns) + */ + void setStartReadHeldTimeNanos(long startReadHeldTimeNanos) { + readLockTimeStampNanos.get() + .setStartReadHeldTimeNanos(startReadHeldTimeNanos); + } + + /** + * Sets the time (ns) when the write lock holding period begins specific to + * a thread. + * + * @param startWriteHeldTimeNanos write lock held start time (ns) + */ + void setStartWriteHeldTimeNanos(long startWriteHeldTimeNanos) { + writeLockTimeStampNanos.get() + .setStartWriteHeldTimeNanos(startWriteHeldTimeNanos); + } + + /** + * Returns the time (ns) when the read lock holding period began specific to + * a thread. + * + * @return read lock held start time (ns) + */ + long getStartReadHeldTimeNanos() { + long startReadHeldTimeNanos = + readLockTimeStampNanos.get().getStartReadHeldTimeNanos(); + readLockTimeStampNanos.remove(); + return startReadHeldTimeNanos; + } + + /** + * Returns the time (ns) when the write lock holding period began specific + * to a thread. + * + * @return write lock held start time (ns) + */ + long getStartWriteHeldTimeNanos() { + long startWriteHeldTimeNanos = + writeLockTimeStampNanos.get().getStartWriteHeldTimeNanos(); + writeLockTimeStampNanos.remove(); + return startWriteHeldTimeNanos; + } + } } diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OmReadOnlyLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OmReadOnlyLock.java index 059536fe0a58..3e68f856fc90 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OmReadOnlyLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OmReadOnlyLock.java @@ -21,7 +21,6 @@ import static org.apache.hadoop.ozone.om.lock.OMLockDetails.EMPTY_DETAILS_LOCK_NOT_ACQUIRED; import java.util.Collection; -import org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource; /** * Read only "lock" for snapshots @@ -42,7 +41,7 @@ public OMLockDetails acquireReadLocks(Resource resource, Collection re @Override public OMLockDetails acquireWriteLock(Resource resource, - String... resources) { + String... resources) { return EMPTY_DETAILS_LOCK_NOT_ACQUIRED; } @@ -63,7 +62,7 @@ public void releaseMultiUserLock(String firstUser, String secondUser) { @Override public OMLockDetails releaseWriteLock(Resource resource, - String... resources) { + String... resources) { return EMPTY_DETAILS_LOCK_NOT_ACQUIRED; } @@ -94,7 +93,7 @@ public int getWriteHoldCount(Resource resource, String... resources) { @Override public boolean isWriteLockedByCurrentThread(Resource resource, - String... resources) { + String... resources) { return false; } diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java index 7354b4b1c24a..cdaed9e383e3 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java @@ -24,6 +24,7 @@ import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_MANAGER_STRIPED_LOCK_SIZE_PREFIX; import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.Striped; import java.util.ArrayList; import java.util.Arrays; @@ -37,7 +38,9 @@ import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; +import java.util.stream.Stream; import java.util.stream.StreamSupport; +import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.hdds.conf.ConfigurationSource; import org.apache.hadoop.hdds.utils.CompositeKey; import org.apache.hadoop.hdds.utils.SimpleStriped; @@ -93,14 +96,10 @@ public class OzoneManagerLock implements IOzoneManagerLock { private static final Logger LOG = LoggerFactory.getLogger(OzoneManagerLock.class); - private final Map> stripedLockByResource; + private final Map, + Pair>, ResourceLockManager>> resourcelockMap; private OMLockMetrics omLockMetrics; - private final ThreadLocal lockSet = ThreadLocal.withInitial( - () -> Short.valueOf((short)0)); - - private ThreadLocal omLockDetails = - ThreadLocal.withInitial(OMLockDetails::new); /** * Creates new OzoneManagerLock instance. @@ -108,16 +107,30 @@ public class OzoneManagerLock implements IOzoneManagerLock { */ public OzoneManagerLock(ConfigurationSource conf) { omLockMetrics = OMLockMetrics.create(); - Map> stripedLockMap = - new EnumMap<>(Resource.class); - for (Resource r : Resource.values()) { + this.resourcelockMap = ImmutableMap.of(LeveledResource.class, getLeveledLocks(conf), FlatResource.class, + getFlatLocks(conf)); + } + + private Pair>, ResourceLockManager> getLeveledLocks( + ConfigurationSource conf) { + Map> stripedLockMap = new EnumMap<>(LeveledResource.class); + for (LeveledResource r : LeveledResource.values()) { stripedLockMap.put(r, createStripeLock(r, conf)); } - this.stripedLockByResource = Collections.unmodifiableMap(stripedLockMap); + return Pair.of(Collections.unmodifiableMap(stripedLockMap), new LeveledResourceLockManager()); } - private Striped createStripeLock(Resource r, + private Pair>, ResourceLockManager> getFlatLocks( ConfigurationSource conf) { + Map> stripedLockMap = new EnumMap<>(FlatResource.class); + for (FlatResource r : FlatResource.values()) { + stripedLockMap.put(r, createStripeLock(r, conf)); + } + return Pair.of(Collections.unmodifiableMap(stripedLockMap), new FlatResourceLockManager()); + } + + private Striped createStripeLock(Resource r, + ConfigurationSource conf) { boolean fair = conf.getBoolean(OZONE_MANAGER_FAIR_LOCK, OZONE_MANAGER_FAIR_LOCK_DEFAULT); String stripeSizeKey = OZONE_MANAGER_STRIPED_LOCK_SIZE_PREFIX + @@ -127,8 +140,9 @@ private Striped createStripeLock(Resource r, return SimpleStriped.readWriteLock(size, fair); } - private Iterable bulkGetLock(Resource resource, Collection keys) { - Striped striped = stripedLockByResource.get(resource); + private Iterable bulkGetLock(Map> lockMap, Resource resource, + Collection keys) { + Striped striped = lockMap.get(resource); List lockKeys = new ArrayList<>(keys.size()); for (String[] key : keys) { if (Objects.nonNull(key)) { @@ -138,8 +152,9 @@ private Iterable bulkGetLock(Resource resource, Collection striped = stripedLockByResource.get(resource); + private ReentrantReadWriteLock getLock(Map> lockMap, Resource resource, + String... keys) { + Striped striped = lockMap.get(resource); Object key = combineKeys(keys); return (ReentrantReadWriteLock) striped.get(key); } @@ -243,10 +258,12 @@ private void acquireLock(Resource resource, boolean isReadLock, ReadWriteLock lo } } - private OMLockDetails acquireLocks(Resource resource, boolean isReadLock, - Collection keys) { - omLockDetails.get().clear(); - if (!resource.canLock(lockSet.get())) { + private OMLockDetails acquireLocks(Resource resource, boolean isReadLock, Collection keys) { + Pair>, ResourceLockManager> resourceLockPair = + resourcelockMap.get(resource.getClass()); + ResourceLockManager resourceLockManager = resourceLockPair.getRight(); + resourceLockManager.clearLockDetails(); + if (!resourceLockManager.canLockResource(resource)) { String errorMessage = getErrorMessage(resource); LOG.error(errorMessage); throw new RuntimeException(errorMessage); @@ -254,19 +271,18 @@ private OMLockDetails acquireLocks(Resource resource, boolean isReadLock, long startWaitingTimeNanos = Time.monotonicNowNanos(); - for (ReadWriteLock lock : bulkGetLock(resource, keys)) { + for (ReadWriteLock lock : bulkGetLock(resourceLockPair.getKey(), resource, keys)) { acquireLock(resource, isReadLock, lock, startWaitingTimeNanos); } - - lockSet.set(resource.setLock(lockSet.get())); - omLockDetails.get().setLockAcquired(true); - return omLockDetails.get(); + return resourceLockManager.lockResource(resource); } - private OMLockDetails acquireLock(Resource resource, boolean isReadLock, - String... keys) { - omLockDetails.get().clear(); - if (!resource.canLock(lockSet.get())) { + private OMLockDetails acquireLock(Resource resource, boolean isReadLock, String... keys) { + Pair>, ResourceLockManager> resourceLockPair = + resourcelockMap.get(resource.getClass()); + ResourceLockManager resourceLockManager = resourceLockPair.getRight(); + resourceLockManager.clearLockDetails(); + if (!resourceLockManager.canLockResource(resource)) { String errorMessage = getErrorMessage(resource); LOG.error(errorMessage); throw new RuntimeException(errorMessage); @@ -274,16 +290,13 @@ private OMLockDetails acquireLock(Resource resource, boolean isReadLock, long startWaitingTimeNanos = Time.monotonicNowNanos(); - ReentrantReadWriteLock lock = getLock(resource, keys); + ReentrantReadWriteLock lock = getLock(resourceLockPair.getKey(), resource, keys); acquireLock(resource, isReadLock, lock, startWaitingTimeNanos); - - lockSet.set(resource.setLock(lockSet.get())); - omLockDetails.get().setLockAcquired(true); - return omLockDetails.get(); + return resourceLockManager.lockResource(resource); } private void updateReadLockMetrics(Resource resource, - ReentrantReadWriteLock lock, long startWaitingTimeNanos) { + ReentrantReadWriteLock lock, long startWaitingTimeNanos) { /* * readHoldCount helps in metrics updation only once in case @@ -296,14 +309,15 @@ private void updateReadLockMetrics(Resource resource, // Adds a snapshot to the metric readLockWaitingTimeMsStat. omLockMetrics.setReadLockWaitingTimeMsStat( TimeUnit.NANOSECONDS.toMillis(readLockWaitingTimeNanos)); - updateProcessingDetails(Timing.LOCKWAIT, readLockWaitingTimeNanos); + updateProcessingDetails(resourcelockMap.get(resource.getClass()).getValue(), + Timing.LOCKWAIT, readLockWaitingTimeNanos); - resource.setStartReadHeldTimeNanos(Time.monotonicNowNanos()); + resource.getResourceManager().setStartReadHeldTimeNanos(Time.monotonicNowNanos()); } } private void updateWriteLockMetrics(Resource resource, - ReentrantReadWriteLock lock, long startWaitingTimeNanos) { + ReentrantReadWriteLock lock, long startWaitingTimeNanos) { /* * writeHoldCount helps in metrics updation only once in case * of reentrant locks. Metrics are updated only if the write lock is held @@ -317,29 +331,25 @@ private void updateWriteLockMetrics(Resource resource, // Adds a snapshot to the metric writeLockWaitingTimeMsStat. omLockMetrics.setWriteLockWaitingTimeMsStat( TimeUnit.NANOSECONDS.toMillis(writeLockWaitingTimeNanos)); - updateProcessingDetails(Timing.LOCKWAIT, writeLockWaitingTimeNanos); + updateProcessingDetails(resourcelockMap.get(resource.getClass()).getValue(), Timing.LOCKWAIT, + writeLockWaitingTimeNanos); - resource.setStartWriteHeldTimeNanos(Time.monotonicNowNanos()); + resource.getResourceManager().setStartWriteHeldTimeNanos(Time.monotonicNowNanos()); } } private String getErrorMessage(Resource resource) { return "Thread '" + Thread.currentThread().getName() + "' cannot " + - "acquire " + resource.name + " lock while holding " + + "acquire " + resource.getName() + " lock while holding " + getCurrentLocks().toString() + " lock(s)."; - } @VisibleForTesting List getCurrentLocks() { - List currentLocks = new ArrayList<>(); - short lockSetVal = lockSet.get(); - for (Resource value : Resource.values()) { - if (value.isLevelLocked(lockSetVal)) { - currentLocks.add(value.getName()); - } - } - return currentLocks; + return resourcelockMap.values().stream().map(Pair::getValue) + .flatMap(i -> ((ResourceLockManager)i).getCurrentLockedResources()) + .map(Resource::getName) + .collect(Collectors.toList()); } /** @@ -347,29 +357,10 @@ List getCurrentLocks() { */ @Override public boolean acquireMultiUserLock(String firstUser, String secondUser) { - Resource resource = Resource.USER_LOCK; - - if (!resource.canLock(lockSet.get())) { - String errorMessage = getErrorMessage(resource); - LOG.error(errorMessage); - throw new RuntimeException(errorMessage); - } else { - Striped striped = - stripedLockByResource.get(Resource.USER_LOCK); - // The result of bulkGet is always sorted in a consistent order. - // This prevents deadlocks. - Iterable locks = - striped.bulkGet(Arrays.asList(firstUser, secondUser)); - for (ReadWriteLock lock : locks) { - lock.writeLock().lock(); - } - - lockSet.set(resource.setLock(lockSet.get())); - return true; - } + return acquireWriteLocks(LeveledResource.USER_LOCK, Arrays.asList(new String[] {firstUser}, + new String[] {secondUser})).isLockAcquired(); } - /** * Release lock on multiple users. * @param firstUser @@ -377,15 +368,8 @@ public boolean acquireMultiUserLock(String firstUser, String secondUser) { */ @Override public void releaseMultiUserLock(String firstUser, String secondUser) { - Striped striped = - stripedLockByResource.get(Resource.USER_LOCK); - Iterable locks = - striped.bulkGet(Arrays.asList(firstUser, secondUser)); - for (ReadWriteLock lock : locks) { - lock.writeLock().unlock(); - } - - lockSet.set(Resource.USER_LOCK.clearLock(lockSet.get())); + releaseWriteLocks(LeveledResource.USER_LOCK, Arrays.asList(new String[] {firstUser}, + new String[] {secondUser})); } @@ -442,9 +426,12 @@ public OMLockDetails releaseReadLocks(Resource resource, Collection ke } private OMLockDetails releaseLock(Resource resource, boolean isReadLock, - String... keys) { - omLockDetails.get().clear(); - ReentrantReadWriteLock lock = getLock(resource, keys); + String... keys) { + Pair>, ResourceLockManager> resourceLockPair = + resourcelockMap.get(resource.getClass()); + ResourceLockManager resourceLockManager = resourceLockPair.getRight(); + resourceLockManager.clearLockDetails(); + ReentrantReadWriteLock lock = getLock(resourceLockPair.getKey(), resource, keys); if (isReadLock) { lock.readLock().unlock(); updateReadUnlockMetrics(resource, lock); @@ -453,16 +440,18 @@ private OMLockDetails releaseLock(Resource resource, boolean isReadLock, lock.writeLock().unlock(); updateWriteUnlockMetrics(resource, lock, isWriteLocked); } - - lockSet.set(resource.clearLock(lockSet.get())); - return omLockDetails.get(); + return resourceLockManager.unlockResource(resource); } private OMLockDetails releaseLocks(Resource resource, boolean isReadLock, - Collection keys) { - omLockDetails.get().clear(); - List locks = - StreamSupport.stream(bulkGetLock(resource, keys).spliterator(), false).collect(Collectors.toList()); + Collection keys) { + Pair>, ResourceLockManager> resourceLockPair = + resourcelockMap.get(resource.getClass()); + ResourceLockManager resourceLockManager = resourceLockPair.getRight(); + resourceLockManager.clearLockDetails(); + List locks = StreamSupport.stream( + bulkGetLock(resourceLockPair.getKey(), resource, keys).spliterator(), false) + .collect(Collectors.toList()); // Release locks in reverse order. Collections.reverse(locks); for (ReadWriteLock lock : locks) { @@ -475,30 +464,29 @@ private OMLockDetails releaseLocks(Resource resource, boolean isReadLock, updateWriteUnlockMetrics(resource, (ReentrantReadWriteLock) lock, isWriteLocked); } } - - lockSet.set(resource.clearLock(lockSet.get())); - return omLockDetails.get(); + return resourceLockManager.unlockResource(resource); } private void updateReadUnlockMetrics(Resource resource, - ReentrantReadWriteLock lock) { + ReentrantReadWriteLock lock) { /* * readHoldCount helps in metrics updation only once in case * of reentrant locks. */ if (lock.getReadHoldCount() == 0) { long readLockHeldTimeNanos = - Time.monotonicNowNanos() - resource.getStartReadHeldTimeNanos(); + Time.monotonicNowNanos() - resource.getResourceManager().getStartReadHeldTimeNanos(); // Adds a snapshot to the metric readLockHeldTimeMsStat. omLockMetrics.setReadLockHeldTimeMsStat( TimeUnit.NANOSECONDS.toMillis(readLockHeldTimeNanos)); - updateProcessingDetails(Timing.LOCKSHARED, readLockHeldTimeNanos); + updateProcessingDetails(resourcelockMap.get(resource.getClass()).getValue(), Timing.LOCKSHARED, + readLockHeldTimeNanos); } } private void updateWriteUnlockMetrics(Resource resource, - ReentrantReadWriteLock lock, boolean isWriteLocked) { + ReentrantReadWriteLock lock, boolean isWriteLocked) { /* * writeHoldCount helps in metrics updation only once in case * of reentrant locks. Metrics are updated only if the write lock is held @@ -506,12 +494,13 @@ private void updateWriteUnlockMetrics(Resource resource, */ if ((lock.getWriteHoldCount() == 0) && isWriteLocked) { long writeLockHeldTimeNanos = - Time.monotonicNowNanos() - resource.getStartWriteHeldTimeNanos(); + Time.monotonicNowNanos() - resource.getResourceManager().getStartWriteHeldTimeNanos(); // Adds a snapshot to the metric writeLockHeldTimeMsStat. omLockMetrics.setWriteLockHeldTimeMsStat( TimeUnit.NANOSECONDS.toMillis(writeLockHeldTimeNanos)); - updateProcessingDetails(Timing.LOCKEXCLUSIVE, writeLockHeldTimeNanos); + updateProcessingDetails(resourcelockMap.get(resource.getClass()).getValue(), Timing.LOCKEXCLUSIVE, + writeLockHeldTimeNanos); } } @@ -523,7 +512,7 @@ private void updateWriteUnlockMetrics(Resource resource, @Override @VisibleForTesting public int getReadHoldCount(Resource resource, String... keys) { - return getLock(resource, keys).getReadHoldCount(); + return getLock(resourcelockMap.get(resource.getClass()).getKey(), resource, keys).getReadHoldCount(); } @@ -535,7 +524,7 @@ public int getReadHoldCount(Resource resource, String... keys) { @Override @VisibleForTesting public int getWriteHoldCount(Resource resource, String... keys) { - return getLock(resource, keys).getWriteHoldCount(); + return getLock(resourcelockMap.get(resource.getClass()).getKey(), resource, keys).getWriteHoldCount(); } /** @@ -548,8 +537,8 @@ public int getWriteHoldCount(Resource resource, String... keys) { @Override @VisibleForTesting public boolean isWriteLockedByCurrentThread(Resource resource, - String... keys) { - return getLock(resource, keys).isWriteLockedByCurrentThread(); + String... keys) { + return getLock(resourcelockMap.get(resource.getClass()).getKey(), resource, keys).isWriteLockedByCurrentThread(); } /** @@ -566,9 +555,120 @@ public OMLockMetrics getOMLockMetrics() { } /** - * Resource defined in Ozone. + * Flat Resource defined in Ozone. Locks can be acquired on a resource independent of one another. + */ + public enum FlatResource implements Resource { + SNAPSHOT_GC_LOCK("SNAPSHOT_GC_LOCK"); + + private String name; + private ResourceManager resourceManager; + + FlatResource(String name) { + this.name = name; + this.resourceManager = new ResourceManager(); + } + + @Override + public String getName() { + return name; + } + + @Override + public ResourceManager getResourceManager() { + return resourceManager; + } + } + + private abstract static class ResourceLockManager { + + private final ThreadLocal omLockDetails = ThreadLocal.withInitial(OMLockDetails::new); + + abstract boolean canLockResource(T resource); + + abstract Stream getCurrentLockedResources(); + + OMLockDetails clearLockDetails() { + omLockDetails.get().clear(); + return omLockDetails.get(); + } + + OMLockDetails unlockResource(T resource) { + return clearLockDetails(); + } + + OMLockDetails lockResource(T resource) { + omLockDetails.get().setLockAcquired(true); + return omLockDetails.get(); + } + } + + private static final class FlatResourceLockManager extends ResourceLockManager { + + private EnumMap> acquiredLocksMap = new EnumMap<>(FlatResource.class); + + private FlatResourceLockManager() { + for (FlatResource flatResource : FlatResource.values()) { + acquiredLocksMap.put(flatResource, ThreadLocal.withInitial(() -> Boolean.FALSE)); + } + } + + @Override + OMLockDetails lockResource(FlatResource resource) { + acquiredLocksMap.get(resource).set(Boolean.TRUE); + return super.lockResource(resource); + } + + @Override + OMLockDetails unlockResource(FlatResource resource) { + acquiredLocksMap.get(resource).set(Boolean.FALSE); + return super.unlockResource(resource); + } + + @Override + public boolean canLockResource(FlatResource resource) { + return true; + } + + @Override + Stream getCurrentLockedResources() { + return acquiredLocksMap.keySet().stream().filter(i -> acquiredLocksMap.get(i).get()); + } + } + + private static final class LeveledResourceLockManager extends ResourceLockManager { + private final ThreadLocal lockSet = ThreadLocal.withInitial(() -> Short.valueOf((short)0)); + + @Override + public boolean canLockResource(LeveledResource resource) { + return resource.canLock(lockSet.get()); + } + + @Override + Stream getCurrentLockedResources() { + short lockSetVal = lockSet.get(); + return Arrays.stream(LeveledResource.values()) + .filter(leveledResource -> leveledResource.isLevelLocked(lockSetVal)); + } + + @Override + public OMLockDetails unlockResource(LeveledResource resource) { + lockSet.set(resource.clearLock(lockSet.get())); + return super.unlockResource(resource); + } + + @Override + public OMLockDetails lockResource(LeveledResource resource) { + lockSet.set(resource.setLock(lockSet.get())); + return super.lockResource(resource); + } + } + + /** + * Leveled Resource defined in Ozone. + * Enforces lock acquisition ordering based on the resource level. A resource at lower level cannot be acquired + * after a higher level lock is already acquired. */ - public enum Resource { + public enum LeveledResource implements Resource { // For S3 Bucket need to allow only for S3, that should be means only 1. S3_BUCKET_LOCK((byte) 0, "S3_BUCKET_LOCK"), // = 1 @@ -586,8 +686,7 @@ public enum Resource { S3_SECRET_LOCK((byte) 4, "S3_SECRET_LOCK"), // 31 KEY_PATH_LOCK((byte) 5, "KEY_PATH_LOCK"), //63 PREFIX_LOCK((byte) 6, "PREFIX_LOCK"), //127 - SNAPSHOT_LOCK((byte) 7, "SNAPSHOT_LOCK"), // = 255 - SNAPSHOT_GC_LOCK("SNAPSHOT_GC_LOCK"); + SNAPSHOT_LOCK((byte) 7, "SNAPSHOT_LOCK"); // = 255 // level of the resource private byte lockLevel; @@ -602,76 +701,14 @@ public enum Resource { // Name of the resource. private String name; - // This helps in maintaining read lock related variables locally confined - // to a given thread. - private final ThreadLocal readLockTimeStampNanos = - ThreadLocal.withInitial(LockUsageInfo::new); - - // This helps in maintaining write lock related variables locally confined - // to a given thread. - private final ThreadLocal writeLockTimeStampNanos = - ThreadLocal.withInitial(LockUsageInfo::new); - - /** - * Sets the time (ns) when the read lock holding period begins specific to a - * thread. - * - * @param startReadHeldTimeNanos read lock held start time (ns) - */ - void setStartReadHeldTimeNanos(long startReadHeldTimeNanos) { - readLockTimeStampNanos.get() - .setStartReadHeldTimeNanos(startReadHeldTimeNanos); - } - - /** - * Sets the time (ns) when the write lock holding period begins specific to - * a thread. - * - * @param startWriteHeldTimeNanos write lock held start time (ns) - */ - void setStartWriteHeldTimeNanos(long startWriteHeldTimeNanos) { - writeLockTimeStampNanos.get() - .setStartWriteHeldTimeNanos(startWriteHeldTimeNanos); - } - - /** - * Returns the time (ns) when the read lock holding period began specific to - * a thread. - * - * @return read lock held start time (ns) - */ - long getStartReadHeldTimeNanos() { - long startReadHeldTimeNanos = - readLockTimeStampNanos.get().getStartReadHeldTimeNanos(); - readLockTimeStampNanos.remove(); - return startReadHeldTimeNanos; - } - - /** - * Returns the time (ns) when the write lock holding period began specific - * to a thread. - * - * @return write lock held start time (ns) - */ - long getStartWriteHeldTimeNanos() { - long startWriteHeldTimeNanos = - writeLockTimeStampNanos.get().getStartWriteHeldTimeNanos(); - writeLockTimeStampNanos.remove(); - return startWriteHeldTimeNanos; - } + private ResourceManager resourceManager; - Resource(byte pos, String name) { + LeveledResource(byte pos, String name) { this.lockLevel = pos; this.mask = (short) (Math.pow(2, lockLevel + 1) - 1); this.setMask = (short) Math.pow(2, lockLevel); this.name = name; - } - - Resource(String name) { - this.lockLevel = -1; - this.name = name; - this.mask = 0; - this.setMask = 0; + this.resourceManager = new ResourceManager(); } boolean canLock(short lockSetVal) { @@ -687,6 +724,7 @@ boolean canLock(short lockSetVal) { return false; } + // Our mask is the summation of bits of all previous possible locks. In // other words it is the largest possible value for that bit position. @@ -723,13 +761,17 @@ short clearLock(short lockSetVal) { * @param lockSetVal */ boolean isLevelLocked(short lockSetVal) { - return setMask != 0 && (lockSetVal & setMask) == setMask; + return (lockSetVal & setMask) == setMask; } - String getName() { + public String getName() { return name; } + public ResourceManager getResourceManager() { + return resourceManager; + } + short getMask() { return mask; } @@ -745,20 +787,21 @@ short getMask() { * @param type IPC Timing types * @param deltaNanos consumed time */ - private void updateProcessingDetails(Timing type, long deltaNanos) { + private void updateProcessingDetails(ResourceLockManager resourceLockManager, Timing type, + long deltaNanos) { Server.Call call = Server.getCurCall().get(); if (call != null) { call.getProcessingDetails().add(type, deltaNanos, TimeUnit.NANOSECONDS); } else { switch (type) { case LOCKWAIT: - omLockDetails.get().add(deltaNanos, OMLockDetails.LockOpType.WAIT); + resourceLockManager.omLockDetails.get().add(deltaNanos, OMLockDetails.LockOpType.WAIT); break; case LOCKSHARED: - omLockDetails.get().add(deltaNanos, OMLockDetails.LockOpType.READ); + resourceLockManager.omLockDetails.get().add(deltaNanos, OMLockDetails.LockOpType.READ); break; case LOCKEXCLUSIVE: - omLockDetails.get().add(deltaNanos, OMLockDetails.LockOpType.WRITE); + resourceLockManager.omLockDetails.get().add(deltaNanos, OMLockDetails.LockOpType.WRITE); break; default: LOG.error("Unsupported Timing type {}", type); diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLockUtil.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLockUtil.java index e0c89ef227d1..d4378f40766b 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLockUtil.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLockUtil.java @@ -39,17 +39,17 @@ private OzoneManagerLockUtil() { * @param resourceName */ public static String generateResourceLockName( - OzoneManagerLock.Resource resource, String resourceName) { + OzoneManagerLock.LeveledResource resource, String resourceName) { - if (resource == OzoneManagerLock.Resource.S3_BUCKET_LOCK) { + if (resource == OzoneManagerLock.LeveledResource.S3_BUCKET_LOCK) { return OM_S3_PREFIX + resourceName; - } else if (resource == OzoneManagerLock.Resource.VOLUME_LOCK) { + } else if (resource == OzoneManagerLock.LeveledResource.VOLUME_LOCK) { return OM_KEY_PREFIX + resourceName; - } else if (resource == OzoneManagerLock.Resource.USER_LOCK) { + } else if (resource == OzoneManagerLock.LeveledResource.USER_LOCK) { return OM_USER_PREFIX + resourceName; - } else if (resource == OzoneManagerLock.Resource.S3_SECRET_LOCK) { + } else if (resource == OzoneManagerLock.LeveledResource.S3_SECRET_LOCK) { return OM_S3_SECRET + resourceName; - } else if (resource == OzoneManagerLock.Resource.PREFIX_LOCK) { + } else if (resource == OzoneManagerLock.LeveledResource.PREFIX_LOCK) { return OM_PREFIX + resourceName; } else { // This is for developers who mistakenly call this method with resource diff --git a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestKeyPathLock.java b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestKeyPathLock.java index 6441454f8113..53fdc659883a 100644 --- a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestKeyPathLock.java +++ b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestKeyPathLock.java @@ -39,8 +39,8 @@ class TestKeyPathLock extends TestOzoneManagerLock { private static final Logger LOG = LoggerFactory.getLogger(TestKeyPathLock.class); - private final OzoneManagerLock.Resource resource = - OzoneManagerLock.Resource.KEY_PATH_LOCK; + private final OzoneManagerLock.LeveledResource resource = + OzoneManagerLock.LeveledResource.KEY_PATH_LOCK; @Test void testKeyPathLockMultiThreading() throws Exception { @@ -224,8 +224,8 @@ private void testDiffKeyPathWriteLockMultiThreadingUtil( @Test void testAcquireWriteBucketLockWhileAcquiredWriteKeyPathLock() { - OzoneManagerLock.Resource higherResource = - OzoneManagerLock.Resource.BUCKET_LOCK; + OzoneManagerLock.LeveledResource higherResource = + OzoneManagerLock.LeveledResource.BUCKET_LOCK; String volumeName = UUID.randomUUID().toString(); String bucketName = UUID.randomUUID().toString(); @@ -246,8 +246,8 @@ void testAcquireWriteBucketLockWhileAcquiredWriteKeyPathLock() { @Test void testAcquireWriteBucketLockWhileAcquiredReadKeyPathLock() { - OzoneManagerLock.Resource higherResource = - OzoneManagerLock.Resource.BUCKET_LOCK; + OzoneManagerLock.LeveledResource higherResource = + OzoneManagerLock.LeveledResource.BUCKET_LOCK; String volumeName = UUID.randomUUID().toString(); String bucketName = UUID.randomUUID().toString(); @@ -268,8 +268,8 @@ void testAcquireWriteBucketLockWhileAcquiredReadKeyPathLock() { @Test void testAcquireReadBucketLockWhileAcquiredReadKeyPathLock() { - OzoneManagerLock.Resource higherResource = - OzoneManagerLock.Resource.BUCKET_LOCK; + OzoneManagerLock.LeveledResource higherResource = + OzoneManagerLock.LeveledResource.BUCKET_LOCK; String volumeName = UUID.randomUUID().toString(); String bucketName = UUID.randomUUID().toString(); @@ -290,8 +290,8 @@ void testAcquireReadBucketLockWhileAcquiredReadKeyPathLock() { @Test void testAcquireReadBucketLockWhileAcquiredWriteKeyPathLock() { - OzoneManagerLock.Resource higherResource = - OzoneManagerLock.Resource.BUCKET_LOCK; + OzoneManagerLock.LeveledResource higherResource = + OzoneManagerLock.LeveledResource.BUCKET_LOCK; String volumeName = UUID.randomUUID().toString(); String bucketName = UUID.randomUUID().toString(); diff --git a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java index 3f1e7ca83c60..4772f156c521 100644 --- a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java +++ b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java @@ -30,10 +30,13 @@ import java.util.Stack; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.metrics2.MetricsRecord; import org.apache.hadoop.metrics2.impl.MetricsCollectorImpl; -import org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource; +import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock.Resource; +import org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource; +import org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; @@ -45,12 +48,12 @@ class TestOzoneManagerLock { @ParameterizedTest @EnumSource - void acquireResourceLock(Resource resource) { + void acquireResourceLock(LeveledResource resource) { String[] resourceName = generateResourceName(resource); testResourceLock(resourceName, resource); } - private void testResourceLock(String[] resourceName, Resource resource) { + private void testResourceLock(String[] resourceName, LeveledResource resource) { OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); lock.acquireWriteLock(resource, resourceName); assertDoesNotThrow(() -> lock.releaseWriteLock(resource, resourceName)); @@ -58,19 +61,19 @@ private void testResourceLock(String[] resourceName, Resource resource) { @ParameterizedTest @EnumSource - void reacquireResourceLock(Resource resource) { + void reacquireResourceLock(LeveledResource resource) { String[] resourceName = generateResourceName(resource); testResourceReacquireLock(resourceName, resource); } private void testResourceReacquireLock(String[] resourceName, - Resource resource) { + LeveledResource resource) { OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); // Lock re-acquire not allowed by same thread. - if (resource == Resource.USER_LOCK || - resource == Resource.S3_SECRET_LOCK || - resource == Resource.PREFIX_LOCK) { + if (resource == LeveledResource.USER_LOCK || + resource == LeveledResource.S3_SECRET_LOCK || + resource == LeveledResource.PREFIX_LOCK) { lock.acquireWriteLock(resource, resourceName); RuntimeException ex = assertThrows(RuntimeException.class, () -> lock.acquireWriteLock(resource, resourceName)); @@ -94,12 +97,12 @@ void testLockingOrder() { // What this test does is iterate all resources. For each resource // acquire lock, and then in inner loop acquire all locks with higher // lock level, finally release the locks. - for (Resource resource : Resource.values()) { + for (LeveledResource resource : LeveledResource.values()) { Stack stack = new Stack<>(); resourceName = generateResourceName(resource); lock.acquireWriteLock(resource, resourceName); stack.push(new ResourceInfo(resourceName, resource)); - for (Resource higherResource : Resource.values()) { + for (LeveledResource higherResource : LeveledResource.values()) { if (higherResource.getMask() > resource.getMask()) { resourceName = generateResourceName(higherResource); lock.acquireWriteLock(higherResource, resourceName); @@ -117,9 +120,29 @@ void testLockingOrder() { @ParameterizedTest @EnumSource - void testLockViolationsWithOneHigherLevelLock(Resource resource) { + public void testFlatLockWithParallelResource(FlatResource flatResource) { OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); - for (Resource higherResource : Resource.values()) { + List resources = new ArrayList<>(); + resources.addAll(Arrays.stream(LeveledResource.values()).collect(Collectors.toList())); + resources.addAll(Arrays.stream(FlatResource.values()).collect(Collectors.toList())); + for (Resource otherResource : resources) { + String[] otherResourceName = generateResourceName(otherResource); + String[] flatResourceName = generateResourceName(flatResource); + lock.acquireWriteLock(otherResource, otherResourceName); + try { + lock.acquireWriteLock(flatResource, flatResourceName); + } finally { + lock.releaseWriteLock(otherResource, otherResourceName); + lock.releaseWriteLock(flatResource, flatResourceName); + } + } + } + + @ParameterizedTest + @EnumSource + void testLockViolationsWithOneHigherLevelLock(LeveledResource resource) { + OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); + for (LeveledResource higherResource : LeveledResource.values()) { if (higherResource.getMask() > resource.getMask()) { String[] resourceName = generateResourceName(higherResource); lock.acquireWriteLock(higherResource, resourceName); @@ -144,10 +167,10 @@ void testLockViolations() { // What this test does is iterate all resources. For each resource // acquire an higher level lock above the resource, and then take the the // lock. This should fail. Like that it tries all error combinations. - for (Resource resource : Resource.values()) { + for (LeveledResource resource : LeveledResource.values()) { Stack stack = new Stack<>(); List currentLocks = new ArrayList<>(); - for (Resource higherResource : Resource.values()) { + for (LeveledResource higherResource : LeveledResource.values()) { if (higherResource.getMask() > resource.getMask()) { resourceName = generateResourceName(higherResource); lock.acquireWriteLock(higherResource, resourceName); @@ -178,15 +201,15 @@ void releaseLockWithOutAcquiringLock() { OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); assertThrows(IllegalMonitorStateException.class, - () -> lock.releaseWriteLock(Resource.USER_LOCK, "user3")); + () -> lock.releaseWriteLock(LeveledResource.USER_LOCK, "user3")); } private String[] generateResourceName(Resource resource) { - if (resource == Resource.BUCKET_LOCK) { + if (resource == LeveledResource.BUCKET_LOCK) { return new String[]{UUID.randomUUID().toString(), UUID.randomUUID().toString()}; - } else if ((resource == Resource.KEY_PATH_LOCK) || - (resource == Resource.SNAPSHOT_LOCK)) { + } else if ((resource == LeveledResource.KEY_PATH_LOCK) || + (resource == LeveledResource.SNAPSHOT_LOCK)) { return new String[]{UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString()}; } else { @@ -199,9 +222,9 @@ private String[] generateResourceName(Resource resource) { */ private static class ResourceInfo { private final String[] lockName; - private final Resource resource; + private final LeveledResource resource; - ResourceInfo(String[] resourceName, Resource resource) { + ResourceInfo(String[] resourceName, LeveledResource resource) { this.lockName = resourceName; this.resource = resource; } @@ -210,7 +233,7 @@ public String[] getLockName() { return lockName.clone(); } - public Resource getResource() { + public LeveledResource getResource() { return resource; } } @@ -236,12 +259,12 @@ void reAcquireMultiUserLock() { @Test void acquireMultiUserLockAfterUserLock() { OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); - lock.acquireWriteLock(Resource.USER_LOCK, "user3"); + lock.acquireWriteLock(LeveledResource.USER_LOCK, "user3"); Exception e = assertThrows(RuntimeException.class, () -> lock.acquireMultiUserLock("user1", "user2")); assertThat(e) .hasMessageContaining("cannot acquire USER_LOCK lock while holding [USER_LOCK] lock(s)."); - lock.releaseWriteLock(Resource.USER_LOCK, "user3"); + lock.releaseWriteLock(LeveledResource.USER_LOCK, "user3"); } @Test @@ -249,7 +272,7 @@ void acquireUserLockAfterMultiUserLock() { OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); lock.acquireMultiUserLock("user1", "user2"); Exception e = assertThrows(RuntimeException.class, - () -> lock.acquireWriteLock(Resource.USER_LOCK, "user3")); + () -> lock.acquireWriteLock(LeveledResource.USER_LOCK, "user3")); assertThat(e) .hasMessageContaining("cannot acquire USER_LOCK lock while holding [USER_LOCK] lock(s)."); lock.releaseMultiUserLock("user1", "user2"); @@ -259,8 +282,8 @@ void acquireUserLockAfterMultiUserLock() { void testLockResourceParallel() throws Exception { OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); - for (Resource resource : - Resource.values()) { + for (LeveledResource resource : + LeveledResource.values()) { final String[] resourceName = generateResourceName(resource); lock.acquireWriteLock(resource, resourceName); @@ -289,7 +312,7 @@ void testLockResourceParallel() throws Exception { void testMultiLocksResourceParallel() throws Exception { OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); - for (Resource resource : Resource.values()) { + for (LeveledResource resource : LeveledResource.values()) { final List resourceName = Arrays.asList(generateResourceName(resource), generateResourceName(resource), generateResourceName(resource)); lock.acquireWriteLocks(resource, resourceName.subList(1, resourceName.size())); @@ -344,12 +367,12 @@ void testMultiLockResourceParallel() throws Exception { // USER_LOCK, S3_SECRET_LOCK and PREFIX_LOCK disallow lock re-acquire by // the same thread. names = { "PREFIX_LOCK", "S3_SECRET_LOCK", "USER_LOCK" }) - void testLockHoldCount(Resource resource) { + void testLockHoldCount(LeveledResource resource) { String[] resourceName = generateResourceName(resource); testLockHoldCountUtil(resource, resourceName); } - private void testLockHoldCountUtil(Resource resource, + private void testLockHoldCountUtil(LeveledResource resource, String[] resourceName) { OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); @@ -387,16 +410,16 @@ private void testLockHoldCountUtil(Resource resource, @ParameterizedTest @EnumSource - void testLockConcurrentStats(Resource resource) throws InterruptedException { + void testLockConcurrentStats(LeveledResource resource) throws InterruptedException { String[] resourceName = generateResourceName(resource); testReadLockConcurrentStats(resource, resourceName, 10); testWriteLockConcurrentStats(resource, resourceName, 5); testSyntheticReadWriteLockConcurrentStats(resource, resourceName, 10, 3); } - private void testReadLockConcurrentStats(Resource resource, - String[] resourceName, - int threadCount) + private void testReadLockConcurrentStats(LeveledResource resource, + String[] resourceName, + int threadCount) throws InterruptedException { OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); Thread[] threads = new Thread[threadCount]; @@ -426,9 +449,9 @@ private void testReadLockConcurrentStats(Resource resource, assertThat(readWaitingStat).contains("Samples = " + threadCount); } - private void testWriteLockConcurrentStats(Resource resource, - String[] resourceName, - int threadCount) + private void testWriteLockConcurrentStats(LeveledResource resource, + String[] resourceName, + int threadCount) throws InterruptedException { OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); Thread[] threads = new Thread[threadCount]; @@ -459,7 +482,7 @@ private void testWriteLockConcurrentStats(Resource resource, } private void testSyntheticReadWriteLockConcurrentStats( - Resource resource, String[] resourceName, + LeveledResource resource, String[] resourceName, int readThreadCount, int writeThreadCount) throws InterruptedException { OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java index 1f13a6cd1900..d6775b0495a9 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java @@ -19,7 +19,7 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.BUCKET_NOT_FOUND; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.INTERNAL_ERROR; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; 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 909ee5a277dd..6a493c1f3161 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 @@ -74,7 +74,7 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.SCM_GET_PIPELINE_EXCEPTION; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.VOLUME_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.ozone.security.acl.OzoneObj.ResourceType.KEY; import static org.apache.hadoop.ozone.util.MetricUtil.captureLatencyNs; import static org.apache.hadoop.util.Time.monotonicNow; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ListIterator.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ListIterator.java index 3d0e2b71db48..426e7b73ec4f 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ListIterator.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ListIterator.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import java.io.Closeable; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java index 410d3ce36492..526145d169ec 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java @@ -90,8 +90,8 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_SUPPORTED_OPERATION; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.PERMISSION_DENIED; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.TOKEN_ERROR_OTHER; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import static org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer.RaftServerStatus.LEADER_AND_READY; import static org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServer.getRaftGroupIdFromOmServiceId; import static org.apache.hadoop.ozone.om.s3.S3SecretStoreConfigurationKeys.DEFAULT_SECRET_STORAGE_TYPE; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/PrefixManagerImpl.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/PrefixManagerImpl.java index 50c1574ecb20..f6615b92f2d3 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/PrefixManagerImpl.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/PrefixManagerImpl.java @@ -23,7 +23,7 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.INVALID_PATH_IN_ACL_REQUEST; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.PREFIX_NOT_FOUND; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.VOLUME_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.PREFIX_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.PREFIX_LOCK; import static org.apache.hadoop.ozone.security.acl.OzoneObj.ResourceType.PREFIX; import com.google.common.annotations.VisibleForTesting; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java index f761f31db6a2..56bfc45c1ee2 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java @@ -19,7 +19,7 @@ import static org.apache.hadoop.ozone.om.OMConfigKeys.SNAPSHOT_SST_DELETING_LIMIT_PER_TASK; import static org.apache.hadoop.ozone.om.OMConfigKeys.SNAPSHOT_SST_DELETING_LIMIT_PER_TASK_DEFAULT; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.SNAPSHOT_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.snapshot.SnapshotUtils.getColumnFamilyToKeyPrefixMap; import com.google.common.annotations.VisibleForTesting; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/VolumeManagerImpl.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/VolumeManagerImpl.java index 7ad8ccf3a035..0f1be7855788 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/VolumeManagerImpl.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/VolumeManagerImpl.java @@ -18,8 +18,8 @@ package org.apache.hadoop.ozone.om; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.USER_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.USER_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/lock/OBSKeyPathLockStrategy.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/lock/OBSKeyPathLockStrategy.java index a5e9d78f4013..c715856db80f 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/lock/OBSKeyPathLockStrategy.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/lock/OBSKeyPathLockStrategy.java @@ -17,8 +17,8 @@ package org.apache.hadoop.ozone.om.lock; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.KEY_PATH_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.KEY_PATH_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/lock/RegularBucketLockStrategy.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/lock/RegularBucketLockStrategy.java index ad09a000949b..76071a408b4a 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/lock/RegularBucketLockStrategy.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/lock/RegularBucketLockStrategy.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.lock; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import java.io.IOException; import org.apache.hadoop.ozone.om.OMMetadataManager; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java index 09d7c20e4572..a89cdf5eb450 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketCreateRequest.java @@ -21,8 +21,8 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.BUCKET_ALREADY_EXISTS; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.VOLUME_NOT_FOUND; import static org.apache.hadoop.ozone.om.helpers.OzoneAclUtil.getDefaultAclList; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import java.io.IOException; import java.nio.file.InvalidPathException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java index bdc1b0455c48..4d802f9078e1 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketDeleteRequest.java @@ -19,8 +19,8 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.BUCKET_NOT_FOUND; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.CONTAINS_SNAPSHOT; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import java.io.IOException; import java.nio.file.InvalidPathException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetOwnerRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetOwnerRequest.java index a2bc5df9982e..e60d5019ff41 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetOwnerRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetOwnerRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.bucket; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java index ee65009e95ff..8ae403c3e8fe 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/OMBucketSetPropertyRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.bucket; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java index 609f5390c0cb..565c6e4854d8 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.bucket.acl; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import java.io.IOException; import java.nio.file.InvalidPathException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java index 9c8d7c2dc9bf..a877374cdbe0 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequest.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.request.file; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_ALREADY_EXISTS; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.DIRECTORY_EXISTS_IN_GIVENPATH; import static org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.FILE_EXISTS; import static org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.FILE_EXISTS_IN_GIVENPATH; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequestWithFSO.java index eca6554c5040..5adcfec9617c 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMDirectoryCreateRequestWithFSO.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.request.file; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_ALREADY_EXISTS; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.DIRECTORY_EXISTS_IN_GIVENPATH; import static org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.FILE_EXISTS; import static org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.FILE_EXISTS_IN_GIVENPATH; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java index f8747ac07dd3..f7f38474fda1 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.file; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.DIRECTORY_EXISTS; import static org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.FILE_EXISTS; import static org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.FILE_EXISTS_IN_GIVENPATH; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequestWithFSO.java index 3f5b16ec3634..d04c9f421e47 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequestWithFSO.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.file; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import java.io.IOException; import java.nio.file.InvalidPathException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java index a818a3ac89f0..303999257142 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java @@ -24,7 +24,7 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_ALREADY_CLOSED; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_UNDER_LEASE_SOFT_LIMIT_PERIOD; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.HBASE_SUPPORT; import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type.RecoverLease; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java index a6938073983f..7c5660b93806 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java @@ -19,7 +19,7 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_UNDER_LEASE_RECOVERY; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequestWithFSO.java index 5d0db0477c0a..799983cbe441 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequestWithFSO.java @@ -19,7 +19,7 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_UNDER_LEASE_RECOVERY; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import com.google.common.base.Preconditions; import jakarta.annotation.Nonnull; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java index f1d52b443a62..5593097361ea 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java @@ -19,7 +19,7 @@ import static org.apache.hadoop.hdds.HddsUtils.fromProtobuf; import static org.apache.hadoop.ozone.OzoneConsts.DELETED_HSYNC_KEY; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.ozone.om.snapshot.SnapshotUtils.validatePreviousSnapshotId; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java index 09d010856b32..b5fad1ade600 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java @@ -22,7 +22,7 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_UNDER_LEASE_RECOVERY; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_A_FILE; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_SUPPORTED_OPERATION; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequestWithFSO.java index 674cb04dc280..9ac2fab25b0d 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequestWithFSO.java @@ -20,7 +20,7 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_ALREADY_CLOSED; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_UNDER_LEASE_RECOVERY; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import com.google.common.annotations.VisibleForTesting; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequestWithFSO.java index 3672899163b2..ca794fea03ee 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequestWithFSO.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.request.key; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_A_FILE; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.DIRECTORY_EXISTS; import static org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.FILE_EXISTS_IN_GIVENPATH; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java index cf3b675f345c..228142febb6a 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java @@ -19,7 +19,7 @@ import static org.apache.hadoop.ozone.OzoneConsts.DELETED_HSYNC_KEY; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.ozone.util.MetricUtil.captureLatencyNs; import com.google.common.base.Preconditions; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequestWithFSO.java index 9415248fcab1..1fc3ec615f43 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequestWithFSO.java @@ -20,7 +20,7 @@ import static org.apache.hadoop.ozone.OzoneConsts.DELETED_HSYNC_KEY; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.DIRECTORY_NOT_EMPTY; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.ozone.util.MetricUtil.captureLatencyNs; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java index 3af8c7420be5..ae10fb932c8b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequest.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.request.key; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequestWithFSO.java index cbab201b55e6..8163b902dbb5 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRenameRequestWithFSO.java @@ -20,7 +20,7 @@ import static org.apache.hadoop.ozone.OmUtils.normalizeKey; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.RENAME_OPEN_FILE; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import java.io.IOException; import java.nio.file.InvalidPathException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java index 3242f0f436ad..133af085dfe0 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java @@ -28,7 +28,7 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.INVALID_REQUEST; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.VOLUME_NOT_FOUND; import static org.apache.hadoop.ozone.om.helpers.OzoneAclUtil.getDefaultAclList; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.util.Time.monotonicNow; import com.google.common.base.Preconditions; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java index 4322e543fae3..353a17757025 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.key; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import java.io.IOException; import java.nio.file.InvalidPathException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequestWithFSO.java index bdff04bfa93b..009bcd1662c1 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeySetTimesRequestWithFSO.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.request.key; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import java.io.IOException; import java.nio.file.InvalidPathException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java index 71f209bc32e5..3d79df51bb82 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java @@ -26,7 +26,7 @@ import static org.apache.hadoop.ozone.OzoneConsts.UNDELETED_KEYS_LIST; import static org.apache.hadoop.ozone.OzoneConsts.VOLUME; import static org.apache.hadoop.ozone.audit.OMAction.DELETE_KEYS; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status.OK; import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status.PARTIAL_DELETE; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java index 34c2bf3a7754..ef4d64b27c9b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysRenameRequest.java @@ -19,7 +19,7 @@ import static org.apache.hadoop.ozone.OzoneConsts.RENAMED_KEYS_MAP; import static org.apache.hadoop.ozone.OzoneConsts.UNRENAMED_KEYS_MAP; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status.OK; import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status.PARTIAL_RENAME; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMOpenKeysDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMOpenKeysDeleteRequest.java index b98ef28d385a..88430e660694 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMOpenKeysDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMOpenKeysDeleteRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.key; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import java.io.IOException; import java.nio.file.InvalidPathException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAclRequest.java index b72ace2a9dda..67a7f8a626b7 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAclRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.key.acl; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import java.io.IOException; import java.nio.file.InvalidPathException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAclRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAclRequestWithFSO.java index 6089d3201399..f32a22b17329 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAclRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/OMKeyAclRequestWithFSO.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.request.key.acl; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import java.io.IOException; import java.nio.file.InvalidPathException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAclRequest.java index d638cebd658c..5e1f3513564a 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAclRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.key.acl.prefix; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.PREFIX_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.PREFIX_LOCK; import java.io.IOException; import java.nio.file.InvalidPathException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3ExpiredMultipartUploadsAbortRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3ExpiredMultipartUploadsAbortRequest.java index 643cab1f1be1..5f7d01d9a733 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3ExpiredMultipartUploadsAbortRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3ExpiredMultipartUploadsAbortRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.s3.multipart; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import java.io.IOException; import java.util.ArrayList; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java index 519ed3024cbd..ac27d0e0a173 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.s3.multipart; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequestWithFSO.java index 3dcbcc969435..7e781635603b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3InitiateMultipartUploadRequestWithFSO.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.s3.multipart; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import static org.apache.hadoop.ozone.om.request.file.OMFileRequest.OMDirectoryResult.DIRECTORY_EXISTS; import com.google.common.base.Preconditions; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java index fbff13045902..1e64edfb5be3 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadAbortRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.s3.multipart; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import java.io.IOException; import java.nio.file.InvalidPathException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java index 91e4b2030912..845f4adc8386 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.request.s3.multipart; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import com.google.common.annotations.VisibleForTesting; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java index 4355dc13b2a5..133efc38c8da 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.request.s3.multipart; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_A_FILE; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import jakarta.annotation.Nullable; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequest.java index 19667bd0a252..12c4ce13de5c 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequest.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.request.s3.tagging; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequestWithFSO.java index 73dc1ae44af8..b40e6c1f8a42 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3DeleteObjectTaggingRequestWithFSO.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.s3.tagging; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import java.io.IOException; import java.util.Map; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequest.java index 71eb58c152cb..23d7a40f26de 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequest.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.request.s3.tagging; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequestWithFSO.java index 6a1855e6867a..05a45322c599 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tagging/S3PutObjectTaggingRequestWithFSO.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.s3.tagging; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; import java.io.IOException; import java.util.Map; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignAdminRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignAdminRequest.java index a2f8209b644d..08979e4e8090 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignAdminRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignAdminRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.s3.tenant; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.MULTITENANCY_SCHEMA; import com.google.common.base.Preconditions; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignUserAccessIdRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignUserAccessIdRequest.java index 1b2d9257369d..bb2c1a187856 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignUserAccessIdRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantAssignUserAccessIdRequest.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.request.s3.tenant; import static org.apache.hadoop.ozone.OzoneConsts.OZONE_MAXIMUM_ACCESS_ID_LENGTH; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.MULTITENANCY_SCHEMA; import com.google.common.base.Preconditions; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java index a32bd36190fd..3732f074bb0c 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java @@ -20,8 +20,8 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.TENANT_ALREADY_EXISTS; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.USER_NOT_FOUND; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.VOLUME_ALREADY_EXISTS; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.USER_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.USER_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.MULTITENANCY_SCHEMA; import com.google.common.base.Preconditions; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantDeleteRequest.java index 6b80cfda23f2..d469fe56627f 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantDeleteRequest.java @@ -19,7 +19,7 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.TENANT_NOT_EMPTY; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.TENANT_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.MULTITENANCY_SCHEMA; import com.google.common.base.Preconditions; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeAdminRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeAdminRequest.java index 73d9ea8e49ac..469eed85e8bc 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeAdminRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeAdminRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.s3.tenant; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.MULTITENANCY_SCHEMA; import com.google.common.base.Preconditions; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeUserAccessIdRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeUserAccessIdRequest.java index 50fdc1e109f1..2458c8656256 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeUserAccessIdRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantRevokeUserAccessIdRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.s3.tenant; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.MULTITENANCY_SCHEMA; import com.google.common.base.Preconditions; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java index 8efa517a750b..57c4bb129bd7 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java @@ -20,8 +20,8 @@ import static org.apache.hadoop.hdds.HddsUtils.fromProtobuf; import static org.apache.hadoop.hdds.HddsUtils.toProtobuf; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_ALREADY_EXISTS; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.SNAPSHOT_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.FILESYSTEM_SNAPSHOT; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java index 85b19a89fe3a..3f8bae61c530 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java @@ -18,8 +18,8 @@ package org.apache.hadoop.ozone.om.request.snapshot; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.SNAPSHOT_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.FILESYSTEM_SNAPSHOT; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java index 060e1d6ec828..5a25d8594723 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java @@ -19,8 +19,8 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_ALREADY_EXISTS; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.SNAPSHOT_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.FILESYSTEM_SNAPSHOT; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMQuotaRepairRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMQuotaRepairRequest.java index aef5953e2f87..819edf6c01f5 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMQuotaRepairRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMQuotaRepairRequest.java @@ -19,8 +19,8 @@ import static org.apache.hadoop.ozone.OzoneConsts.OLD_QUOTA_DEFAULT; import static org.apache.hadoop.ozone.OzoneConsts.QUOTA_RESET; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java index 43afb3f73594..4f05b5d266cb 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java @@ -18,8 +18,8 @@ package org.apache.hadoop.ozone.om.request.volume; import static org.apache.hadoop.ozone.om.helpers.OzoneAclUtil.getDefaultAclList; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.USER_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.USER_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeDeleteRequest.java index 630ec784ce92..943a5ea5700c 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeDeleteRequest.java @@ -17,8 +17,8 @@ package org.apache.hadoop.ozone.om.request.volume; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.USER_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.USER_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java index d4a15f0d299a..f9a6fa303590 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetOwnerRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.volume; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java index 721cdd673d1f..b4279eac2d4d 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeSetQuotaRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.volume; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import com.google.common.base.Preconditions; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java index 32a362e32d3f..88d786cdd204 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java @@ -17,7 +17,7 @@ package org.apache.hadoop.ozone.om.request.volume.acl; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.VOLUME_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.VOLUME_LOCK; import java.io.IOException; import java.nio.file.InvalidPathException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java index 5dec1a826357..5a530ee11880 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.response.snapshot; import static org.apache.hadoop.ozone.om.codec.OMDBDefinition.SNAPSHOT_INFO_TABLE; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.SNAPSHOT_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.SNAPSHOT_LOCK; import com.google.common.annotations.VisibleForTesting; import jakarta.annotation.Nonnull; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/MultiSnapshotLocks.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/MultiSnapshotLocks.java index aac3b097b22e..525877306965 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/MultiSnapshotLocks.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/MultiSnapshotLocks.java @@ -26,8 +26,8 @@ import java.util.stream.Collectors; import org.apache.hadoop.ozone.om.exceptions.OMException; import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; +import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock.Resource; import org.apache.hadoop.ozone.om.lock.OMLockDetails; -import org.apache.hadoop.ozone.om.lock.OzoneManagerLock; /** * Class to take multiple locks on multiple snapshots. @@ -35,11 +35,11 @@ public class MultiSnapshotLocks { private final List objectLocks; private final IOzoneManagerLock lock; - private final OzoneManagerLock.Resource resource; + private final Resource resource; private final boolean writeLock; private OMLockDetails lockDetails; - public MultiSnapshotLocks(IOzoneManagerLock lock, OzoneManagerLock.Resource resource, boolean writeLock) { + public MultiSnapshotLocks(IOzoneManagerLock lock, Resource resource, boolean writeLock) { this.writeLock = writeLock; this.resource = resource; this.lock = lock; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableFilter.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableFilter.java index ec8cd0d1100e..1f97fe10d806 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableFilter.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableFilter.java @@ -17,6 +17,8 @@ package org.apache.hadoop.ozone.om.snapshot.filter; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_GC_LOCK; + import java.io.Closeable; import java.io.IOException; import java.util.ArrayList; @@ -34,7 +36,6 @@ import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; -import org.apache.hadoop.ozone.om.lock.OzoneManagerLock; import org.apache.hadoop.ozone.om.snapshot.MultiSnapshotLocks; import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.snapshot.SnapshotUtils; @@ -88,7 +89,7 @@ public ReclaimableFilter( this.omSnapshotManager = omSnapshotManager; this.currentSnapshotInfo = currentSnapshotInfo; this.snapshotChainManager = snapshotChainManager; - this.snapshotIdLocks = new MultiSnapshotLocks(lock, OzoneManagerLock.Resource.SNAPSHOT_GC_LOCK, false); + this.snapshotIdLocks = new MultiSnapshotLocks(lock, SNAPSHOT_GC_LOCK, false); this.keyManager = keyManager; this.numberOfPreviousSnapshotsFromChain = numberOfPreviousSnapshotsFromChain; this.previousOmSnapshots = new ArrayList<>(numberOfPreviousSnapshotsFromChain); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestMultiSnapshotLocks.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestMultiSnapshotLocks.java index 3955f8f6a8eb..9c358a9261b3 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestMultiSnapshotLocks.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestMultiSnapshotLocks.java @@ -54,7 +54,7 @@ public class TestMultiSnapshotLocks { private IOzoneManagerLock mockLock; @Mock - private OzoneManagerLock.Resource mockResource; + private OzoneManagerLock.LeveledResource mockResource; private MultiSnapshotLocks multiSnapshotLocks; private UUID obj1 = UUID.randomUUID(); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/AbstractReclaimableFilterTest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/AbstractReclaimableFilterTest.java index 1aeafc5c5a6f..4f133868f949 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/AbstractReclaimableFilterTest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/AbstractReclaimableFilterTest.java @@ -19,6 +19,7 @@ import static org.apache.hadoop.hdds.HddsConfigKeys.OZONE_METADATA_DIRS; import static org.apache.hadoop.ozone.OzoneConsts.TRANSACTION_INFO_KEY; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_GC_LOCK; import static org.mockito.Mockito.CALLS_REAL_METHODS; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyList; @@ -58,7 +59,6 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; import org.apache.hadoop.ozone.om.lock.OMLockDetails; -import org.apache.hadoop.ozone.om.lock.OzoneManagerLock; import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.snapshot.SnapshotCache; import org.apache.hadoop.ozone.om.snapshot.SnapshotDiffManager; @@ -125,14 +125,14 @@ protected SnapshotInfo setup( this.snapshotChainManager = mock(SnapshotChainManager.class); this.keyManager = mock(KeyManager.class); IOzoneManagerLock ozoneManagerLock = mock(IOzoneManagerLock.class); - when(ozoneManagerLock.acquireReadLocks(eq(OzoneManagerLock.Resource.SNAPSHOT_GC_LOCK), anyList())) + when(ozoneManagerLock.acquireReadLocks(eq(SNAPSHOT_GC_LOCK), anyList())) .thenAnswer(i -> { lockIds.set( (List) i.getArgument(1, List.class).stream().map(val -> UUID.fromString(((String[]) val)[0])) .collect(Collectors.toList())); return OMLockDetails.EMPTY_DETAILS_LOCK_ACQUIRED; }); - when(ozoneManagerLock.releaseReadLocks(eq(OzoneManagerLock.Resource.SNAPSHOT_GC_LOCK), anyList())) + when(ozoneManagerLock.releaseReadLocks(eq(SNAPSHOT_GC_LOCK), anyList())) .thenAnswer(i -> { Assertions.assertEquals(lockIds.get(), i.getArgument(1, List.class).stream().map(val -> UUID.fromString(((String[]) val)[0])) From 588dab3de4801c0e24c93aa0b8877ad1d1e73ff7 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Fri, 16 May 2025 13:44:25 -0400 Subject: [PATCH 05/17] HDDS-13031. Fix pmd Change-Id: I2b6ea2084bbb0320bf35608002faccf52b466b66 --- .../java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java index cdaed9e383e3..2815b397f2f1 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java @@ -764,10 +764,12 @@ boolean isLevelLocked(short lockSetVal) { return (lockSetVal & setMask) == setMask; } + @Override public String getName() { return name; } + @Override public ResourceManager getResourceManager() { return resourceManager; } From 2cad0f11785d6ca27398fa5187930bb8ea73dc8f Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Fri, 16 May 2025 17:27:27 -0400 Subject: [PATCH 06/17] HDDS-13031. Fix lock details code Change-Id: I8a11ed9a9cccb70b0cc05b295c0e5289fc859215 --- .../ozone/om/lock/OzoneManagerLock.java | 37 ++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java index 2815b397f2f1..849082136e68 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java @@ -357,8 +357,26 @@ List getCurrentLocks() { */ @Override public boolean acquireMultiUserLock(String firstUser, String secondUser) { - return acquireWriteLocks(LeveledResource.USER_LOCK, Arrays.asList(new String[] {firstUser}, - new String[] {secondUser})).isLockAcquired(); + LeveledResource resource = LeveledResource.USER_LOCK; + Pair>, ResourceLockManager> resourceLockPair = + resourcelockMap.get(resource.getClass()); + ResourceLockManager resourceLockManager = resourceLockPair.getRight(); + if (!resourceLockManager.canLockResource(resource)) { + String errorMessage = getErrorMessage(resource); + LOG.error(errorMessage); + throw new RuntimeException(errorMessage); + } else { + Striped striped = resourceLockPair.getKey().get(resource); + // The result of bulkGet is always sorted in a consistent order. + // This prevents deadlocks. + Iterable locks = + striped.bulkGet(Arrays.asList(firstUser, secondUser)); + for (ReadWriteLock lock : locks) { + lock.writeLock().lock(); + } + resourceLockManager.lockResource(resource); + return true; + } } /** @@ -368,8 +386,17 @@ public boolean acquireMultiUserLock(String firstUser, String secondUser) { */ @Override public void releaseMultiUserLock(String firstUser, String secondUser) { - releaseWriteLocks(LeveledResource.USER_LOCK, Arrays.asList(new String[] {firstUser}, - new String[] {secondUser})); + LeveledResource resource = LeveledResource.USER_LOCK; + Pair>, ResourceLockManager> resourceLockPair = + resourcelockMap.get(resource.getClass()); + ResourceLockManager resourceLockManager = resourceLockPair.getRight(); + Striped striped = resourceLockPair.getKey().get(resource); + Iterable locks = + striped.bulkGet(Arrays.asList(firstUser, secondUser)); + for (ReadWriteLock lock : locks) { + lock.writeLock().unlock(); + } + resourceLockManager.unlockResource(resource); } @@ -593,7 +620,7 @@ OMLockDetails clearLockDetails() { } OMLockDetails unlockResource(T resource) { - return clearLockDetails(); + return omLockDetails.get(); } OMLockDetails lockResource(T resource) { From 6cb112341fafea8000da102ff75d0156f424ed72 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Sat, 17 May 2025 01:21:36 -0400 Subject: [PATCH 07/17] HDDS-13065. Refactor SnapshotCache to return AutoCloseSupplier instead of ReferenceCounted Change-Id: Id2004bf073158466ef853c99fdd76fb2e141dcf8 --- .../hadoop/ozone/freon/TestOMSnapshotDAG.java | 8 ++-- .../TestSnapshotBackgroundServices.java | 5 +- ...napshotDeletingServiceIntegrationTest.java | 13 +++-- .../ozone/om/OmMetadataManagerImpl.java | 4 +- .../hadoop/ozone/om/OmSnapshotManager.java | 16 +++---- .../apache/hadoop/ozone/om/OzoneManager.java | 48 +++++++++++-------- .../hadoop/ozone/om/SstFilteringService.java | 4 +- .../ozone/om/request/OMClientRequest.java | 6 +-- .../OMDirectoriesPurgeResponseWithFSO.java | 4 +- .../om/response/key/OMKeyPurgeResponse.java | 4 +- .../OMSnapshotMoveDeletedKeysResponse.java | 8 ++-- .../OMSnapshotMoveTableKeysResponse.java | 6 +-- .../om/service/DirectoryDeletingService.java | 4 +- .../ozone/om/service/KeyDeletingService.java | 8 ++-- .../om/service/SnapshotDeletingService.java | 4 +- .../SnapshotDirectoryCleaningService.java | 8 ++-- .../ozone/om/snapshot/ReferenceCounted.java | 12 +---- .../ozone/om/snapshot/SnapshotCache.java | 19 +++++++- .../om/snapshot/SnapshotDiffManager.java | 5 +- .../snapshot/filter/ReclaimableDirFilter.java | 4 +- .../om/snapshot/filter/ReclaimableFilter.java | 10 ++-- .../snapshot/filter/ReclaimableKeyFilter.java | 6 +-- .../filter/ReclaimableRenameEntryFilter.java | 4 +- ...tOMDirectoriesPurgeRequestAndResponse.java | 4 +- .../key/TestOMKeyPurgeRequestAndResponse.java | 4 +- .../om/request/key/TestOMKeyRequest.java | 6 +-- .../s3/multipart/TestS3MultipartRequest.java | 6 +-- .../TestOMSnapshotMoveTableKeysResponse.java | 8 ++-- .../om/service/TestKeyDeletingService.java | 4 +- .../ozone/om/snapshot/TestSnapshotCache.java | 41 ++++++++-------- .../om/snapshot/TestSnapshotDiffManager.java | 13 ++--- .../om/snapshot/TestSstFilteringService.java | 3 +- .../filter/AbstractReclaimableFilterTest.java | 6 +-- .../filter/TestReclaimableDirFilter.java | 6 +-- .../filter/TestReclaimableFilter.java | 4 +- .../filter/TestReclaimableKeyFilter.java | 8 ++-- .../TestReclaimableRenameEntryFilter.java | 6 +-- 37 files changed, 177 insertions(+), 152 deletions(-) diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOMSnapshotDAG.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOMSnapshotDAG.java index 332dab4fb4a1..4a2c030526c9 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOMSnapshotDAG.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/freon/TestOMSnapshotDAG.java @@ -57,12 +57,12 @@ import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.ozone.rocksdiff.DifferSnapshotInfo; import org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer; import org.apache.ozone.test.GenericTestUtils; import org.apache.ratis.server.RaftServer; import org.apache.ratis.server.raftlog.RaftLog; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -212,9 +212,9 @@ public void testDAGReconstruction() OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager(); RDBStore rdbStore = (RDBStore) omMetadataManager.getStore(); RocksDBCheckpointDiffer differ = rdbStore.getRocksDBCheckpointDiffer(); - ReferenceCounted snapDB1 = ozoneManager.getOmSnapshotManager() + UncheckedAutoCloseableSupplier snapDB1 = ozoneManager.getOmSnapshotManager() .getActiveSnapshot(volumeName, bucketName, "snap1"); - ReferenceCounted snapDB2 = ozoneManager.getOmSnapshotManager() + UncheckedAutoCloseableSupplier snapDB2 = ozoneManager.getOmSnapshotManager() .getActiveSnapshot(volumeName, bucketName, "snap2"); DifferSnapshotInfo snap1 = getDifferSnapshotInfo(omMetadataManager, volumeName, bucketName, "snap1", @@ -240,7 +240,7 @@ public void testDAGReconstruction() resp = store.createSnapshot(volumeName, bucketName, "snap3"); LOG.debug("Snapshot created: {}", resp); - ReferenceCounted snapDB3 = ozoneManager.getOmSnapshotManager() + UncheckedAutoCloseableSupplier snapDB3 = ozoneManager.getOmSnapshotManager() .getActiveSnapshot(volumeName, bucketName, "snap3"); DifferSnapshotInfo snap3 = getDifferSnapshotInfo(omMetadataManager, volumeName, bucketName, "snap3", diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotBackgroundServices.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotBackgroundServices.java index 0983ff06a3f1..1f12697d6695 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotBackgroundServices.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotBackgroundServices.java @@ -79,6 +79,7 @@ import org.apache.ozone.test.LambdaTestUtils; import org.apache.ozone.test.tag.Flaky; import org.apache.ratis.server.protocol.TermIndex; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -260,7 +261,7 @@ public void testSnapshotAndKeyDeletionBackgroundServices() // get snapshot c OmSnapshot snapC; - try (ReferenceCounted rcC = newLeaderOM + try (UncheckedAutoCloseableSupplier rcC = newLeaderOM .getOmSnapshotManager() .getSnapshot(volumeName, bucketName, snapshotInfoC.getName())) { assertNotNull(rcC); @@ -284,7 +285,7 @@ public void testSnapshotAndKeyDeletionBackgroundServices() // get snapshot d OmSnapshot snapD; - try (ReferenceCounted rcD = newLeaderOM + try (UncheckedAutoCloseableSupplier rcD = newLeaderOM .getOmSnapshotManager() .getSnapshot(volumeName, bucketName, snapshotInfoD.getName())) { assertNotNull(rcD); diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDeletingServiceIntegrationTest.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDeletingServiceIntegrationTest.java index dddfd9717749..7e8befa6a176 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDeletingServiceIntegrationTest.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDeletingServiceIntegrationTest.java @@ -78,6 +78,7 @@ import org.apache.hadoop.ozone.om.service.SnapshotDeletingService; import org.apache.ozone.test.GenericTestUtils; import org.apache.ozone.test.tag.Flaky; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; @@ -421,7 +422,7 @@ public void testSnapshotWithFSO() throws Exception { assertTableRowCount(renamedTable, 4); assertTableRowCount(deletedDirTable, 3); - ReferenceCounted rcSnap1 = + UncheckedAutoCloseableSupplier rcSnap1 = om.getOmSnapshotManager().getSnapshot( VOLUME_NAME, BUCKET_NAME_FSO, "snap1"); OmSnapshot snap1 = rcSnap1.get(); @@ -613,8 +614,9 @@ public void testParallelExcecutionOfKeyDeletionAndSnapshotDeletion() throws Exce List> renamesKeyEntries; List>> deletedKeyEntries; List> deletedDirEntries; - try (ReferenceCounted snapshot = om.getOmSnapshotManager().getSnapshot(testBucket.getVolumeName(), - testBucket.getName(), testBucket.getName() + "snap2")) { + try (UncheckedAutoCloseableSupplier snapshot = + om.getOmSnapshotManager().getSnapshot(testBucket.getVolumeName(), testBucket.getName(), + testBucket.getName() + "snap2")) { renamesKeyEntries = snapshot.get().getKeyManager().getRenamesKeyEntries(testBucket.getVolumeName(), testBucket.getName(), "", 1000); deletedKeyEntries = snapshot.get().getKeyManager().getDeletedKeyEntries(testBucket.getVolumeName(), @@ -649,8 +651,9 @@ public void testParallelExcecutionOfKeyDeletionAndSnapshotDeletion() throws Exce Future future = snapshotDeletingThread.submit(snapshotDeletionRunnable); GenericTestUtils.waitFor(snapshotDeletionStarted::get, 1000, 30000); future.get(); - try (ReferenceCounted snapshot = om.getOmSnapshotManager().getSnapshot(testBucket.getVolumeName(), - testBucket.getName(), testBucket.getName() + "snap2")) { + try (UncheckedAutoCloseableSupplier snapshot = + om.getOmSnapshotManager().getSnapshot(testBucket.getVolumeName(), testBucket.getName(), + testBucket.getName() + "snap2")) { Assertions.assertEquals(Collections.emptyList(), snapshot.get().getKeyManager().getRenamesKeyEntries(testBucket.getVolumeName(), testBucket.getName(), "", 1000)); 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 7a4b6ecdb2e3..173f18313c93 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 @@ -113,7 +113,6 @@ import org.apache.hadoop.ozone.om.protocolPB.OzoneManagerProtocolClientSideTranslatorPB; import org.apache.hadoop.ozone.om.request.file.OMFileRequest; import org.apache.hadoop.ozone.om.request.util.OMMultipartUploadUtils; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.snapshot.SnapshotUtils; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ExpiredMultipartUploadInfo; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.ExpiredMultipartUploadsBucket; @@ -124,6 +123,7 @@ import org.apache.hadoop.util.Time; import org.apache.ozone.compaction.log.CompactionLogEntry; import org.apache.ratis.util.ExitUtils; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.eclipse.jetty.util.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -1351,7 +1351,7 @@ public PendingKeysDeletion getPendingDeletionKeys(final int keyCount, continue; } // Get the latest snapshot in snapshot path. - try (ReferenceCounted rcLatestSnapshot = previousSnapshotInfo == null ? null : + try (UncheckedAutoCloseableSupplier rcLatestSnapshot = previousSnapshotInfo == null ? null : omSnapshotManager.getSnapshot(previousSnapshotInfo.getVolumeName(), previousSnapshotInfo.getBucketName(), previousSnapshotInfo.getName())) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java index 7b6b9bab4f59..e6f893ee7210 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java @@ -92,7 +92,6 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotDiffJob; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.service.SnapshotDiffCleanupService; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.snapshot.SnapshotCache; import org.apache.hadoop.ozone.om.snapshot.SnapshotDiffManager; import org.apache.hadoop.ozone.om.snapshot.SnapshotUtils; @@ -102,6 +101,7 @@ import org.apache.hadoop.ozone.snapshot.SnapshotDiffResponse; import org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer; import org.apache.ratis.util.function.CheckedFunction; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.rocksdb.ColumnFamilyDescriptor; import org.rocksdb.ColumnFamilyHandle; import org.rocksdb.RocksDBException; @@ -604,7 +604,7 @@ private static void deleteKeysFromDelKeyTableInSnapshotScope( // Get OmSnapshot if the keyName has ".snapshot" key indicator @SuppressWarnings("unchecked") - public ReferenceCounted getActiveFsMetadataOrSnapshot( + public UncheckedAutoCloseableSupplier getActiveFsMetadataOrSnapshot( String volumeName, String bucketName, String keyName) throws IOException { @@ -622,28 +622,28 @@ public ReferenceCounted getActiveFsMetadataOrSnapshot( bucketName), false, false); volumeName = resolvedBucket.realVolume(); bucketName = resolvedBucket.realBucket(); - return (ReferenceCounted) (ReferenceCounted) + return (UncheckedAutoCloseableSupplier) (UncheckedAutoCloseableSupplier) getActiveSnapshot(volumeName, bucketName, snapshotName); } else { return ozoneManager.getOmMetadataReader(); } } - public ReferenceCounted getActiveSnapshot( + public UncheckedAutoCloseableSupplier getActiveSnapshot( String volumeName, String bucketName, String snapshotName) throws IOException { return getSnapshot(volumeName, bucketName, snapshotName, false); } - public ReferenceCounted getSnapshot( + public UncheckedAutoCloseableSupplier getSnapshot( String volumeName, String bucketName, String snapshotName) throws IOException { return getSnapshot(volumeName, bucketName, snapshotName, true); } - private ReferenceCounted getSnapshot( + private UncheckedAutoCloseableSupplier getSnapshot( String volumeName, String bucketName, String snapshotName, @@ -659,7 +659,7 @@ private ReferenceCounted getSnapshot( return getSnapshot(snapshotTableKey, skipActiveCheck); } - private ReferenceCounted getSnapshot(String snapshotTableKey, boolean skipActiveCheck) + private UncheckedAutoCloseableSupplier getSnapshot(String snapshotTableKey, boolean skipActiveCheck) throws IOException { SnapshotInfo snapshotInfo = SnapshotUtils.getSnapshotInfo(ozoneManager, snapshotTableKey); // Block FS API reads when snapshot is not active. @@ -710,7 +710,7 @@ public static boolean areSnapshotChangesFlushedToDB(OMMetadataManager metadataMa * This should only be used for API calls initiated by background service e.g. purgeKeys, purgeSnapshot, * snapshotMoveDeletedKeys, and SetSnapshotProperty. */ - public ReferenceCounted getSnapshot(UUID snapshotId) throws IOException { + public UncheckedAutoCloseableSupplier getSnapshot(UUID snapshotId) throws IOException { return snapshotCache.get(snapshotId); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java index 410d3ce36492..6c94d9e17e5a 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java @@ -283,7 +283,6 @@ import org.apache.hadoop.ozone.om.service.OMRangerBGSyncService; import org.apache.hadoop.ozone.om.service.QuotaRepairTask; import org.apache.hadoop.ozone.om.snapshot.OmSnapshotUtils; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature; import org.apache.hadoop.ozone.om.upgrade.OMLayoutVersionManager; import org.apache.hadoop.ozone.om.upgrade.OMUpgradeFinalizer; @@ -339,6 +338,7 @@ import org.apache.ratis.util.ExitUtils; import org.apache.ratis.util.FileUtils; import org.apache.ratis.util.LifeCycle; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -490,9 +490,9 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl private IAccessAuthorizer accessAuthorizer; // This metadata reader points to the active filesystem private OmMetadataReader omMetadataReader; - // Wrap active DB metadata reader in ReferenceCounted once to avoid + // Wrap active DB metadata reader in UncheckedAutoCloseableSupplier once to avoid // instance creation every single time. - private ReferenceCounted rcOmMetadataReader; + private UncheckedAutoCloseableSupplier rcOmMetadataReader; private OmSnapshotManager omSnapshotManager; @SuppressWarnings("methodlength") @@ -963,7 +963,17 @@ private void instantiateServices(boolean withNewSnapshot) throws IOException { this, LOG, AUDIT, metrics, accessAuthorizer); // Active DB's OmMetadataReader instance does not need to be reference // counted, but it still needs to be wrapped to be consistent. - rcOmMetadataReader = new ReferenceCounted<>(omMetadataReader, true, null); + rcOmMetadataReader = new UncheckedAutoCloseableSupplier() { + @Override + public IOmMetadataReader get() { + return omMetadataReader; + } + + @Override + public void close() { + + } + }; // Reload snapshot feature config flag fsSnapshotEnabled = configuration.getBoolean( @@ -2714,7 +2724,7 @@ public boolean getAllowListAllVolumes() { return allowListAllVolumes; } - public ReferenceCounted getOmMetadataReader() { + public UncheckedAutoCloseableSupplier getOmMetadataReader() { return rcOmMetadataReader; } @@ -2984,7 +2994,7 @@ public OmBucketInfo getBucketInfo(String volume, String bucket) */ @Override public OmKeyInfo lookupKey(OmKeyArgs args) throws IOException { - try (ReferenceCounted rcReader = getReader(args)) { + try (UncheckedAutoCloseableSupplier rcReader = getReader(args)) { return rcReader.get().lookupKey(args); } } @@ -2996,7 +3006,7 @@ public OmKeyInfo lookupKey(OmKeyArgs args) throws IOException { public KeyInfoWithVolumeContext getKeyInfo(final OmKeyArgs args, boolean assumeS3Context) throws IOException { - try (ReferenceCounted rcReader = getReader(args)) { + try (UncheckedAutoCloseableSupplier rcReader = getReader(args)) { return rcReader.get().getKeyInfo(args, assumeS3Context); } } @@ -3008,7 +3018,7 @@ public KeyInfoWithVolumeContext getKeyInfo(final OmKeyArgs args, public ListKeysResult listKeys(String volumeName, String bucketName, String startKey, String keyPrefix, int maxKeys) throws IOException { - try (ReferenceCounted rcReader = + try (UncheckedAutoCloseableSupplier rcReader = getReader(volumeName, bucketName, keyPrefix)) { return rcReader.get().listKeys( volumeName, bucketName, startKey, keyPrefix, maxKeys); @@ -3841,7 +3851,7 @@ public OmMultipartUploadList listMultipartUploads(String volumeName, */ @Override public OzoneFileStatus getFileStatus(OmKeyArgs args) throws IOException { - try (ReferenceCounted rcReader = + try (UncheckedAutoCloseableSupplier rcReader = getReader(args)) { return rcReader.get().getFileStatus(args); } @@ -3852,7 +3862,7 @@ public OzoneFileStatus getFileStatus(OmKeyArgs args) throws IOException { */ @Override public OmKeyInfo lookupFile(OmKeyArgs args) throws IOException { - try (ReferenceCounted rcReader = + try (UncheckedAutoCloseableSupplier rcReader = getReader(args)) { return rcReader.get().lookupFile(args); } @@ -3872,7 +3882,7 @@ public List listStatus(OmKeyArgs args, boolean recursive, public List listStatus(OmKeyArgs args, boolean recursive, String startKey, long numEntries, boolean allowPartialPrefixes) throws IOException { - try (ReferenceCounted rcReader = + try (UncheckedAutoCloseableSupplier rcReader = getReader(args)) { return rcReader.get().listStatus( args, recursive, startKey, numEntries, allowPartialPrefixes); @@ -3896,7 +3906,7 @@ public List listStatusLight(OmKeyArgs args, */ @Override public List getAcl(OzoneObj obj) throws IOException { - try (ReferenceCounted rcReader = + try (UncheckedAutoCloseableSupplier rcReader = getReader(obj)) { return rcReader.get().getAcl(obj); } @@ -4860,7 +4870,7 @@ public void startQuotaRepair(List buckets) throws IOException { @Override public Map getObjectTagging(final OmKeyArgs args) throws IOException { - try (ReferenceCounted rcReader = getReader(args)) { + try (UncheckedAutoCloseableSupplier rcReader = getReader(args)) { return rcReader.get().getObjectTagging(args); } } @@ -4947,9 +4957,9 @@ public static HddsProtos.OzoneManagerDetailsProto getOmDetailsProto( * Caller is responsible of closing the return value. * Using try-with-resources is recommended. * @param keyArgs OmKeyArgs - * @return ReferenceCounted + * @return UncheckedAutoCloseableSupplier */ - private ReferenceCounted getReader(OmKeyArgs keyArgs) + private UncheckedAutoCloseableSupplier getReader(OmKeyArgs keyArgs) throws IOException { return omSnapshotManager.getActiveFsMetadataOrSnapshot( keyArgs.getVolumeName(), keyArgs.getBucketName(), keyArgs.getKeyName()); @@ -4962,9 +4972,9 @@ private ReferenceCounted getReader(OmKeyArgs keyArgs) * @param volumeName volume name * @param bucketName bucket name * @param key key path - * @return ReferenceCounted + * @return UncheckedAutoCloseableSupplier */ - private ReferenceCounted getReader( + private UncheckedAutoCloseableSupplier getReader( String volumeName, String bucketName, String key) throws IOException { return omSnapshotManager.getActiveFsMetadataOrSnapshot( volumeName, bucketName, key); @@ -4975,9 +4985,9 @@ private ReferenceCounted getReader( * Caller is responsible of closing the return value. * Using try-with-resources is recommended. * @param ozoneObj OzoneObj - * @return ReferenceCounted + * @return UncheckedAutoCloseableSupplier */ - private ReferenceCounted getReader(OzoneObj ozoneObj) + private UncheckedAutoCloseableSupplier getReader(OzoneObj ozoneObj) throws IOException { return omSnapshotManager.getActiveFsMetadataOrSnapshot( ozoneObj.getVolumeName(), diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java index f761f31db6a2..e16ec3fded01 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java @@ -46,7 +46,7 @@ import org.apache.hadoop.ozone.om.exceptions.OMException; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.lock.OMLockDetails; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -190,7 +190,7 @@ public BackgroundTaskResult call() throws Exception { snapshotInfo.getBucketName()); try ( - ReferenceCounted snapshotMetadataReader = + UncheckedAutoCloseableSupplier snapshotMetadataReader = snapshotManager.get().getActiveSnapshot( snapshotInfo.getVolumeName(), snapshotInfo.getBucketName(), diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java index 592e375ae229..fa18c919eb33 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java @@ -49,7 +49,6 @@ import org.apache.hadoop.ozone.om.protocolPB.grpc.GrpcClientConstants; import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerRatisUtils; import org.apache.hadoop.ozone.om.response.OMClientResponse; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.LayoutVersion; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; @@ -60,6 +59,7 @@ import org.apache.hadoop.ozone.security.acl.RequestContext; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.authentication.client.AuthenticationException; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -300,7 +300,7 @@ protected void checkACLsWithFSO(OzoneManager ozoneManager, String volumeName, contextBuilder.setOwnerName(bucketOwner); } - try (ReferenceCounted rcMetadataReader = + try (UncheckedAutoCloseableSupplier rcMetadataReader = ozoneManager.getOmMetadataReader()) { OmMetadataReader omMetadataReader = (OmMetadataReader) rcMetadataReader.get(); @@ -366,7 +366,7 @@ public void checkAcls(OzoneManager ozoneManager, String bucketOwner) throws IOException { - try (ReferenceCounted rcMetadataReader = + try (UncheckedAutoCloseableSupplier rcMetadataReader = ozoneManager.getOmMetadataReader()) { OzoneAclUtils.checkAllAcls((OmMetadataReader) rcMetadataReader.get(), resType, storeType, aclType, diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java index d932603b6297..721ce8401c7e 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java @@ -42,9 +42,9 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.request.key.OMDirectoriesPurgeRequestWithFSO; import org.apache.hadoop.ozone.om.response.CleanupTableInfo; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -86,7 +86,7 @@ public void addToDBBatch(OMMetadataManager metadataManager, ((OmMetadataManagerImpl) metadataManager) .getOzoneManager().getOmSnapshotManager(); - try (ReferenceCounted + try (UncheckedAutoCloseableSupplier rcFromSnapshotInfo = omSnapshotManager.getSnapshot(fromSnapshotInfo.getSnapshotId())) { OmSnapshot fromSnapshot = rcFromSnapshotInfo.get(); DBStore fromSnapshotStore = fromSnapshot.getMetadataManager() diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyPurgeResponse.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyPurgeResponse.java index 39584f169228..7a1aebe6a4f5 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyPurgeResponse.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMKeyPurgeResponse.java @@ -34,10 +34,10 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.request.key.OMKeyPurgeRequest; import org.apache.hadoop.ozone.om.response.CleanupTableInfo; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyInfo; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.SnapshotMoveKeyInfos; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; /** * Response for {@link OMKeyPurgeRequest} request. @@ -75,7 +75,7 @@ public void addToDBBatch(OMMetadataManager omMetadataManager, OmSnapshotManager omSnapshotManager = ((OmMetadataManagerImpl) omMetadataManager).getOzoneManager().getOmSnapshotManager(); - try (ReferenceCounted rcOmFromSnapshot = + try (UncheckedAutoCloseableSupplier rcOmFromSnapshot = omSnapshotManager.getSnapshot(fromSnapshot.getSnapshotId())) { OmSnapshot fromOmSnapshot = rcOmFromSnapshot.get(); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotMoveDeletedKeysResponse.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotMoveDeletedKeysResponse.java index 1cf45b17e76e..6cc39d7ecd45 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotMoveDeletedKeysResponse.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotMoveDeletedKeysResponse.java @@ -35,10 +35,10 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.response.CleanupTableInfo; import org.apache.hadoop.ozone.om.response.OMClientResponse; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyInfo; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.SnapshotMoveKeyInfos; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; /** * Response for OMSnapshotMoveDeletedKeysRequest. @@ -89,13 +89,13 @@ protected void addToDBBatch(OMMetadataManager omMetadataManager, ((OmMetadataManagerImpl) omMetadataManager) .getOzoneManager().getOmSnapshotManager(); - try (ReferenceCounted rcOmFromSnapshot = - omSnapshotManager.getSnapshot(fromSnapshot.getSnapshotId())) { + try (UncheckedAutoCloseableSupplier rcOmFromSnapshot = + omSnapshotManager.getSnapshot(fromSnapshot.getSnapshotId())) { OmSnapshot fromOmSnapshot = rcOmFromSnapshot.get(); if (nextSnapshot != null) { - try (ReferenceCounted + try (UncheckedAutoCloseableSupplier rcOmNextSnapshot = omSnapshotManager.getSnapshot(nextSnapshot.getSnapshotId())) { OmSnapshot nextOmSnapshot = rcOmNextSnapshot.get(); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotMoveTableKeysResponse.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotMoveTableKeysResponse.java index d1b09bbeb6ce..2b00556d6376 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotMoveTableKeysResponse.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotMoveTableKeysResponse.java @@ -35,9 +35,9 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.response.CleanupTableInfo; import org.apache.hadoop.ozone.om.response.OMClientResponse; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.SnapshotMoveKeyInfos; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; /** * Response for OMSnapshotMoveDeletedKeysRequest. @@ -78,13 +78,13 @@ protected void addToDBBatch(OMMetadataManager omMetadataManager, BatchOperation OmSnapshotManager omSnapshotManager = ((OmMetadataManagerImpl) omMetadataManager) .getOzoneManager().getOmSnapshotManager(); - try (ReferenceCounted rcOmFromSnapshot = + try (UncheckedAutoCloseableSupplier rcOmFromSnapshot = omSnapshotManager.getSnapshot(fromSnapshot.getSnapshotId())) { OmSnapshot fromOmSnapshot = rcOmFromSnapshot.get(); if (nextSnapshot != null) { - try (ReferenceCounted + try (UncheckedAutoCloseableSupplier rcOmNextSnapshot = omSnapshotManager.getSnapshot(nextSnapshot.getSnapshotId())) { OmSnapshot nextOmSnapshot = rcOmNextSnapshot.get(); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java index 3790bb286b50..7451032492ea 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java @@ -45,10 +45,10 @@ import org.apache.hadoop.ozone.om.helpers.OmDirectoryInfo; import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.snapshot.SnapshotUtils; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.PurgePathRequest; import org.apache.hadoop.util.Time; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -301,7 +301,7 @@ private boolean previousSnapshotHasDir( previousSnapshotInfo)) { return true; } - try (ReferenceCounted rcLatestSnapshot = + try (UncheckedAutoCloseableSupplier rcLatestSnapshot = omSnapshotManager.getSnapshot( deletedDirInfo.getVolumeName(), deletedDirInfo.getBucketName(), diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java index 98d5a2f93c3c..fc108437f8b9 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java @@ -61,13 +61,13 @@ import org.apache.hadoop.ozone.om.helpers.RepeatedOmKeyInfo; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerRatisUtils; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.snapshot.SnapshotUtils; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.SetSnapshotPropertyRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.SnapshotSize; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; import org.apache.ratis.protocol.ClientId; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -285,7 +285,7 @@ private void processSnapshotDeepClean(int delCount) continue; } - try (ReferenceCounted + try (UncheckedAutoCloseableSupplier rcCurrOmSnapshot = omSnapshotManager.getSnapshot( currSnapInfo.getVolumeName(), currSnapInfo.getBucketName(), @@ -324,7 +324,7 @@ private void processSnapshotDeepClean(int delCount) Table previousKeyTable = null; Table prevRenamedTable = null; - ReferenceCounted rcPrevOmSnapshot = null; + UncheckedAutoCloseableSupplier rcPrevOmSnapshot = null; // Split RepeatedOmKeyInfo and update current snapshot // deletedKeyTable and next snapshot deletedKeyTable. @@ -342,7 +342,7 @@ private void processSnapshotDeepClean(int delCount) } Table previousToPrevKeyTable = null; - ReferenceCounted rcPrevToPrevOmSnapshot = null; + UncheckedAutoCloseableSupplier rcPrevToPrevOmSnapshot = null; if (previousToPrevSnapshot != null) { rcPrevToPrevOmSnapshot = omSnapshotManager.getSnapshot( previousToPrevSnapshot.getVolumeName(), diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java index a570a452c224..4c2151baaffd 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java @@ -53,7 +53,6 @@ import org.apache.hadoop.ozone.om.SnapshotChainManager; import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.snapshot.SnapshotUtils; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.SnapshotMoveKeyInfos; @@ -62,6 +61,7 @@ import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; import org.apache.ratis.protocol.ClientId; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -186,7 +186,7 @@ public BackgroundTaskResult call() throws InterruptedException { LOG.info("Snapshot: {} entries will be moved to next active snapshot: {}", snapInfo.getTableKey(), nextSnapshot.getTableKey()); } - try (ReferenceCounted snapshot = omSnapshotManager.getSnapshot( + try (UncheckedAutoCloseableSupplier snapshot = omSnapshotManager.getSnapshot( snapInfo.getVolumeName(), snapInfo.getBucketName(), snapInfo.getName())) { KeyManager snapshotKeyManager = snapshot.get().getKeyManager(); int moveCount = 0; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDirectoryCleaningService.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDirectoryCleaningService.java index bb985da55979..4c80d1600f77 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDirectoryCleaningService.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDirectoryCleaningService.java @@ -55,12 +55,12 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerRatisUtils; import org.apache.hadoop.ozone.om.request.file.OMFileRequest; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.SetSnapshotPropertyRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.SnapshotSize; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; import org.apache.ratis.protocol.ClientId; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; /** * Snapshot BG Service for deleted directory deep clean and exclusive size @@ -152,8 +152,8 @@ public BackgroundTaskResult call() { continue; } - ReferenceCounted rcPrevOmSnapshot = null; - ReferenceCounted rcPrevToPrevOmSnapshot = null; + UncheckedAutoCloseableSupplier rcPrevOmSnapshot = null; + UncheckedAutoCloseableSupplier rcPrevToPrevOmSnapshot = null; try { long volumeId = metadataManager .getVolumeId(currSnapInfo.getVolumeName()); @@ -208,7 +208,7 @@ public BackgroundTaskResult call() { String dbBucketKeyForDir = metadataManager.getBucketKeyPrefixFSO( currSnapInfo.getVolumeName(), currSnapInfo.getBucketName()); - try (ReferenceCounted + try (UncheckedAutoCloseableSupplier rcCurrOmSnapshot = omSnapshotManager.getActiveSnapshot( currSnapInfo.getVolumeName(), currSnapInfo.getBucketName(), diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/ReferenceCounted.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/ReferenceCounted.java index 2f85f6d21b4c..6937b5b4e148 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/ReferenceCounted.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/ReferenceCounted.java @@ -24,8 +24,7 @@ /** * Add reference counter to an object instance. */ -public class ReferenceCounted - implements AutoCloseable { +class ReferenceCounted { /** * Object that is being reference counted. e.g. OmSnapshot @@ -52,7 +51,7 @@ public class ReferenceCounted */ private final ReferenceCountedCallback parentWithCallback; - public ReferenceCounted(T obj, boolean disableCounter, + ReferenceCounted(T obj, boolean disableCounter, ReferenceCountedCallback parentWithCallback) { // A param to allow disabling ref counting to reduce active DB // access penalties due to AtomicLong operations. @@ -153,11 +152,4 @@ public long getCurrentThreadRefCount() { long tid = Thread.currentThread().getId(); return threadMap.getOrDefault(tid, 0L); } - - @Override - public void close() { - // Decrease ref count by 1 when close() is called on this object - // so it is eligible to be used with try-with-resources. - decrementRefCount(); - } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java index d2b64296dc60..6db09e4375c0 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java @@ -30,6 +30,7 @@ import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.OmSnapshot; import org.apache.hadoop.ozone.om.exceptions.OMException; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -141,7 +142,7 @@ public enum Reason { * @param key SnapshotId * @return an OmSnapshot instance, or null on error */ - public ReferenceCounted get(UUID key) throws IOException { + public UncheckedAutoCloseableSupplier get(UUID key) throws IOException { // Warn if actual cache size exceeds the soft limit already. if (size() > cacheSizeLimit) { LOG.warn("Snapshot cache size ({}) exceeds configured soft-limit ({}).", @@ -181,7 +182,17 @@ public ReferenceCounted get(UUID key) throws IOException { throw new OMException("SnapshotId: '" + key + "' not found, or the snapshot is no longer active.", OMException.ResultCodes.FILE_NOT_FOUND); } - return rcOmSnapshot; + return new UncheckedAutoCloseableSupplier() { + @Override + public OmSnapshot get() { + return rcOmSnapshot.get(); + } + + @Override + public void close() { + rcOmSnapshot.decrementRefCount(); + } + }; } /** @@ -245,4 +256,8 @@ public void callback(ReferenceCounted referenceCounted) { .getSnapshotID()); } } + + long totalRefCount(UUID key) { + return dbMap.containsKey(key) ? dbMap.get(key).getTotalRefCount() : 0; + } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java index f2e239615b5a..1e0b5f7d8771 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java @@ -130,6 +130,7 @@ import org.apache.ozone.rocksdiff.DifferSnapshotInfo; import org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer; import org.apache.ozone.rocksdiff.RocksDiffUtils; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.rocksdb.ColumnFamilyDescriptor; import org.rocksdb.ColumnFamilyHandle; import org.rocksdb.RocksDBException; @@ -837,8 +838,8 @@ void generateSnapshotDiffReport(final String jobKey, // job by RocksDBCheckpointDiffer#pruneOlderSnapshotsWithCompactionHistory. Path path = Paths.get(sstBackupDirForSnapDiffJobs + "/" + jobId); - ReferenceCounted rcFromSnapshot = null; - ReferenceCounted rcToSnapshot = null; + UncheckedAutoCloseableSupplier rcFromSnapshot = null; + UncheckedAutoCloseableSupplier rcToSnapshot = null; try { if (!areDiffJobAndSnapshotsActive(volumeName, bucketName, diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableDirFilter.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableDirFilter.java index 7384ed88a9b1..9dcb49ac3eef 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableDirFilter.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableDirFilter.java @@ -29,7 +29,7 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; /** * Class to filter out deleted directories which are reclaimable based on their presence in previous snapshot in @@ -56,7 +56,7 @@ protected String getBucketName(Table.KeyValue keyValue) throw @Override protected Boolean isReclaimable(Table.KeyValue deletedDirInfo) throws IOException { - ReferenceCounted previousSnapshot = getPreviousOmSnapshot(0); + UncheckedAutoCloseableSupplier previousSnapshot = getPreviousOmSnapshot(0); KeyManager prevKeyManager = previousSnapshot == null ? null : previousSnapshot.get().getKeyManager(); return isDirReclaimable(getVolumeId(), getBucketInfo(), deletedDirInfo.getValue(), getKeyManager(), prevKeyManager); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableFilter.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableFilter.java index ec8cd0d1100e..f79119456903 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableFilter.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableFilter.java @@ -36,9 +36,9 @@ import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; import org.apache.hadoop.ozone.om.lock.OzoneManagerLock; import org.apache.hadoop.ozone.om.snapshot.MultiSnapshotLocks; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.snapshot.SnapshotUtils; import org.apache.ratis.util.function.CheckedFunction; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,7 +59,7 @@ public abstract class ReclaimableFilter private final List tmpValidationSnapshotInfos; private final List lockedSnapshotIds; private final List previousSnapshotInfos; - private final List> previousOmSnapshots; + private final List> previousOmSnapshots; private final MultiSnapshotLocks snapshotIdLocks; private Long volumeId; private OmBucketInfo bucketInfo; @@ -130,7 +130,7 @@ private boolean validateExistingLastNSnapshotsInChain(String volume, String buck } for (int i = 0; i < expectedLastNSnapshotsInChain.size(); i++) { SnapshotInfo snapshotInfo = expectedLastNSnapshotsInChain.get(i); - ReferenceCounted omSnapshot = previousOmSnapshots.get(i); + UncheckedAutoCloseableSupplier omSnapshot = previousOmSnapshots.get(i); UUID snapshotId = snapshotInfo == null ? null : snapshotInfo.getSnapshotId(); UUID existingOmSnapshotId = omSnapshot == null ? null : omSnapshot.get().getSnapshotID(); if (!Objects.equals(snapshotId, existingOmSnapshotId)) { @@ -211,7 +211,7 @@ private void cleanup() { lockedSnapshotIds.clear(); } - protected ReferenceCounted getPreviousOmSnapshot(int index) { + protected UncheckedAutoCloseableSupplier getPreviousOmSnapshot(int index) { return previousOmSnapshots.get(index); } @@ -239,7 +239,7 @@ List getPreviousSnapshotInfos() { return previousSnapshotInfos; } - List> getPreviousOmSnapshots() { + List> getPreviousOmSnapshots() { return previousOmSnapshots; } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableKeyFilter.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableKeyFilter.java index 6b558b58549a..d357f66097a1 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableKeyFilter.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableKeyFilter.java @@ -34,9 +34,9 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.ratis.util.MemoizedCheckedSupplier; import org.apache.ratis.util.function.CheckedSupplier; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; /** * Filter to return deleted keys which are reclaimable based on their presence in previous snapshot in @@ -85,7 +85,7 @@ protected String getBucketName(Table.KeyValue keyValue) throw * @throws IOException If an error occurs while accessing snapshot data or key information. */ protected Boolean isReclaimable(Table.KeyValue deletedKeyInfo) throws IOException { - ReferenceCounted previousSnapshot = getPreviousOmSnapshot(1); + UncheckedAutoCloseableSupplier previousSnapshot = getPreviousOmSnapshot(1); KeyManager previousKeyManager = Optional.ofNullable(previousSnapshot) @@ -101,7 +101,7 @@ protected Boolean isReclaimable(Table.KeyValue deletedKeyInfo return true; } - ReferenceCounted previousToPreviousSnapshot = getPreviousOmSnapshot(0); + UncheckedAutoCloseableSupplier previousToPreviousSnapshot = getPreviousOmSnapshot(0); KeyManager previousToPreviousKeyManager = Optional.ofNullable(previousToPreviousSnapshot) .map(i -> i.get().getKeyManager()).orElse(null); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableRenameEntryFilter.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableRenameEntryFilter.java index 563f71d81f4c..cad4ebc6df5d 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableRenameEntryFilter.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/filter/ReclaimableRenameEntryFilter.java @@ -29,7 +29,7 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.helpers.WithObjectID; import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; /** * Class to filter out rename table entries which are reclaimable based on the key presence in previous snapshot's @@ -53,7 +53,7 @@ public ReclaimableRenameEntryFilter(OzoneManager ozoneManager, */ @Override protected Boolean isReclaimable(Table.KeyValue renameEntry) throws IOException { - ReferenceCounted previousSnapshot = getPreviousOmSnapshot(0); + UncheckedAutoCloseableSupplier previousSnapshot = getPreviousOmSnapshot(0); Table previousKeyTable = null; Table prevDirTable = null; if (previousSnapshot != null) { diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java index 928c375c706a..d44b83584712 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java @@ -43,9 +43,9 @@ import org.apache.hadoop.ozone.om.request.OMRequestTestUtils; import org.apache.hadoop.ozone.om.response.key.OMDirectoriesPurgeResponseWithFSO; import org.apache.hadoop.ozone.om.response.key.OMKeyPurgeResponse; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.Test; /** @@ -224,7 +224,7 @@ public void testValidateAndUpdateCacheSnapshotLastTransactionInfoUpdated() throw String snapshotName = "snap1"; SnapshotInfo snapshotInfo = createSnapshot(snapshotName); - ReferenceCounted rcOmSnapshot = ozoneManager.getOmSnapshotManager() + UncheckedAutoCloseableSupplier rcOmSnapshot = ozoneManager.getOmSnapshotManager() .getSnapshot(snapshotInfo.getVolumeName(), snapshotInfo.getBucketName(), snapshotInfo.getName()); // Keys should be present in snapshot validateDeletedKeysTable(rcOmSnapshot.get().getMetadataManager(), deletedKeyInfos, true); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyPurgeRequestAndResponse.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyPurgeRequestAndResponse.java index 46f442c45e2f..39c39953438f 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyPurgeRequestAndResponse.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyPurgeRequestAndResponse.java @@ -32,7 +32,6 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.request.OMRequestTestUtils; import org.apache.hadoop.ozone.om.response.key.OMKeyPurgeResponse; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DeletedKeys; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; @@ -40,6 +39,7 @@ import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.PurgeKeysResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.Test; /** @@ -176,7 +176,7 @@ public void testKeyPurgeInSnapshot() throws Exception { assertFalse(omMetadataManager.getDeletedTable().isExist(deletedKey)); } - ReferenceCounted rcOmSnapshot = ozoneManager.getOmSnapshotManager() + UncheckedAutoCloseableSupplier rcOmSnapshot = ozoneManager.getOmSnapshotManager() .getSnapshot(snapInfo.getVolumeName(), snapInfo.getBucketName(), snapInfo.getName()); OmSnapshot omSnapshot = rcOmSnapshot.get(); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java index 8ddb1a23d136..b45625b1bdb1 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java @@ -83,7 +83,6 @@ import org.apache.hadoop.ozone.om.request.snapshot.OMSnapshotCreateRequest; import org.apache.hadoop.ozone.om.request.snapshot.TestOMSnapshotCreateRequest; import org.apache.hadoop.ozone.om.response.snapshot.OMSnapshotCreateResponse; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.upgrade.OMLayoutVersionManager; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyArgs; @@ -91,6 +90,7 @@ import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.util.Time; import org.apache.ozone.test.GenericTestUtils; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -192,8 +192,8 @@ public void setup() throws Exception { when(ozoneManager.getAccessAuthorizer()) .thenReturn(new OzoneNativeAuthorizer()); - ReferenceCounted rcOmMetadataReader = - mock(ReferenceCounted.class); + UncheckedAutoCloseableSupplier rcOmMetadataReader = + mock(UncheckedAutoCloseableSupplier.class); when(ozoneManager.getOmMetadataReader()).thenReturn(rcOmMetadataReader); // Init OmMetadataReader to let the test pass OmMetadataReader omMetadataReader = mock(OmMetadataReader.class); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/multipart/TestS3MultipartRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/multipart/TestS3MultipartRequest.java index ce224d9895ab..d0f8ac9f55de 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/multipart/TestS3MultipartRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/multipart/TestS3MultipartRequest.java @@ -49,13 +49,13 @@ import org.apache.hadoop.ozone.om.helpers.KeyValueUtil; import org.apache.hadoop.ozone.om.request.OMClientRequest; import org.apache.hadoop.ozone.om.request.OMRequestTestUtils; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.upgrade.OMLayoutVersionManager; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyArgs; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Part; import org.apache.hadoop.ozone.security.acl.OzoneNativeAuthorizer; import org.apache.hadoop.security.UserGroupInformation; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.io.TempDir; @@ -85,8 +85,8 @@ public void setup() throws Exception { when(ozoneManager.getMetrics()).thenReturn(omMetrics); when(ozoneManager.getMetadataManager()).thenReturn(omMetadataManager); auditLogger = mock(AuditLogger.class); - ReferenceCounted rcOmMetadataReader = - mock(ReferenceCounted.class); + UncheckedAutoCloseableSupplier rcOmMetadataReader = + mock(UncheckedAutoCloseableSupplier.class); when(ozoneManager.getOmMetadataReader()).thenReturn(rcOmMetadataReader); // Init OmMetadataReader to let the test pass OmMetadataReader omMetadataReader = mock(OmMetadataReader.class); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotMoveTableKeysResponse.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotMoveTableKeysResponse.java index dff833aa5b02..aabacd8c503a 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotMoveTableKeysResponse.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotMoveTableKeysResponse.java @@ -36,10 +36,10 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.helpers.RepeatedOmKeyInfo; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.snapshot.SnapshotUtils; import org.apache.hadoop.ozone.om.snapshot.TestSnapshotRequestAndResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.ParameterizedTest; @@ -107,9 +107,9 @@ private void addDataToTable(Table table, List> va public void testMoveTableKeysToNextSnapshot(boolean nextSnapshotExists) throws Exception { createSnapshots(nextSnapshotExists); - try (ReferenceCounted snapshot1 = getOmSnapshotManager().getSnapshot(getVolumeName(), getBucketName(), - snapshotName1); - ReferenceCounted snapshot2 = nextSnapshotExists ? getOmSnapshotManager().getSnapshot( + try (UncheckedAutoCloseableSupplier snapshot1 = getOmSnapshotManager().getSnapshot( + getVolumeName(), getBucketName(), snapshotName1); + UncheckedAutoCloseableSupplier snapshot2 = nextSnapshotExists ? getOmSnapshotManager().getSnapshot( getVolumeName(), getBucketName(), snapshotName2) : null) { OmSnapshot snapshot = snapshot1.get(); List deletedTable = new ArrayList<>(); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyDeletingService.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyDeletingService.java index 20a91080c50c..d9f4dac123c8 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyDeletingService.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyDeletingService.java @@ -79,10 +79,10 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol; import org.apache.hadoop.ozone.om.request.OMRequestTestUtils; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.ozone.test.GenericTestUtils; import org.apache.ozone.test.OzoneTestBase; import org.apache.ratis.util.ExitUtils; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; @@ -472,7 +472,7 @@ void testSnapshotDeepClean() throws Exception { keyDeletingService.resume(); - try (ReferenceCounted rcOmSnapshot = + try (UncheckedAutoCloseableSupplier rcOmSnapshot = om.getOmSnapshotManager().getSnapshot(volumeName, bucketName, snap3)) { OmSnapshot snapshot3 = rcOmSnapshot.get(); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java index 0fcc7c3de180..e26ac8e7fbcd 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java @@ -33,6 +33,7 @@ import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.OmSnapshot; import org.apache.ozone.test.GenericTestUtils; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -93,7 +94,7 @@ void tearDown() { void testGet() throws IOException { final UUID dbKey1 = UUID.randomUUID(); assertEquals(0, omMetrics.getNumSnapshotCacheSize()); - ReferenceCounted omSnapshot = snapshotCache.get(dbKey1); + UncheckedAutoCloseableSupplier omSnapshot = snapshotCache.get(dbKey1); assertNotNull(omSnapshot); assertNotNull(omSnapshot.get()); assertInstanceOf(OmSnapshot.class, omSnapshot.get()); @@ -105,12 +106,12 @@ void testGet() throws IOException { @DisplayName("get() same entry twice yields one cache entry only") void testGetTwice() throws IOException { final UUID dbKey1 = UUID.randomUUID(); - ReferenceCounted omSnapshot1 = snapshotCache.get(dbKey1); + UncheckedAutoCloseableSupplier omSnapshot1 = snapshotCache.get(dbKey1); assertNotNull(omSnapshot1); assertEquals(1, snapshotCache.size()); assertEquals(1, omMetrics.getNumSnapshotCacheSize()); - ReferenceCounted omSnapshot1again = snapshotCache.get(dbKey1); + UncheckedAutoCloseableSupplier omSnapshot1again = snapshotCache.get(dbKey1); // Should be the same instance assertEquals(omSnapshot1, omSnapshot1again); assertEquals(omSnapshot1.get(), omSnapshot1again.get()); @@ -122,7 +123,7 @@ void testGetTwice() throws IOException { @DisplayName("release(String)") void testReleaseByDbKey() throws IOException { final UUID dbKey1 = UUID.randomUUID(); - ReferenceCounted omSnapshot1 = snapshotCache.get(dbKey1); + UncheckedAutoCloseableSupplier omSnapshot1 = snapshotCache.get(dbKey1); assertNotNull(omSnapshot1); assertNotNull(omSnapshot1.get()); assertEquals(1, snapshotCache.size()); @@ -138,7 +139,7 @@ void testReleaseByDbKey() throws IOException { @DisplayName("invalidate()") void testInvalidate() throws IOException { final UUID dbKey1 = UUID.randomUUID(); - ReferenceCounted omSnapshot = snapshotCache.get(dbKey1); + UncheckedAutoCloseableSupplier omSnapshot = snapshotCache.get(dbKey1); assertNotNull(omSnapshot); assertEquals(1, snapshotCache.size()); assertEquals(1, omMetrics.getNumSnapshotCacheSize()); @@ -157,13 +158,13 @@ void testInvalidate() throws IOException { @DisplayName("invalidateAll()") void testInvalidateAll() throws IOException { final UUID dbKey1 = UUID.randomUUID(); - ReferenceCounted omSnapshot1 = snapshotCache.get(dbKey1); + UncheckedAutoCloseableSupplier omSnapshot1 = snapshotCache.get(dbKey1); assertNotNull(omSnapshot1); assertEquals(1, snapshotCache.size()); assertEquals(1, omMetrics.getNumSnapshotCacheSize()); final UUID dbKey2 = UUID.randomUUID(); - ReferenceCounted omSnapshot2 = snapshotCache.get(dbKey2); + UncheckedAutoCloseableSupplier omSnapshot2 = snapshotCache.get(dbKey2); assertNotNull(omSnapshot2); assertEquals(2, snapshotCache.size()); assertEquals(2, omMetrics.getNumSnapshotCacheSize()); @@ -171,7 +172,7 @@ void testInvalidateAll() throws IOException { assertNotEquals(omSnapshot1, omSnapshot2); final UUID dbKey3 = UUID.randomUUID(); - ReferenceCounted omSnapshot3 = snapshotCache.get(dbKey3); + UncheckedAutoCloseableSupplier omSnapshot3 = snapshotCache.get(dbKey3); assertNotNull(omSnapshot3); assertEquals(3, snapshotCache.size()); assertEquals(3, omMetrics.getNumSnapshotCacheSize()); @@ -283,8 +284,8 @@ void testEviction2() throws IOException, InterruptedException, TimeoutException void testEviction3WithClose() throws IOException, InterruptedException, TimeoutException { final UUID dbKey1 = UUID.randomUUID(); - try (ReferenceCounted rcOmSnapshot = snapshotCache.get(dbKey1)) { - assertEquals(1L, rcOmSnapshot.getTotalRefCount()); + try (UncheckedAutoCloseableSupplier rcOmSnapshot = snapshotCache.get(dbKey1)) { + assertEquals(1L, snapshotCache.totalRefCount(rcOmSnapshot.get().getSnapshotID())); assertEquals(1, snapshotCache.size()); assertEquals(1, omMetrics.getNumSnapshotCacheSize()); } @@ -295,26 +296,26 @@ void testEviction3WithClose() throws IOException, InterruptedException, TimeoutE assertEquals(1, omMetrics.getNumSnapshotCacheSize()); final UUID dbKey2 = UUID.randomUUID(); - try (ReferenceCounted rcOmSnapshot = snapshotCache.get(dbKey2)) { - assertEquals(1L, rcOmSnapshot.getTotalRefCount()); + try (UncheckedAutoCloseableSupplier rcOmSnapshot = snapshotCache.get(dbKey2)) { + assertEquals(1L, snapshotCache.totalRefCount(rcOmSnapshot.get().getSnapshotID())); assertEquals(2, snapshotCache.size()); assertEquals(2, omMetrics.getNumSnapshotCacheSize()); // Get dbKey2 entry a second time - try (ReferenceCounted rcOmSnapshot2 = snapshotCache.get(dbKey2)) { - assertEquals(2L, rcOmSnapshot.getTotalRefCount()); - assertEquals(2L, rcOmSnapshot2.getTotalRefCount()); + try (UncheckedAutoCloseableSupplier rcOmSnapshot2 = snapshotCache.get(dbKey2)) { + assertEquals(2L, snapshotCache.totalRefCount(rcOmSnapshot.get().getSnapshotID())); + assertEquals(2L, snapshotCache.totalRefCount(rcOmSnapshot2.get().getSnapshotID())); assertEquals(2, snapshotCache.size()); assertEquals(2, omMetrics.getNumSnapshotCacheSize()); } - assertEquals(1L, rcOmSnapshot.getTotalRefCount()); + assertEquals(1L, snapshotCache.totalRefCount(rcOmSnapshot.get().getSnapshotID())); } assertEquals(0L, snapshotCache.getDbMap().get(dbKey2).getTotalRefCount()); assertEquals(2, snapshotCache.size()); assertEquals(2, omMetrics.getNumSnapshotCacheSize()); final UUID dbKey3 = UUID.randomUUID(); - try (ReferenceCounted rcOmSnapshot = snapshotCache.get(dbKey3)) { - assertEquals(1L, rcOmSnapshot.getTotalRefCount()); + try (UncheckedAutoCloseableSupplier rcOmSnapshot = snapshotCache.get(dbKey3)) { + assertEquals(1L, snapshotCache.totalRefCount(rcOmSnapshot.get().getSnapshotID())); assertEquals(3, snapshotCache.size()); assertEquals(3, omMetrics.getNumSnapshotCacheSize()); } @@ -323,9 +324,9 @@ void testEviction3WithClose() throws IOException, InterruptedException, TimeoutE assertEquals(3, omMetrics.getNumSnapshotCacheSize()); final UUID dbKey4 = UUID.randomUUID(); - try (ReferenceCounted rcOmSnapshot = snapshotCache.get(dbKey4)) { + try (UncheckedAutoCloseableSupplier rcOmSnapshot = snapshotCache.get(dbKey4)) { GenericTestUtils.waitFor(() -> snapshotCache.size() == 1, 50, 3000); - assertEquals(1L, rcOmSnapshot.getTotalRefCount()); + assertEquals(1L, snapshotCache.totalRefCount(rcOmSnapshot.get().getSnapshotID())); assertEquals(1, snapshotCache.size()); assertEquals(1, omMetrics.getNumSnapshotCacheSize()); } diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java index ed4df7d505c5..71ce98c3876c 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java @@ -153,6 +153,7 @@ import org.apache.ozone.test.tag.Flaky; import org.apache.ratis.util.ExitUtils; import org.apache.ratis.util.TimeDuration; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; @@ -437,9 +438,9 @@ public void testGetDeltaFilesWithDag(int numberOfFiles) throws IOException { eq(diffDir)) ).thenReturn(Optional.of(Lists.newArrayList(randomStrings))); - ReferenceCounted rcFromSnapshot = + UncheckedAutoCloseableSupplier rcFromSnapshot = omSnapshotManager.getActiveSnapshot(VOLUME_NAME, BUCKET_NAME, snap1.toString()); - ReferenceCounted rcToSnapshot = + UncheckedAutoCloseableSupplier rcToSnapshot = omSnapshotManager.getActiveSnapshot(VOLUME_NAME, BUCKET_NAME, snap2.toString()); OmSnapshot fromSnapshot = rcFromSnapshot.get(); OmSnapshot toSnapshot = rcToSnapshot.get(); @@ -517,9 +518,9 @@ public void testGetDeltaFilesWithFullDiff(int numberOfFiles, .thenReturn(Optional.ofNullable(Collections.emptyList())); } - ReferenceCounted rcFromSnapshot = + UncheckedAutoCloseableSupplier rcFromSnapshot = omSnapshotManager.getActiveSnapshot(VOLUME_NAME, BUCKET_NAME, snap1.toString()); - ReferenceCounted rcToSnapshot = + UncheckedAutoCloseableSupplier rcToSnapshot = omSnapshotManager.getActiveSnapshot(VOLUME_NAME, BUCKET_NAME, snap2.toString()); OmSnapshot fromSnapshot = rcFromSnapshot.get(); OmSnapshot toSnapshot = rcToSnapshot.get(); @@ -588,9 +589,9 @@ public void testGetDeltaFilesWithDifferThrowException(int numberOfFiles) any(DifferSnapshotInfo.class), anyString()); - ReferenceCounted rcFromSnapshot = + UncheckedAutoCloseableSupplier rcFromSnapshot = omSnapshotManager.getActiveSnapshot(VOLUME_NAME, BUCKET_NAME, snap1.toString()); - ReferenceCounted rcToSnapshot = + UncheckedAutoCloseableSupplier rcToSnapshot = omSnapshotManager.getActiveSnapshot(VOLUME_NAME, BUCKET_NAME, snap2.toString()); OmSnapshot fromSnapshot = rcFromSnapshot.get(); OmSnapshot toSnapshot = rcToSnapshot.get(); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSstFilteringService.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSstFilteringService.java index 7e03fe7df21c..e523f32ef7e2 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSstFilteringService.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSstFilteringService.java @@ -67,6 +67,7 @@ import org.apache.hadoop.ozone.om.request.OMRequestTestUtils; import org.apache.hadoop.security.UserGroupInformation; import org.apache.ratis.util.ExitUtils; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -489,7 +490,7 @@ private Set getKeysFromSnapshot(String volume, String snapshot) throws IOException { SnapshotInfo snapshotInfo = om.getMetadataManager().getSnapshotInfoTable() .get(SnapshotInfo.getTableKey(volume, bucket, snapshot)); - try (ReferenceCounted snapshotMetadataReader = + try (UncheckedAutoCloseableSupplier snapshotMetadataReader = om.getOmSnapshotManager().getActiveSnapshot( snapshotInfo.getVolumeName(), snapshotInfo.getBucketName(), diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/AbstractReclaimableFilterTest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/AbstractReclaimableFilterTest.java index 1aeafc5c5a6f..d8d4cc064f6d 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/AbstractReclaimableFilterTest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/AbstractReclaimableFilterTest.java @@ -59,11 +59,11 @@ import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; import org.apache.hadoop.ozone.om.lock.OMLockDetails; import org.apache.hadoop.ozone.om.lock.OzoneManagerLock; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.snapshot.SnapshotCache; import org.apache.hadoop.ozone.om.snapshot.SnapshotDiffManager; import org.apache.hadoop.ozone.om.snapshot.SnapshotUtils; import org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.TestInstance; @@ -181,7 +181,7 @@ private void mockOmSnapshotManager(OzoneManager om) throws RocksDBException, IOE doNothing().when(mock).close()); MockedConstruction mockedCache = Mockito.mockConstruction(SnapshotCache.class, (mock, context) -> { - Map> map = new HashMap<>(); + Map> map = new HashMap<>(); when(mock.get(any(UUID.class))).thenAnswer(i -> { if (snapshotInfos.values().stream().flatMap(List::stream) .map(SnapshotInfo::getSnapshotId) @@ -189,7 +189,7 @@ private void mockOmSnapshotManager(OzoneManager om) throws RocksDBException, IOE throw new IOException("Snapshot " + i.getArgument(0, UUID.class) + " not found"); } return map.computeIfAbsent(i.getArgument(0, UUID.class), (k) -> { - ReferenceCounted ref = mock(ReferenceCounted.class); + UncheckedAutoCloseableSupplier ref = mock(UncheckedAutoCloseableSupplier.class); OmSnapshot omSnapshot = mock(OmSnapshot.class); when(omSnapshot.getSnapshotID()).thenReturn(k); when(ref.get()).thenReturn(omSnapshot); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableDirFilter.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableDirFilter.java index a8c6a11b2eca..a85da9900a03 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableDirFilter.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableDirFilter.java @@ -37,7 +37,7 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -76,7 +76,7 @@ private void testReclaimableDirFilter(String volume, String bucket, int index, long volumeId = getOzoneManager().getMetadataManager().getVolumeId(volume); KeyManager keyManager = getKeyManager(); if (prevSnapshotInfo != null) { - ReferenceCounted prevSnap = Optional.ofNullable(prevSnapshotInfo) + UncheckedAutoCloseableSupplier prevSnap = Optional.ofNullable(prevSnapshotInfo) .map(info -> { try { return getOmSnapshotManager().getActiveSnapshot(volume, bucket, info.getName()); @@ -106,7 +106,7 @@ private OmDirectoryInfo getMockedOmDirInfo(long objectId) { return keyInfo; } - private KeyManager mockOmSnapshot(ReferenceCounted snapshot) { + private KeyManager mockOmSnapshot(UncheckedAutoCloseableSupplier snapshot) { if (snapshot != null) { OmSnapshot omSnapshot = snapshot.get(); KeyManager keyManager = mock(KeyManager.class); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableFilter.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableFilter.java index 9fdc87439159..2b986f8fb32a 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableFilter.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableFilter.java @@ -42,8 +42,8 @@ import org.apache.hadoop.ozone.om.helpers.BucketLayout; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.snapshot.SnapshotUtils; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.params.ParameterizedTest; @@ -108,7 +108,7 @@ private void testSnapshotInitAndLocking( Assertions.assertEquals(infos.size(), getReclaimableFilter().getPreviousOmSnapshots().size()); Assertions.assertEquals(infos.stream().map(si -> si == null ? null : si.getSnapshotId()) .collect(Collectors.toList()), getReclaimableFilter().getPreviousOmSnapshots().stream() - .map(i -> i == null ? null : ((ReferenceCounted) i).get().getSnapshotID()) + .map(i -> i == null ? null : ((UncheckedAutoCloseableSupplier) i).get().getSnapshotID()) .collect(Collectors.toList())); infos.add(currentSnapshotInfo); Assertions.assertEquals(infos.stream().filter(Objects::nonNull).map(SnapshotInfo::getSnapshotId).collect( diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableKeyFilter.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableKeyFilter.java index 021a44eafd92..9db680c18f97 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableKeyFilter.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableKeyFilter.java @@ -38,8 +38,8 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; import org.apache.hadoop.ozone.om.snapshot.SnapshotUtils; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -82,7 +82,7 @@ List testReclaimableFilterArguments() { return arguments; } - private KeyManager mockOmSnapshot(ReferenceCounted snapshot) { + private KeyManager mockOmSnapshot(UncheckedAutoCloseableSupplier snapshot) { if (snapshot != null) { OmSnapshot omSnapshot = snapshot.get(); KeyManager keyManager = mock(KeyManager.class); @@ -104,7 +104,7 @@ private void testReclaimableKeyFilter(String volume, String bucket, int index, OmBucketInfo bucketInfo = getOzoneManager().getBucketInfo(volume, bucket); long volumeId = getOzoneManager().getMetadataManager().getVolumeId(volume); - ReferenceCounted prevSnap = Optional.ofNullable(prevSnapshotInfo) + UncheckedAutoCloseableSupplier prevSnap = Optional.ofNullable(prevSnapshotInfo) .map(info -> { try { return getOmSnapshotManager().getActiveSnapshot(volume, bucket, info.getName()); @@ -112,7 +112,7 @@ private void testReclaimableKeyFilter(String volume, String bucket, int index, throw new RuntimeException(e); } }).orElse(null); - ReferenceCounted prevToPrevSnap = Optional.ofNullable(previousToPreviousSapshotInfo) + UncheckedAutoCloseableSupplier prevToPrevSnap = Optional.ofNullable(previousToPreviousSapshotInfo) .map(info -> { try { return getOmSnapshotManager().getActiveSnapshot(volume, bucket, info.getName()); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableRenameEntryFilter.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableRenameEntryFilter.java index cb0dabc6cf06..4fad10f248f7 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableRenameEntryFilter.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/filter/TestReclaimableRenameEntryFilter.java @@ -44,7 +44,7 @@ import org.apache.hadoop.ozone.om.helpers.OmKeyInfo; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; -import org.apache.hadoop.ozone.om.snapshot.ReferenceCounted; +import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -82,7 +82,7 @@ private void testReclaimableRenameEntryFilter(String volume, String bucket, int SnapshotInfo prevSnapshotInfo = snapshotInfos.get(0); OmBucketInfo bucketInfo = getOzoneManager().getBucketInfo(volume, bucket); if (prevSnapshotInfo != null) { - ReferenceCounted prevSnap = Optional.ofNullable(prevSnapshotInfo) + UncheckedAutoCloseableSupplier prevSnap = Optional.ofNullable(prevSnapshotInfo) .map(info -> { try { return getOmSnapshotManager().getActiveSnapshot(volume, bucket, info.getName()); @@ -115,7 +115,7 @@ private Table getFailingMockedTable() throws IOException { return table; } - private void mockOmSnapshot(ReferenceCounted snapshot, + private void mockOmSnapshot(UncheckedAutoCloseableSupplier snapshot, OmBucketInfo bucketInfo, Table keyTable, Table dirTable) { if (snapshot != null) { From 9e5604e60919e2f04ff8f997be61e48ad87801f4 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Sat, 17 May 2025 02:11:11 -0400 Subject: [PATCH 08/17] HDDS-12134. Implement Snapshot Cache lock for OM Bootstrap Change-Id: I908b0f9b33cce8468ab2d12ab758a5c91f36c559 --- .../ozone/om/lock/IOzoneManagerLock.java | 4 ++ .../hadoop/ozone/om/lock/OmReadOnlyLock.java | 10 ++++ .../ozone/om/lock/OzoneManagerLock.java | 55 ++++++++++++++----- .../ozone/om/lock/TestOzoneManagerLock.java | 2 +- .../hadoop/ozone/om/OmSnapshotManager.java | 2 +- .../hadoop/ozone/om/SstFilteringService.java | 2 +- .../snapshot/OMSnapshotCreateRequest.java | 2 +- .../snapshot/OMSnapshotDeleteRequest.java | 2 +- .../snapshot/OMSnapshotRenameRequest.java | 2 +- .../snapshot/OMSnapshotPurgeResponse.java | 2 +- .../ozone/om/snapshot/SnapshotCache.java | 30 ++++++++-- .../ozone/om/snapshot/TestSnapshotCache.java | 4 +- .../om/snapshot/TestSnapshotDiffManager.java | 4 +- 13 files changed, 93 insertions(+), 28 deletions(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/IOzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/IOzoneManagerLock.java index 01adde398eb0..d2b1a19a9b9f 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/IOzoneManagerLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/IOzoneManagerLock.java @@ -36,6 +36,8 @@ OMLockDetails acquireWriteLock(Resource resource, OMLockDetails acquireWriteLocks(Resource resource, Collection resources); + OMLockDetails acquireResourceWriteLock(Resource resource); + boolean acquireMultiUserLock(String firstUser, String secondUser); void releaseMultiUserLock(String firstUser, String secondUser); @@ -46,6 +48,8 @@ OMLockDetails releaseWriteLock(Resource resource, OMLockDetails releaseWriteLocks(Resource resource, Collection resources); + OMLockDetails releaseResourceWriteLock(Resource resource); + OMLockDetails releaseReadLock(Resource resource, String... resources); diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OmReadOnlyLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OmReadOnlyLock.java index 3e68f856fc90..b95e89f75664 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OmReadOnlyLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OmReadOnlyLock.java @@ -50,6 +50,11 @@ public OMLockDetails acquireWriteLocks(Resource resource, Collection r return EMPTY_DETAILS_LOCK_NOT_ACQUIRED; } + @Override + public OMLockDetails acquireResourceWriteLock(Resource resource) { + return EMPTY_DETAILS_LOCK_NOT_ACQUIRED; + } + @Override public boolean acquireMultiUserLock(String firstUser, String secondUser) { return false; @@ -71,6 +76,11 @@ public OMLockDetails releaseWriteLocks(Resource resource, Collection r return EMPTY_DETAILS_LOCK_NOT_ACQUIRED; } + @Override + public OMLockDetails releaseResourceWriteLock(Resource resource) { + return EMPTY_DETAILS_LOCK_NOT_ACQUIRED; + } + @Override public OMLockDetails releaseReadLock(Resource resource, String... resources) { return EMPTY_DETAILS_LOCK_NOT_ACQUIRED; diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java index 849082136e68..fd758a671630 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java @@ -37,7 +37,9 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.IntStream; import java.util.stream.Stream; import java.util.stream.StreamSupport; import org.apache.commons.lang3.tuple.Pair; @@ -140,9 +142,11 @@ private Striped createStripeLock(Resource r, return SimpleStriped.readWriteLock(size, fair); } - private Iterable bulkGetLock(Map> lockMap, Resource resource, - Collection keys) { - Striped striped = lockMap.get(resource); + private Iterable getAllLocks(Striped striped) { + return IntStream.range(0, striped.size()).mapToObj(striped::getAt).collect(Collectors.toList()); + } + + private Iterable bulkGetLock(Striped striped, Collection keys) { List lockKeys = new ArrayList<>(keys.size()); for (String[] key : keys) { if (Objects.nonNull(key)) { @@ -200,7 +204,7 @@ public OMLockDetails acquireReadLock(Resource resource, String... keys) { */ @Override public OMLockDetails acquireReadLocks(Resource resource, Collection keys) { - return acquireLocks(resource, true, keys); + return acquireLocks(resource, true, striped -> bulkGetLock(striped, keys)); } /** @@ -244,7 +248,17 @@ public OMLockDetails acquireWriteLock(Resource resource, String... keys) { */ @Override public OMLockDetails acquireWriteLocks(Resource resource, Collection keys) { - return acquireLocks(resource, false, keys); + return acquireLocks(resource, false, striped -> bulkGetLock(striped, keys)); + } + + /** + * Acquires a write lock on the entire Stripe for a specified resource. + * + * @param resource The resource for which the write lock is to be acquired. + */ + @Override + public OMLockDetails acquireResourceWriteLock(Resource resource) { + return acquireLocks(resource, false, this::getAllLocks); } private void acquireLock(Resource resource, boolean isReadLock, ReadWriteLock lock, @@ -258,7 +272,8 @@ private void acquireLock(Resource resource, boolean isReadLock, ReadWriteLock lo } } - private OMLockDetails acquireLocks(Resource resource, boolean isReadLock, Collection keys) { + private OMLockDetails acquireLocks(Resource resource, boolean isReadLock, + Function, Iterable> lockListProvider) { Pair>, ResourceLockManager> resourceLockPair = resourcelockMap.get(resource.getClass()); ResourceLockManager resourceLockManager = resourceLockPair.getRight(); @@ -271,7 +286,7 @@ private OMLockDetails acquireLocks(Resource resource, boolean isReadLock, Collec long startWaitingTimeNanos = Time.monotonicNowNanos(); - for (ReadWriteLock lock : bulkGetLock(resourceLockPair.getKey(), resource, keys)) { + for (ReadWriteLock lock : lockListProvider.apply(resourceLockPair.getKey().get(resource))) { acquireLock(resource, isReadLock, lock, startWaitingTimeNanos); } return resourceLockManager.lockResource(resource); @@ -423,7 +438,17 @@ public OMLockDetails releaseWriteLock(Resource resource, String... keys) { */ @Override public OMLockDetails releaseWriteLocks(Resource resource, Collection keys) { - return releaseLocks(resource, false, keys); + return releaseLocks(resource, false, striped -> bulkGetLock(striped, keys)); + } + + /** + * Releases a write lock acquired on the entire Stripe for a specified resource. + * + * @param resource The resource for which the write lock is to be acquired. + */ + @Override + public OMLockDetails releaseResourceWriteLock(Resource resource) { + return releaseLocks(resource, false, this::getAllLocks); } /** @@ -449,7 +474,7 @@ public OMLockDetails releaseReadLock(Resource resource, String... keys) { */ @Override public OMLockDetails releaseReadLocks(Resource resource, Collection keys) { - return releaseLocks(resource, true, keys); + return releaseLocks(resource, true, striped -> bulkGetLock(striped, keys)); } private OMLockDetails releaseLock(Resource resource, boolean isReadLock, @@ -471,14 +496,14 @@ private OMLockDetails releaseLock(Resource resource, boolean isReadLock, } private OMLockDetails releaseLocks(Resource resource, boolean isReadLock, - Collection keys) { + Function, Iterable> lockListProvider) { Pair>, ResourceLockManager> resourceLockPair = resourcelockMap.get(resource.getClass()); ResourceLockManager resourceLockManager = resourceLockPair.getRight(); resourceLockManager.clearLockDetails(); List locks = StreamSupport.stream( - bulkGetLock(resourceLockPair.getKey(), resource, keys).spliterator(), false) - .collect(Collectors.toList()); + lockListProvider.apply(resourceLockPair.getKey().get(resource)).spliterator(), false) + .collect(Collectors.toList()); // Release locks in reverse order. Collections.reverse(locks); for (ReadWriteLock lock : locks) { @@ -585,7 +610,8 @@ public OMLockMetrics getOMLockMetrics() { * Flat Resource defined in Ozone. Locks can be acquired on a resource independent of one another. */ public enum FlatResource implements Resource { - SNAPSHOT_GC_LOCK("SNAPSHOT_GC_LOCK"); + SNAPSHOT_GC_LOCK("SNAPSHOT_GC_LOCK"), + SNAPSHOT_LOCK("SNAPSHOT_LOCK"); private String name; private ResourceManager resourceManager; @@ -712,8 +738,7 @@ public enum LeveledResource implements Resource { S3_SECRET_LOCK((byte) 4, "S3_SECRET_LOCK"), // 31 KEY_PATH_LOCK((byte) 5, "KEY_PATH_LOCK"), //63 - PREFIX_LOCK((byte) 6, "PREFIX_LOCK"), //127 - SNAPSHOT_LOCK((byte) 7, "SNAPSHOT_LOCK"); // = 255 + PREFIX_LOCK((byte) 6, "PREFIX_LOCK"); //127 // level of the resource private byte lockLevel; diff --git a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java index 4772f156c521..4d238d305a9c 100644 --- a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java +++ b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java @@ -209,7 +209,7 @@ private String[] generateResourceName(Resource resource) { return new String[]{UUID.randomUUID().toString(), UUID.randomUUID().toString()}; } else if ((resource == LeveledResource.KEY_PATH_LOCK) || - (resource == LeveledResource.SNAPSHOT_LOCK)) { + (resource == FlatResource.SNAPSHOT_LOCK)) { return new String[]{UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString()}; } else { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java index e6f893ee7210..2878ed95d74a 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java @@ -290,7 +290,7 @@ public OmSnapshotManager(OzoneManager ozoneManager) { OZONE_OM_SNAPSHOT_CACHE_CLEANUP_SERVICE_RUN_INTERVAL_DEFAULT, TimeUnit.MILLISECONDS); this.snapshotCache = new SnapshotCache(loader, softCacheSize, ozoneManager.getMetrics(), - cacheCleanupServiceInterval); + cacheCleanupServiceInterval, ozoneManager.getMetadataManager().getLock()); this.snapshotDiffManager = new SnapshotDiffManager(snapshotDiffDb, differ, ozoneManager, snapDiffJobCf, snapDiffReportCf, diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java index ea46366d9182..3720bc58c14e 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java @@ -19,7 +19,7 @@ import static org.apache.hadoop.ozone.om.OMConfigKeys.SNAPSHOT_SST_DELETING_LIMIT_PER_TASK; import static org.apache.hadoop.ozone.om.OMConfigKeys.SNAPSHOT_SST_DELETING_LIMIT_PER_TASK_DEFAULT; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.SNAPSHOT_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.snapshot.SnapshotUtils.getColumnFamilyToKeyPrefixMap; import com.google.common.annotations.VisibleForTesting; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java index 57c4bb129bd7..2267ab995aed 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java @@ -20,8 +20,8 @@ import static org.apache.hadoop.hdds.HddsUtils.fromProtobuf; import static org.apache.hadoop.hdds.HddsUtils.toProtobuf; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_ALREADY_EXISTS; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.FILESYSTEM_SNAPSHOT; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java index 3f8bae61c530..b7b494eca5ee 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java @@ -18,8 +18,8 @@ package org.apache.hadoop.ozone.om.request.snapshot; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_NOT_FOUND; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.FILESYSTEM_SNAPSHOT; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java index 5a25d8594723..0236225d2bd2 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java @@ -19,8 +19,8 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_ALREADY_EXISTS; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_NOT_FOUND; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.FILESYSTEM_SNAPSHOT; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java index 5a530ee11880..14288601cadb 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.response.snapshot; import static org.apache.hadoop.ozone.om.codec.OMDBDefinition.SNAPSHOT_INFO_TABLE; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.SNAPSHOT_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_LOCK; import com.google.common.annotations.VisibleForTesting; import jakarta.annotation.Nonnull; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java index 6db09e4375c0..32f7f564024b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java @@ -18,6 +18,7 @@ package org.apache.hadoop.ozone.om.snapshot; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_NOT_FOUND; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_LOCK; import com.google.common.annotations.VisibleForTesting; import com.google.common.cache.CacheLoader; @@ -30,6 +31,8 @@ import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.OmSnapshot; import org.apache.hadoop.ozone.om.exceptions.OMException; +import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; +import org.apache.hadoop.ozone.om.lock.OMLockDetails; import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,22 +57,24 @@ public class SnapshotCache implements ReferenceCountedCallback, AutoCloseable { private final int cacheSizeLimit; private final Set pendingEvictionQueue; private final Scheduler scheduler; + private final IOzoneManagerLock lock; private static final String SNAPSHOT_CACHE_CLEANUP_SERVICE = "SnapshotCacheCleanupService"; private final OMMetrics omMetrics; public SnapshotCache(CacheLoader cacheLoader, int cacheSizeLimit, OMMetrics omMetrics, - long cleanupInterval) { + long cleanupInterval, IOzoneManagerLock lock) { this.dbMap = new ConcurrentHashMap<>(); this.cacheLoader = cacheLoader; this.cacheSizeLimit = cacheSizeLimit; this.omMetrics = omMetrics; + this.lock = lock; this.pendingEvictionQueue = ConcurrentHashMap.newKeySet(); if (cleanupInterval > 0) { this.scheduler = new Scheduler(SNAPSHOT_CACHE_CLEANUP_SERVICE, true, 1); - this.scheduler.scheduleWithFixedDelay(this::cleanup, cleanupInterval, + this.scheduler.scheduleWithFixedDelay(() -> this.cleanup(false), cleanupInterval, cleanupInterval, TimeUnit.MILLISECONDS); } else { this.scheduler = null; @@ -148,6 +153,7 @@ public UncheckedAutoCloseableSupplier get(UUID key) throws IOExcepti LOG.warn("Snapshot cache size ({}) exceeds configured soft-limit ({}).", size(), cacheSizeLimit); } + lock.acquireReadLock(SNAPSHOT_LOCK, key.toString()); // Atomic operation to initialize the OmSnapshot instance (once) if the key // does not exist, and increment the reference count on the instance. ReferenceCounted rcOmSnapshot = @@ -179,6 +185,7 @@ public UncheckedAutoCloseableSupplier get(UUID key) throws IOExcepti if (rcOmSnapshot == null) { // The only exception that would fall through the loader logic above // is OMException with FILE_NOT_FOUND. + lock.releaseReadLock(SNAPSHOT_LOCK, key.toString()); throw new OMException("SnapshotId: '" + key + "' not found, or the snapshot is no longer active.", OMException.ResultCodes.FILE_NOT_FOUND); } @@ -191,6 +198,7 @@ public OmSnapshot get() { @Override public void close() { rcOmSnapshot.decrementRefCount(); + lock.releaseReadLock(SNAPSHOT_LOCK, key.toString()); } }; } @@ -208,14 +216,28 @@ public void release(UUID key) { val.decrementRefCount(); } + public OMLockDetails lock() { + OMLockDetails lockDetails = lock.acquireResourceWriteLock(SNAPSHOT_LOCK); + if (lockDetails.isLockAcquired()) { + cleanup(true); + if (!dbMap.isEmpty()) { + return lock.releaseResourceWriteLock(SNAPSHOT_LOCK); + } + } + return lockDetails; + } + + public OMLockDetails unlock() { + return lock.releaseResourceWriteLock(SNAPSHOT_LOCK); + } /** * If cache size exceeds soft limit, attempt to clean up and close the instances that has zero reference count. */ @VisibleForTesting - void cleanup() { - if (dbMap.size() > cacheSizeLimit) { + synchronized void cleanup(boolean force) { + if (force || dbMap.size() > cacheSizeLimit) { for (UUID evictionKey : pendingEvictionQueue) { dbMap.compute(evictionKey, (k, v) -> { pendingEvictionQueue.remove(k); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java index e26ac8e7fbcd..909e071a9190 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java @@ -32,6 +32,7 @@ import java.util.concurrent.TimeoutException; import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.OmSnapshot; +import org.apache.hadoop.ozone.om.lock.OmReadOnlyLock; import org.apache.ozone.test.GenericTestUtils; import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.junit.jupiter.api.AfterEach; @@ -80,7 +81,8 @@ static void beforeAll() throws Exception { void setUp() { // Reset cache for each test case omMetrics = OMMetrics.create(); - snapshotCache = new SnapshotCache(cacheLoader, CACHE_SIZE_LIMIT, omMetrics, 50); + snapshotCache = new SnapshotCache(cacheLoader, CACHE_SIZE_LIMIT, omMetrics, 50, + new OmReadOnlyLock()); } @AfterEach diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java index 71ce98c3876c..e3f6d0459bcb 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java @@ -135,6 +135,7 @@ import org.apache.hadoop.ozone.om.helpers.SnapshotDiffJob; import org.apache.hadoop.ozone.om.helpers.SnapshotInfo; import org.apache.hadoop.ozone.om.helpers.WithParentObjectId; +import org.apache.hadoop.ozone.om.lock.OmReadOnlyLock; import org.apache.hadoop.ozone.om.snapshot.SnapshotTestUtils.StubbedPersistentMap; import org.apache.hadoop.ozone.snapshot.CancelSnapshotDiffResponse; import org.apache.hadoop.ozone.snapshot.CancelSnapshotDiffResponse.CancelMessage; @@ -370,7 +371,8 @@ public void init() throws RocksDBException, IOException, ExecutionException { omSnapshotManager = mock(OmSnapshotManager.class); when(ozoneManager.getOmSnapshotManager()).thenReturn(omSnapshotManager); - SnapshotCache snapshotCache = new SnapshotCache(mockCacheLoader(), 10, omMetrics, 0); + SnapshotCache snapshotCache = new SnapshotCache(mockCacheLoader(), 10, omMetrics, 0, + new OmReadOnlyLock()); when(omSnapshotManager.getActiveSnapshot(anyString(), anyString(), anyString())) .thenAnswer(invocationOnMock -> { From 78d63ede3b91f14345c9bf3fc3477a6daf58f4d4 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Sat, 17 May 2025 02:37:53 -0400 Subject: [PATCH 09/17] HDDS-12134. Implement a separate SNAPSHOT_DB_LOCK Change-Id: If7e5de4db6dd58055623bf1b5dbea54b235a38f2 --- .../hadoop/ozone/om/lock/OzoneManagerLock.java | 5 +++-- .../hadoop/ozone/om/lock/TestOzoneManagerLock.java | 2 +- .../hadoop/ozone/om/SstFilteringService.java | 8 +++----- .../request/snapshot/OMSnapshotCreateRequest.java | 2 +- .../request/snapshot/OMSnapshotDeleteRequest.java | 2 +- .../request/snapshot/OMSnapshotRenameRequest.java | 2 +- .../response/snapshot/OMSnapshotPurgeResponse.java | 8 +++----- .../hadoop/ozone/om/snapshot/SnapshotCache.java | 14 +++++++------- 8 files changed, 20 insertions(+), 23 deletions(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java index fd758a671630..5bb7a1a1d505 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java @@ -611,7 +611,7 @@ public OMLockMetrics getOMLockMetrics() { */ public enum FlatResource implements Resource { SNAPSHOT_GC_LOCK("SNAPSHOT_GC_LOCK"), - SNAPSHOT_LOCK("SNAPSHOT_LOCK"); + SNAPSHOT_DB_LOCK("SNAPSHOT_DB_LOCK"); private String name; private ResourceManager resourceManager; @@ -738,7 +738,8 @@ public enum LeveledResource implements Resource { S3_SECRET_LOCK((byte) 4, "S3_SECRET_LOCK"), // 31 KEY_PATH_LOCK((byte) 5, "KEY_PATH_LOCK"), //63 - PREFIX_LOCK((byte) 6, "PREFIX_LOCK"); //127 + PREFIX_LOCK((byte) 6, "PREFIX_LOCK"), //127 + SNAPSHOT_LOCK((byte) 7, "SNAPSHOT_LOCK"); //255 // level of the resource private byte lockLevel; diff --git a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java index 4d238d305a9c..4772f156c521 100644 --- a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java +++ b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java @@ -209,7 +209,7 @@ private String[] generateResourceName(Resource resource) { return new String[]{UUID.randomUUID().toString(), UUID.randomUUID().toString()}; } else if ((resource == LeveledResource.KEY_PATH_LOCK) || - (resource == FlatResource.SNAPSHOT_LOCK)) { + (resource == LeveledResource.SNAPSHOT_LOCK)) { return new String[]{UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString()}; } else { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java index 3720bc58c14e..b94fd45bf7fb 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java @@ -19,7 +19,7 @@ import static org.apache.hadoop.ozone.om.OMConfigKeys.SNAPSHOT_SST_DELETING_LIMIT_PER_TASK; import static org.apache.hadoop.ozone.om.OMConfigKeys.SNAPSHOT_SST_DELETING_LIMIT_PER_TASK_DEFAULT; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_DB_LOCK; import static org.apache.hadoop.ozone.om.snapshot.SnapshotUtils.getColumnFamilyToKeyPrefixMap; import com.google.common.annotations.VisibleForTesting; @@ -135,8 +135,7 @@ private void markSSTFilteredFlagForSnapshot(SnapshotInfo snapshotInfo) throws IO // in OmSnapshotPurgeResponse. Any operation apart from delete can run in parallel along with this operation. //TODO. Revisit other SNAPSHOT_LOCK and see if we can change write locks to read locks to further optimize it. OMLockDetails omLockDetails = ozoneManager.getMetadataManager().getLock() - .acquireReadLock(SNAPSHOT_LOCK, snapshotInfo.getVolumeName(), snapshotInfo.getBucketName(), - snapshotInfo.getName()); + .acquireReadLock(SNAPSHOT_DB_LOCK, snapshotInfo.getSnapshotId().toString()); boolean acquiredSnapshotLock = omLockDetails.isLockAcquired(); if (acquiredSnapshotLock) { String snapshotDir = OmSnapshotManager.getSnapshotPath(ozoneManager.getConfiguration(), snapshotInfo); @@ -147,8 +146,7 @@ private void markSSTFilteredFlagForSnapshot(SnapshotInfo snapshotInfo) throws IO } } finally { ozoneManager.getMetadataManager().getLock() - .releaseReadLock(SNAPSHOT_LOCK, snapshotInfo.getVolumeName(), - snapshotInfo.getBucketName(), snapshotInfo.getName()); + .releaseReadLock(SNAPSHOT_DB_LOCK, snapshotInfo.getSnapshotId().toString()); } } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java index 2267ab995aed..57c4bb129bd7 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotCreateRequest.java @@ -20,8 +20,8 @@ import static org.apache.hadoop.hdds.HddsUtils.fromProtobuf; import static org.apache.hadoop.hdds.HddsUtils.toProtobuf; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_ALREADY_EXISTS; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.FILESYSTEM_SNAPSHOT; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java index b7b494eca5ee..3f8bae61c530 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotDeleteRequest.java @@ -18,8 +18,8 @@ package org.apache.hadoop.ozone.om.request.snapshot; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.FILESYSTEM_SNAPSHOT; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java index 0236225d2bd2..5a25d8594723 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/snapshot/OMSnapshotRenameRequest.java @@ -19,8 +19,8 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_ALREADY_EXISTS; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.FILESYSTEM_SNAPSHOT; import java.io.IOException; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java index 14288601cadb..2503b291c00e 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/snapshot/OMSnapshotPurgeResponse.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.response.snapshot; import static org.apache.hadoop.ozone.om.codec.OMDBDefinition.SNAPSHOT_INFO_TABLE; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_DB_LOCK; import com.google.common.annotations.VisibleForTesting; import jakarta.annotation.Nonnull; @@ -121,8 +121,7 @@ private void deleteCheckpointDirectory(OMMetadataManager omMetadataManager, // inside the snapshot directory. Any operation apart which doesn't create/delete files under this snapshot // directory can run in parallel along with this operation. OMLockDetails omLockDetails = omMetadataManager.getLock() - .acquireWriteLock(SNAPSHOT_LOCK, snapshotInfo.getVolumeName(), snapshotInfo.getBucketName(), - snapshotInfo.getName()); + .acquireWriteLock(SNAPSHOT_DB_LOCK, snapshotInfo.getSnapshotId().toString()); boolean acquiredSnapshotLock = omLockDetails.isLockAcquired(); if (acquiredSnapshotLock) { Path snapshotDirPath = OmSnapshotManager.getSnapshotPath(omMetadataManager, snapshotInfo); @@ -132,8 +131,7 @@ private void deleteCheckpointDirectory(OMMetadataManager omMetadataManager, LOG.error("Failed to delete snapshot directory {} for snapshot {}", snapshotDirPath, snapshotInfo.getTableKey(), ex); } finally { - omMetadataManager.getLock().releaseWriteLock(SNAPSHOT_LOCK, snapshotInfo.getVolumeName(), - snapshotInfo.getBucketName(), snapshotInfo.getName()); + omMetadataManager.getLock().releaseWriteLock(SNAPSHOT_DB_LOCK, snapshotInfo.getSnapshotId().toString()); } } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java index 32f7f564024b..257b364c8ef2 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java @@ -18,7 +18,7 @@ package org.apache.hadoop.ozone.om.snapshot; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_LOCK; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_DB_LOCK; import com.google.common.annotations.VisibleForTesting; import com.google.common.cache.CacheLoader; @@ -153,7 +153,7 @@ public UncheckedAutoCloseableSupplier get(UUID key) throws IOExcepti LOG.warn("Snapshot cache size ({}) exceeds configured soft-limit ({}).", size(), cacheSizeLimit); } - lock.acquireReadLock(SNAPSHOT_LOCK, key.toString()); + lock.acquireReadLock(SNAPSHOT_DB_LOCK, key.toString()); // Atomic operation to initialize the OmSnapshot instance (once) if the key // does not exist, and increment the reference count on the instance. ReferenceCounted rcOmSnapshot = @@ -185,7 +185,7 @@ public UncheckedAutoCloseableSupplier get(UUID key) throws IOExcepti if (rcOmSnapshot == null) { // The only exception that would fall through the loader logic above // is OMException with FILE_NOT_FOUND. - lock.releaseReadLock(SNAPSHOT_LOCK, key.toString()); + lock.releaseReadLock(SNAPSHOT_DB_LOCK, key.toString()); throw new OMException("SnapshotId: '" + key + "' not found, or the snapshot is no longer active.", OMException.ResultCodes.FILE_NOT_FOUND); } @@ -198,7 +198,7 @@ public OmSnapshot get() { @Override public void close() { rcOmSnapshot.decrementRefCount(); - lock.releaseReadLock(SNAPSHOT_LOCK, key.toString()); + lock.releaseReadLock(SNAPSHOT_DB_LOCK, key.toString()); } }; } @@ -217,18 +217,18 @@ public void release(UUID key) { } public OMLockDetails lock() { - OMLockDetails lockDetails = lock.acquireResourceWriteLock(SNAPSHOT_LOCK); + OMLockDetails lockDetails = lock.acquireResourceWriteLock(SNAPSHOT_DB_LOCK); if (lockDetails.isLockAcquired()) { cleanup(true); if (!dbMap.isEmpty()) { - return lock.releaseResourceWriteLock(SNAPSHOT_LOCK); + return lock.releaseResourceWriteLock(SNAPSHOT_DB_LOCK); } } return lockDetails; } public OMLockDetails unlock() { - return lock.releaseResourceWriteLock(SNAPSHOT_LOCK); + return lock.releaseResourceWriteLock(SNAPSHOT_DB_LOCK); } /** From 6df8f031edf55e6024c9dd7064c1d0175200b8eb Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Sat, 17 May 2025 02:55:45 -0400 Subject: [PATCH 10/17] HDDS-12134. Check if lock acquired before opening db Change-Id: I14dab7c47c15919567739bb05a529073e3e169f6 --- .../org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java index 257b364c8ef2..4634cd5adb9f 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java @@ -153,7 +153,11 @@ public UncheckedAutoCloseableSupplier get(UUID key) throws IOExcepti LOG.warn("Snapshot cache size ({}) exceeds configured soft-limit ({}).", size(), cacheSizeLimit); } - lock.acquireReadLock(SNAPSHOT_DB_LOCK, key.toString()); + OMLockDetails lockDetails = lock.acquireReadLock(SNAPSHOT_DB_LOCK, key.toString()); + if (!lockDetails.isLockAcquired()) { + throw new OMException("Unable to acquire readlock on snapshot db with key " + key, + OMException.ResultCodes.INTERNAL_ERROR); + } // Atomic operation to initialize the OmSnapshot instance (once) if the key // does not exist, and increment the reference count on the instance. ReferenceCounted rcOmSnapshot = From a85b794b59b34a92a3e2062a41adc8d983a85ee3 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Sat, 17 May 2025 07:34:23 -0400 Subject: [PATCH 11/17] HDDS-13065. Fix test failure Change-Id: I86f15d12cc3f2cd95d0587078d0abd3db47aac1e --- .../org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java index e26ac8e7fbcd..4a9bc0f8577e 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java @@ -113,7 +113,6 @@ void testGetTwice() throws IOException { UncheckedAutoCloseableSupplier omSnapshot1again = snapshotCache.get(dbKey1); // Should be the same instance - assertEquals(omSnapshot1, omSnapshot1again); assertEquals(omSnapshot1.get(), omSnapshot1again.get()); assertEquals(1, snapshotCache.size()); assertEquals(1, omMetrics.getNumSnapshotCacheSize()); From 75c4764aeea46f3bdea1ccdce03e9b3922656db6 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Sat, 17 May 2025 08:02:23 -0400 Subject: [PATCH 12/17] HDDS-13031. Fix alignment Change-Id: I533d58c79430f40b9169b04e24e27820456446ca --- .../ozone/om/lock/IOzoneManagerLock.java | 14 +++--- .../hadoop/ozone/om/lock/OmReadOnlyLock.java | 6 +-- .../ozone/om/lock/OzoneManagerLock.java | 50 ++++--------------- .../ozone/om/lock/TestOzoneManagerLock.java | 4 +- 4 files changed, 23 insertions(+), 51 deletions(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/IOzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/IOzoneManagerLock.java index 01adde398eb0..808b9a4321ab 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/IOzoneManagerLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/IOzoneManagerLock.java @@ -34,35 +34,35 @@ OMLockDetails acquireWriteLock(Resource resource, String... resources); OMLockDetails acquireWriteLocks(Resource resource, - Collection resources); + Collection resources); boolean acquireMultiUserLock(String firstUser, String secondUser); void releaseMultiUserLock(String firstUser, String secondUser); OMLockDetails releaseWriteLock(Resource resource, - String... resources); + String... resources); OMLockDetails releaseWriteLocks(Resource resource, - Collection resources); + Collection resources); OMLockDetails releaseReadLock(Resource resource, String... resources); OMLockDetails releaseReadLocks(Resource resource, - Collection resources); + Collection resources); @VisibleForTesting int getReadHoldCount(Resource resource, - String... resources); + String... resources); @VisibleForTesting int getWriteHoldCount(Resource resource, - String... resources); + String... resources); @VisibleForTesting boolean isWriteLockedByCurrentThread(Resource resource, - String... resources); + String... resources); void cleanup(); diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OmReadOnlyLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OmReadOnlyLock.java index 3e68f856fc90..0c289cb18890 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OmReadOnlyLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OmReadOnlyLock.java @@ -41,7 +41,7 @@ public OMLockDetails acquireReadLocks(Resource resource, Collection re @Override public OMLockDetails acquireWriteLock(Resource resource, - String... resources) { + String... resources) { return EMPTY_DETAILS_LOCK_NOT_ACQUIRED; } @@ -62,7 +62,7 @@ public void releaseMultiUserLock(String firstUser, String secondUser) { @Override public OMLockDetails releaseWriteLock(Resource resource, - String... resources) { + String... resources) { return EMPTY_DETAILS_LOCK_NOT_ACQUIRED; } @@ -93,7 +93,7 @@ public int getWriteHoldCount(Resource resource, String... resources) { @Override public boolean isWriteLockedByCurrentThread(Resource resource, - String... resources) { + String... resources) { return false; } diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java index 849082136e68..759b6fd268c5 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java @@ -357,26 +357,8 @@ List getCurrentLocks() { */ @Override public boolean acquireMultiUserLock(String firstUser, String secondUser) { - LeveledResource resource = LeveledResource.USER_LOCK; - Pair>, ResourceLockManager> resourceLockPair = - resourcelockMap.get(resource.getClass()); - ResourceLockManager resourceLockManager = resourceLockPair.getRight(); - if (!resourceLockManager.canLockResource(resource)) { - String errorMessage = getErrorMessage(resource); - LOG.error(errorMessage); - throw new RuntimeException(errorMessage); - } else { - Striped striped = resourceLockPair.getKey().get(resource); - // The result of bulkGet is always sorted in a consistent order. - // This prevents deadlocks. - Iterable locks = - striped.bulkGet(Arrays.asList(firstUser, secondUser)); - for (ReadWriteLock lock : locks) { - lock.writeLock().lock(); - } - resourceLockManager.lockResource(resource); - return true; - } + return acquireWriteLocks(LeveledResource.USER_LOCK, + Arrays.asList(new String[] {firstUser}, new String[] {secondUser})).isLockAcquired(); } /** @@ -386,17 +368,8 @@ public boolean acquireMultiUserLock(String firstUser, String secondUser) { */ @Override public void releaseMultiUserLock(String firstUser, String secondUser) { - LeveledResource resource = LeveledResource.USER_LOCK; - Pair>, ResourceLockManager> resourceLockPair = - resourcelockMap.get(resource.getClass()); - ResourceLockManager resourceLockManager = resourceLockPair.getRight(); - Striped striped = resourceLockPair.getKey().get(resource); - Iterable locks = - striped.bulkGet(Arrays.asList(firstUser, secondUser)); - for (ReadWriteLock lock : locks) { - lock.writeLock().unlock(); - } - resourceLockManager.unlockResource(resource); + releaseWriteLocks(LeveledResource.USER_LOCK, + Arrays.asList(new String[] {firstUser}, new String[] {secondUser})); } @@ -453,7 +426,7 @@ public OMLockDetails releaseReadLocks(Resource resource, Collection ke } private OMLockDetails releaseLock(Resource resource, boolean isReadLock, - String... keys) { + String... keys) { Pair>, ResourceLockManager> resourceLockPair = resourcelockMap.get(resource.getClass()); ResourceLockManager resourceLockManager = resourceLockPair.getRight(); @@ -476,9 +449,8 @@ private OMLockDetails releaseLocks(Resource resource, boolean isReadLock, resourcelockMap.get(resource.getClass()); ResourceLockManager resourceLockManager = resourceLockPair.getRight(); resourceLockManager.clearLockDetails(); - List locks = StreamSupport.stream( - bulkGetLock(resourceLockPair.getKey(), resource, keys).spliterator(), false) - .collect(Collectors.toList()); + List locks = StreamSupport.stream(bulkGetLock(resourceLockPair.getKey(), resource, keys) + .spliterator(), false).collect(Collectors.toList()); // Release locks in reverse order. Collections.reverse(locks); for (ReadWriteLock lock : locks) { @@ -495,7 +467,7 @@ private OMLockDetails releaseLocks(Resource resource, boolean isReadLock, } private void updateReadUnlockMetrics(Resource resource, - ReentrantReadWriteLock lock) { + ReentrantReadWriteLock lock) { /* * readHoldCount helps in metrics updation only once in case * of reentrant locks. @@ -513,7 +485,7 @@ private void updateReadUnlockMetrics(Resource resource, } private void updateWriteUnlockMetrics(Resource resource, - ReentrantReadWriteLock lock, boolean isWriteLocked) { + ReentrantReadWriteLock lock, boolean isWriteLocked) { /* * writeHoldCount helps in metrics updation only once in case * of reentrant locks. Metrics are updated only if the write lock is held @@ -564,7 +536,7 @@ public int getWriteHoldCount(Resource resource, String... keys) { @Override @VisibleForTesting public boolean isWriteLockedByCurrentThread(Resource resource, - String... keys) { + String... keys) { return getLock(resourcelockMap.get(resource.getClass()).getKey(), resource, keys).isWriteLockedByCurrentThread(); } @@ -817,7 +789,7 @@ short getMask() { * @param deltaNanos consumed time */ private void updateProcessingDetails(ResourceLockManager resourceLockManager, Timing type, - long deltaNanos) { + long deltaNanos) { Server.Call call = Server.getCurCall().get(); if (call != null) { call.getProcessingDetails().add(type, deltaNanos, TimeUnit.NANOSECONDS); diff --git a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java index 4772f156c521..520a9c263f1c 100644 --- a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java +++ b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java @@ -450,8 +450,8 @@ private void testReadLockConcurrentStats(LeveledResource resource, } private void testWriteLockConcurrentStats(LeveledResource resource, - String[] resourceName, - int threadCount) + String[] resourceName, + int threadCount) throws InterruptedException { OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); Thread[] threads = new Thread[threadCount]; From 2c7d0b996f44f9fd392fd3b259dabd9e45e28796 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Sat, 17 May 2025 12:04:33 -0400 Subject: [PATCH 13/17] HDDS-13065. Make close thread safe Change-Id: I2ba80411d73e2f44b212983986d0edd4547a7840 --- .../apache/hadoop/ozone/om/snapshot/SnapshotCache.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java index 6db09e4375c0..bc2e344469a5 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java @@ -26,6 +26,8 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; import org.apache.hadoop.hdds.utils.Scheduler; import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.OmSnapshot; @@ -183,6 +185,7 @@ public UncheckedAutoCloseableSupplier get(UUID key) throws IOExcepti OMException.ResultCodes.FILE_NOT_FOUND); } return new UncheckedAutoCloseableSupplier() { + AtomicReference closed = new AtomicReference<>(false); @Override public OmSnapshot get() { return rcOmSnapshot.get(); @@ -190,7 +193,12 @@ public OmSnapshot get() { @Override public void close() { - rcOmSnapshot.decrementRefCount(); + closed.updateAndGet(alreadyClosed -> { + if (!alreadyClosed) { + rcOmSnapshot.decrementRefCount(); + } + return true; + }); } }; } From bf926d9f6b8ca6216b3ace420b8b955435ac7643 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Thu, 22 May 2025 18:49:07 -0400 Subject: [PATCH 14/17] HDDS-12134. Fix merge conflicts Change-Id: I9e71122babf06d2101ea9d17b345ce3f07821c72 --- .../org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java | 7 ++----- .../org/apache/hadoop/ozone/om/SstFilteringService.java | 1 - .../org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java | 1 - 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java index 70dbb00b4f6f..77fe84aa0d53 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java @@ -41,7 +41,6 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; -import java.util.stream.Stream; import java.util.stream.StreamSupport; import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.hdds.conf.ConfigurationSource; @@ -147,9 +146,7 @@ private Iterable getAllLocks(Striped striped) { return IntStream.range(0, striped.size()).mapToObj(striped::getAt).collect(Collectors.toList()); } - private Iterable bulkGetLock(Map> lockMap, Resource resource, - Collection keys) { - Striped striped = lockMap.get(resource); + private Iterable bulkGetLock(Striped striped, Collection keys) { List lockKeys = new ArrayList<>(keys.size()); for (String[] key : keys) { if (Objects.nonNull(key)) { @@ -477,7 +474,7 @@ private OMLockDetails releaseLocks(Resource resource, boolean isReadLock, resourcelockMap.get(resource.getClass()); ResourceLockManager resourceLockManager = resourceLockPair.getRight(); resourceLockManager.clearLockDetails(); - List locks = StreamSupport.stream(bulkGetLock(resourceLockPair.getKey(), resource, keys) + List locks = StreamSupport.stream(lockListProvider.apply(resourceLockPair.getKey().get(resource)) .spliterator(), false).collect(Collectors.toList()); // Release locks in reverse order. Collections.reverse(locks); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java index 4fd8401e4d10..b94fd45bf7fb 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java @@ -20,7 +20,6 @@ import static org.apache.hadoop.ozone.om.OMConfigKeys.SNAPSHOT_SST_DELETING_LIMIT_PER_TASK; import static org.apache.hadoop.ozone.om.OMConfigKeys.SNAPSHOT_SST_DELETING_LIMIT_PER_TASK_DEFAULT; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_DB_LOCK; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.SNAPSHOT_LOCK; import static org.apache.hadoop.ozone.om.snapshot.SnapshotUtils.getColumnFamilyToKeyPrefixMap; import com.google.common.annotations.VisibleForTesting; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java index 68462423ad7c..6d6c6f13c97d 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java @@ -35,7 +35,6 @@ import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; import org.apache.hadoop.ozone.om.lock.OMLockDetails; import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; -import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From 61152cd4b193be13180b3de00f67f0462b634336 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Fri, 23 May 2025 00:48:25 -0400 Subject: [PATCH 15/17] HDDS-12134. Add tests Change-Id: I93cf8ecee91616ba1956b0f04303d822fc0b4e79 --- .../ozone/om/lock/OzoneManagerLock.java | 2 + .../ozone/om/lock/TestOzoneManagerLock.java | 104 ++++++++++++++++-- .../ozone/om/snapshot/SnapshotCache.java | 47 ++++++-- .../ozone/om/snapshot/TestSnapshotCache.java | 56 +++++++++- 4 files changed, 189 insertions(+), 20 deletions(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java index 77fe84aa0d53..f9437c00d094 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java @@ -582,7 +582,9 @@ public OMLockMetrics getOMLockMetrics() { * Flat Resource defined in Ozone. Locks can be acquired on a resource independent of one another. */ public enum FlatResource implements Resource { + // Background services lock on a Snapshot. SNAPSHOT_GC_LOCK("SNAPSHOT_GC_LOCK"), + // Lock acquired on a Snapshot's RocksDB Handle. SNAPSHOT_DB_LOCK("SNAPSHOT_DB_LOCK"); private String name; diff --git a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java index 500a96e29a46..a1d853eb6b39 100644 --- a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java +++ b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/lock/TestOzoneManagerLock.java @@ -31,6 +31,7 @@ import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.metrics2.MetricsRecord; import org.apache.hadoop.metrics2.impl.MetricsCollectorImpl; @@ -39,7 +40,9 @@ import org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.ValueSource; /** * Class tests OzoneManagerLock. @@ -278,34 +281,119 @@ void acquireUserLockAfterMultiUserLock() { lock.releaseMultiUserLock("user1", "user2"); } - @Test - void testLockResourceParallel() throws Exception { + @ParameterizedTest + @ValueSource(booleans = {true, false}) + void testLockResourceParallel(boolean fullResourceLock) throws Exception { OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); - for (LeveledResource resource : - LeveledResource.values()) { + for (Resource resource : Stream.of(LeveledResource.values(), FlatResource.values()) + .flatMap(Arrays::stream).collect(Collectors.toList())) { final String[] resourceName = generateResourceName(resource); - lock.acquireWriteLock(resource, resourceName); + if (fullResourceLock) { + lock.acquireResourceWriteLock(resource); + } else { + lock.acquireWriteLock(resource, resourceName); + } AtomicBoolean gotLock = new AtomicBoolean(false); new Thread(() -> { - lock.acquireWriteLock(resource, resourceName); + if (fullResourceLock) { + lock.acquireResourceWriteLock(resource); + } else { + lock.acquireWriteLock(resource, resourceName); + } gotLock.set(true); - lock.releaseWriteLock(resource, resourceName); + if (fullResourceLock) { + lock.releaseResourceWriteLock(resource); + } else { + lock.releaseWriteLock(resource, resourceName); + } + }).start(); // Let's give some time for the new thread to run Thread.sleep(100); // Since the new thread is trying to get lock on same resource, // it will wait. assertFalse(gotLock.get()); - lock.releaseWriteLock(resource, resourceName); + if (fullResourceLock) { + lock.releaseResourceWriteLock(resource); + } else { + lock.releaseWriteLock(resource, resourceName); + } // Since we have released the lock, the new thread should have the lock // now. // Let's give some time for the new thread to run Thread.sleep(100); assertTrue(gotLock.get()); } + } + + @ParameterizedTest + @CsvSource(value = { + "true, true", + "true, false", + "false, true", + "false, false" + }) + void testResourceLockFullResourceLockParallel(boolean mainThreadAcquireResourceLock, boolean acquireWriteLock) + throws Exception { + OzoneManagerLock lock = new OzoneManagerLock(new OzoneConfiguration()); + + for (Resource resource : Stream.of(LeveledResource.values(), FlatResource.values()) + .flatMap(Arrays::stream).collect(Collectors.toList())) { + final String[] resourceName = generateResourceName(resource); + if (mainThreadAcquireResourceLock) { + lock.acquireResourceWriteLock(resource); + } else { + if (acquireWriteLock) { + lock.acquireWriteLock(resource, resourceName); + } else { + lock.acquireReadLock(resource, resourceName); + } + } + AtomicBoolean gotLock = new AtomicBoolean(false); + new Thread(() -> { + if (!mainThreadAcquireResourceLock) { + lock.acquireResourceWriteLock(resource); + } else { + if (acquireWriteLock) { + lock.acquireWriteLock(resource, resourceName); + } else { + lock.acquireReadLock(resource, resourceName); + } + } + gotLock.set(true); + if (!mainThreadAcquireResourceLock) { + lock.releaseResourceWriteLock(resource); + } else { + if (acquireWriteLock) { + lock.releaseWriteLock(resource, resourceName); + } else { + lock.releaseReadLock(resource, resourceName); + } + } + }).start(); + // Let's give some time for the new thread to run + Thread.sleep(100); + // Since the new thread is trying to get lock on same resource, + // it will wait. + assertFalse(gotLock.get()); + if (mainThreadAcquireResourceLock) { + lock.releaseResourceWriteLock(resource); + } else { + if (acquireWriteLock) { + lock.releaseWriteLock(resource, resourceName); + } else { + lock.releaseReadLock(resource, resourceName); + } + } + // Since we have released the lock, the new thread should have the lock + // now. + // Let's give some time for the new thread to run + Thread.sleep(100); + assertTrue(gotLock.get()); + } } @Test diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java index 6d6c6f13c97d..a25d9096837e 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java @@ -28,6 +28,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; import org.apache.hadoop.hdds.utils.Scheduler; import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.OmSnapshot; @@ -143,7 +144,8 @@ public enum Reason { } /** - * Get or load OmSnapshot. Shall be close()d after use. + * Get or load OmSnapshot. Shall be close()d after use. This would acquire a read lock on the Snapshot Database + * during the entire lifecycle of the returned OmSnapshot instance. * TODO: [SNAPSHOT] Can add reason enum to param list later. * @param key SnapshotId * @return an OmSnapshot instance, or null on error @@ -195,7 +197,7 @@ public UncheckedAutoCloseableSupplier get(UUID key) throws IOExcepti OMException.ResultCodes.FILE_NOT_FOUND); } return new UncheckedAutoCloseableSupplier() { - private AtomicReference closed = new AtomicReference<>(false); + private final AtomicReference closed = new AtomicReference<>(false); @Override public OmSnapshot get() { return rcOmSnapshot.get(); @@ -227,19 +229,44 @@ public void release(UUID key) { val.decrementRefCount(); } - public OMLockDetails lock() { - OMLockDetails lockDetails = lock.acquireResourceWriteLock(SNAPSHOT_DB_LOCK); - if (lockDetails.isLockAcquired()) { + /** + * Acquires a write lock on the snapshot database and returns an auto-closeable supplier + * for lock details. The lock ensures that the operations accessing the snapshot database + * are performed in a thread-safe manner. The returned supplier automatically releases the + * lock when closed, preventing potential resource contention or deadlocks. + */ + public UncheckedAutoCloseableSupplier lock() { + return lock(() -> lock.acquireResourceWriteLock(SNAPSHOT_DB_LOCK), + () -> lock.releaseResourceWriteLock(SNAPSHOT_DB_LOCK)); + } + + private UncheckedAutoCloseableSupplier lock( + Supplier lockFunction, Supplier unlockFunction) { + AtomicReference lockDetails = new AtomicReference<>(lockFunction.get()); + if (lockDetails.get().isLockAcquired()) { cleanup(true); if (!dbMap.isEmpty()) { - return lock.releaseResourceWriteLock(SNAPSHOT_DB_LOCK); + lockDetails.set(unlockFunction.get()); } } - return lockDetails; - } - public OMLockDetails unlock() { - return lock.releaseResourceWriteLock(SNAPSHOT_DB_LOCK); + return new UncheckedAutoCloseableSupplier() { + + @Override + public void close() { + lockDetails.updateAndGet((prevLock) -> { + if (prevLock != null && prevLock.isLockAcquired()) { + return unlockFunction.get(); + } + return prevLock; + }); + } + + @Override + public OMLockDetails get() { + return lockDetails.get(); + } + }; } /** diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java index 320b57f9a164..c9864f89b4c7 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java @@ -17,13 +17,20 @@ package org.apache.hadoop.ozone.om.snapshot; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_DB_LOCK; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.any; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.google.common.cache.CacheLoader; @@ -32,6 +39,9 @@ import java.util.concurrent.TimeoutException; import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.OmSnapshot; +import org.apache.hadoop.ozone.om.exceptions.OMException; +import org.apache.hadoop.ozone.om.lock.IOzoneManagerLock; +import org.apache.hadoop.ozone.om.lock.OMLockDetails; import org.apache.hadoop.ozone.om.lock.OmReadOnlyLock; import org.apache.ozone.test.GenericTestUtils; import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier; @@ -42,6 +52,8 @@ import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.mockito.stubbing.Answer; import org.slf4j.event.Level; @@ -53,6 +65,7 @@ class TestSnapshotCache { private static final int CACHE_SIZE_LIMIT = 3; private static CacheLoader cacheLoader; + private static IOzoneManagerLock lock; private SnapshotCache snapshotCache; private OMMetrics omMetrics; @@ -75,14 +88,14 @@ static void beforeAll() throws Exception { // Set SnapshotCache log level. Set to DEBUG for verbose output GenericTestUtils.setLogLevel(SnapshotCache.class, Level.DEBUG); + lock = spy(new OmReadOnlyLock()); } @BeforeEach void setUp() { // Reset cache for each test case omMetrics = OMMetrics.create(); - snapshotCache = new SnapshotCache(cacheLoader, CACHE_SIZE_LIMIT, omMetrics, 50, - new OmReadOnlyLock()); + snapshotCache = new SnapshotCache(cacheLoader, CACHE_SIZE_LIMIT, omMetrics, 50, lock); } @AfterEach @@ -104,6 +117,45 @@ void testGet() throws IOException { assertEquals(1, omMetrics.getNumSnapshotCacheSize()); } + @Test + @DisplayName("Tests get() fails on read lock failure") + public void testGetFailsOnReadLock() throws IOException { + final UUID dbKey1 = UUID.randomUUID(); + final UUID dbKey2 = UUID.randomUUID(); + when(lock.acquireReadLock(eq(SNAPSHOT_DB_LOCK), eq(dbKey1.toString()))) + .thenReturn(OMLockDetails.EMPTY_DETAILS_LOCK_NOT_ACQUIRED); + assertThrows(OMException.class, () -> snapshotCache.get(dbKey1)); + snapshotCache.get(dbKey2); + assertEquals(1, snapshotCache.size()); + } + + @ParameterizedTest + @ValueSource(ints = {0, 1, 5, 10}) + @DisplayName("Tests get() holds a read lock") + public void testGetHoldsReadLock(int numberOfLocks) throws IOException { + clearInvocations(lock); + final UUID dbKey1 = UUID.randomUUID(); + final UUID dbKey2 = UUID.randomUUID(); + for (int i = 0; i < numberOfLocks; i++) { + snapshotCache.get(dbKey1); + snapshotCache.get(dbKey2); + } + assertEquals(numberOfLocks > 0 ? 2 : 0, snapshotCache.size()); + verify(lock, times(numberOfLocks)).acquireReadLock(eq(SNAPSHOT_DB_LOCK), eq(dbKey1.toString())); + verify(lock, times(numberOfLocks)).acquireReadLock(eq(SNAPSHOT_DB_LOCK), eq(dbKey2.toString())); + } + + @ParameterizedTest + @ValueSource(ints = {0, 1, 5, 10}) + @DisplayName("Tests lock() holds a write lock") + public void testGetHoldsWriteLock(int numberOfLocks) { + clearInvocations(lock); + for (int i = 0; i < numberOfLocks; i++) { + snapshotCache.lock(); + } + verify(lock, times(numberOfLocks)).acquireResourceWriteLock(eq(SNAPSHOT_DB_LOCK)); + } + @Test @DisplayName("get() same entry twice yields one cache entry only") void testGetTwice() throws IOException { From 1ff2bca98a7583f41e918c571e0eebb9b4298e93 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Wed, 4 Jun 2025 07:00:30 -0400 Subject: [PATCH 16/17] HDDS-12134. Address review comments Change-Id: Ia604d3921be35f133f6f1758c26c78ab787d41a1 --- .../apache/hadoop/ozone/om/snapshot/SnapshotCache.java | 5 ++--- .../hadoop/ozone/om/snapshot/TestSnapshotCache.java | 8 +++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java index cbf3ebda8b95..b465956f35e6 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotCache.java @@ -18,8 +18,8 @@ package org.apache.hadoop.ozone.om.snapshot; import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_NOT_FOUND; -import static org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer.COLUMN_FAMILIES_TO_TRACK_IN_DAG; import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.FlatResource.SNAPSHOT_DB_LOCK; +import static org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer.COLUMN_FAMILIES_TO_TRACK_IN_DAG; import com.google.common.annotations.VisibleForTesting; import com.google.common.cache.CacheLoader; @@ -307,8 +307,7 @@ public OMLockDetails get() { * If cache size exceeds soft limit, attempt to clean up and close the instances that has zero reference count. */ - @VisibleForTesting - synchronized void cleanup(boolean force) { + private synchronized void cleanup(boolean force) { if (force || dbMap.size() > cacheSizeLimit) { for (UUID evictionKey : pendingEvictionQueue) { ReferenceCounted snapshot = dbMap.get(evictionKey); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java index 69ae95f8a32c..2a87f081ea94 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java @@ -26,13 +26,10 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doAnswer; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.any; import static org.mockito.Mockito.clearInvocations; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -426,7 +423,8 @@ void testEviction3WithClose() throws IOException, InterruptedException, TimeoutE @DisplayName("Snapshot operations not blocked during compaction") void testSnapshotOperationsNotBlockedDuringCompaction() throws IOException, InterruptedException, TimeoutException { omMetrics = OMMetrics.create(); - snapshotCache = new SnapshotCache(cacheLoader, 1, omMetrics, 50, true); + snapshotCache = new SnapshotCache(cacheLoader, 1, omMetrics, 50, true, + lock); final UUID dbKey1 = UUID.randomUUID(); UncheckedAutoCloseableSupplier snapshot1 = snapshotCache.get(dbKey1); assertEquals(1, snapshotCache.size()); From f9dd2469fe7d3117aab9216ecf7367164e79de04 Mon Sep 17 00:00:00 2001 From: Swaminathan Balachandran Date: Sat, 7 Jun 2025 22:19:52 -0400 Subject: [PATCH 17/17] HDDS-12134. Address review comments Change-Id: I7d310d0f07a3d81b6921f308ee95e9b9ddc713a7 --- .../java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java index f9437c00d094..6cd96f73238a 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java @@ -252,7 +252,7 @@ public OMLockDetails acquireWriteLocks(Resource resource, Collection k } /** - * Acquires a write lock on the entire Stripe for a specified resource. + * Acquires all write locks for a specified resource. * * @param resource The resource for which the write lock is to be acquired. */