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

Reply via email to