This is an automated email from the ASF dual-hosted git repository.

adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 3eecac620c HDDS-12180. Store snapshot in CachingSpaceUsageSource 
(#7798)
3eecac620c is described below

commit 3eecac620c2c59b38c1a89a354275a72becb90e2
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Fri Feb 7 15:40:53 2025 +0100

    HDDS-12180. Store snapshot in CachingSpaceUsageSource (#7798)
---
 .../apache/hadoop/hdds/fs/CachingSpaceUsageSource.java    | 15 ++++++++++++++-
 .../hadoop/hdds/fs/TestCachingSpaceUsageSource.java       | 10 ++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/fs/CachingSpaceUsageSource.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/fs/CachingSpaceUsageSource.java
index 9b9719386b..683f4393a1 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/fs/CachingSpaceUsageSource.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/fs/CachingSpaceUsageSource.java
@@ -51,6 +51,7 @@ public class CachingSpaceUsageSource implements 
SpaceUsageSource {
   private long cachedUsedSpace;
   private long cachedAvailable;
   private long cachedCapacity;
+  private SpaceUsageSource cachedUsage;
   private final Duration refresh;
   private final SpaceUsageSource source;
   private final SpaceUsagePersistence persistence;
@@ -104,7 +105,15 @@ public long getUsedSpace() {
   @Override
   public SpaceUsageSource snapshot() {
     try (AutoCloseableLock ignored = lock.readLock(null, null)) {
-      return new Fixed(cachedCapacity, cachedAvailable, cachedUsedSpace);
+      if (cachedUsage != null) {
+        return cachedUsage;
+      }
+    }
+    try (AutoCloseableLock ignored = lock.writeLock(null, null)) {
+      if (cachedUsage == null) {
+        cachedUsage = new Fixed(cachedCapacity, cachedAvailable, 
cachedUsedSpace);
+      }
+      return cachedUsage;
     }
   }
 
@@ -119,6 +128,7 @@ public void incrementUsedSpace(long usedSpace) {
       change = Math.min(current, usedSpace);
       cachedAvailable -= change;
       cachedUsedSpace += change;
+      cachedUsage = null;
     }
 
     if (change != usedSpace) {
@@ -138,6 +148,7 @@ public void decrementUsedSpace(long reclaimedSpace) {
       change = Math.min(current, reclaimedSpace);
       cachedUsedSpace -= change;
       cachedAvailable += change;
+      cachedUsage = null;
     }
 
     if (change != reclaimedSpace) {
@@ -202,6 +213,7 @@ private void updateAvailable() {
     try (AutoCloseableLock ignored = lock.writeLock(null, null)) {
       cachedAvailable = available;
       cachedCapacity = capacity;
+      cachedUsage = null;
     }
   }
 
@@ -215,6 +227,7 @@ private void updateCachedValues(long used) {
       cachedAvailable = available;
       cachedCapacity = capacity;
       cachedUsedSpace = used;
+      cachedUsage = null;
     }
   }
 
diff --git 
a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/fs/TestCachingSpaceUsageSource.java
 
b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/fs/TestCachingSpaceUsageSource.java
index b84ca130f2..52d6e09dfe 100644
--- 
a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/fs/TestCachingSpaceUsageSource.java
+++ 
b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/fs/TestCachingSpaceUsageSource.java
@@ -161,6 +161,7 @@ void decrementUsedSpaceMoreThanCurrent() {
     assertEquals(0, subject.getUsedSpace());
     // available and used change by same amount (in opposite directions)
     assertEquals(original.getAvailable() + original.getUsedSpace(), 
subject.getAvailable());
+    assertSnapshotIsUpToDate(subject);
   }
 
   @Test
@@ -179,6 +180,14 @@ void decrementAvailableSpaceMoreThanCurrent() {
     assertEquals(0, subject.getAvailable());
     // available and used change by same amount (in opposite directions)
     assertEquals(original.getUsedSpace() + original.getAvailable(), 
subject.getUsedSpace());
+    assertSnapshotIsUpToDate(subject);
+  }
+
+  private static void assertSnapshotIsUpToDate(SpaceUsageSource subject) {
+    SpaceUsageSource snapshot = subject.snapshot();
+    assertEquals(subject.getCapacity(), snapshot.getCapacity());
+    assertEquals(subject.getAvailable(), snapshot.getAvailable());
+    assertEquals(subject.getUsedSpace(), snapshot.getUsedSpace());
   }
 
   private static long missingInitialValue() {
@@ -238,6 +247,7 @@ private static void 
assertAvailableWasUpdated(SpaceUsageSource source,
 
     assertEquals(source.getCapacity(), subject.getCapacity());
     assertEquals(source.getAvailable(), subject.getAvailable());
+    assertSnapshotIsUpToDate(subject);
   }
 
   private static void assertSubjectWasRefreshed(SpaceUsageSource source,


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to