smengcl commented on code in PR #8446: URL: https://github.com/apache/ozone/pull/8446#discussion_r2098806065
########## hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/lock/OzoneManagerLock.java: ########## @@ -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<T extends Resource> { + + private final ThreadLocal<OMLockDetails> omLockDetails = ThreadLocal.withInitial(OMLockDetails::new); + + abstract boolean canLockResource(T resource); + + abstract Stream<T> getCurrentLockedResources(); + + OMLockDetails clearLockDetails() { + omLockDetails.get().clear(); + return omLockDetails.get(); + } + + OMLockDetails unlockResource(T resource) { + return omLockDetails.get(); + } + + OMLockDetails lockResource(T resource) { + omLockDetails.get().setLockAcquired(true); + return omLockDetails.get(); + } + } + + private static final class FlatResourceLockManager extends ResourceLockManager<FlatResource> { + + private EnumMap<FlatResource, ThreadLocal<Boolean>> 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<FlatResource> getCurrentLockedResources() { + return acquiredLocksMap.keySet().stream().filter(i -> acquiredLocksMap.get(i).get()); Review Comment: nit ```suggestion return acquiredLocksMap.keySet().stream().filter(flatResource -> acquiredLocksMap.get(flatResource).get()); ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: issues-unsubscr...@ozone.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@ozone.apache.org For additional commands, e-mail: issues-h...@ozone.apache.org