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

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit de9800f58d4d3971aa4e8881162a389ff9c19f98
Author: Rene Cordier <[email protected]>
AuthorDate: Mon Apr 13 10:48:53 2020 +0700

    JAMES-3138 Simplify the quotaCache in InMemoryCurrentQuotaManager with 
CurrentQuotas
---
 .../quota/InMemoryCurrentQuotaManager.java         | 43 ++++++----------------
 .../store/quota/CurrentQuotaCalculator.java        | 12 ++++++
 2 files changed, 24 insertions(+), 31 deletions(-)

diff --git 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
index fbd2330..6a917e6 100644
--- 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
+++ 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
@@ -20,7 +20,8 @@
 package org.apache.james.mailbox.inmemory.quota;
 
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.UnaryOperator;
 
 import javax.inject.Inject;
 
@@ -41,32 +42,32 @@ import com.google.common.cache.LoadingCache;
 
 public class InMemoryCurrentQuotaManager implements StoreCurrentQuotaManager {
 
-    private final LoadingCache<QuotaRoot, Entry> quotaCache;
+    private final LoadingCache<QuotaRoot, AtomicReference<CurrentQuotas>> 
quotaCache;
 
     @Inject
     public InMemoryCurrentQuotaManager(CurrentQuotaCalculator quotaCalculator, 
SessionProvider sessionProvider) {
-        this.quotaCache = CacheBuilder.newBuilder().build(new 
CacheLoader<QuotaRoot, Entry>() {
+        this.quotaCache = CacheBuilder.newBuilder().build(new 
CacheLoader<QuotaRoot, AtomicReference<CurrentQuotas>>() {
             @Override
-            public Entry load(QuotaRoot quotaRoot) throws Exception {
-                return new 
Entry(quotaCalculator.recalculateCurrentQuotas(quotaRoot, 
sessionProvider.createSystemSession(Username.of(quotaRoot.getValue()))));
+            public AtomicReference<CurrentQuotas> load(QuotaRoot quotaRoot) 
throws Exception {
+                return new 
AtomicReference<>(quotaCalculator.recalculateCurrentQuotas(quotaRoot, 
sessionProvider.createSystemSession(Username.of(quotaRoot.getValue()))));
             }
         });
     }
 
     @Override
     public void increase(QuotaOperation quotaOperation) throws 
MailboxException {
-        updateQuota(quotaOperation.quotaRoot(), 
quotaOperation.count().asLong(), quotaOperation.size().asLong());
+        updateQuota(quotaOperation.quotaRoot(), quota -> quota.increase(new 
CurrentQuotas(quotaOperation.count(), quotaOperation.size())));
     }
 
     @Override
     public void decrease(QuotaOperation quotaOperation) throws 
MailboxException {
-        updateQuota(quotaOperation.quotaRoot(), 
-(quotaOperation.count().asLong()), -(quotaOperation.size().asLong()));
+        updateQuota(quotaOperation.quotaRoot(), quota -> quota.decrease(new 
CurrentQuotas(quotaOperation.count(), quotaOperation.size())));
     }
 
     @Override
     public QuotaCountUsage getCurrentMessageCount(QuotaRoot quotaRoot) throws 
MailboxException {
         try {
-            return 
QuotaCountUsage.count(quotaCache.get(quotaRoot).getCount().get());
+            return quotaCache.get(quotaRoot).get().count();
         } catch (ExecutionException e) {
             throw new MailboxException("Exception caught", e);
         }
@@ -75,37 +76,17 @@ public class InMemoryCurrentQuotaManager implements 
StoreCurrentQuotaManager {
     @Override
     public QuotaSizeUsage getCurrentStorage(QuotaRoot quotaRoot) throws 
MailboxException {
         try {
-            return 
QuotaSizeUsage.size(quotaCache.get(quotaRoot).getSize().get());
+            return quotaCache.get(quotaRoot).get().size();
         } catch (ExecutionException e) {
             throw new MailboxException("Exception caught", e);
         }
     }
 
-    private void updateQuota(QuotaRoot quotaRoot, long count, long size) 
throws MailboxException {
+    private void updateQuota(QuotaRoot quotaRoot, UnaryOperator<CurrentQuotas> 
quotaFunction) throws MailboxException {
         try {
-            Entry entry = quotaCache.get(quotaRoot);
-            entry.getCount().addAndGet(count);
-            entry.getSize().addAndGet(size);
+            quotaCache.get(quotaRoot).updateAndGet(quotaFunction);
         } catch (ExecutionException e) {
             throw new MailboxException("Exception caught", e);
         }
     }
-
-    static class Entry {
-        private final AtomicLong count;
-        private final AtomicLong size;
-
-        public Entry(CurrentQuotas currentQuotas) {
-            this.count = new AtomicLong(currentQuotas.count().asLong());
-            this.size = new AtomicLong(currentQuotas.size().asLong());
-        }
-
-        public AtomicLong getCount() {
-            return count;
-        }
-
-        public AtomicLong getSize() {
-            return size;
-        }
-    }
 }
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java
index 99fcaff..4dfbf0f 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java
@@ -81,6 +81,18 @@ public class CurrentQuotaCalculator {
         public QuotaSizeUsage size() {
             return size;
         }
+
+        public CurrentQuotas increase(CurrentQuotas updateQuotas) {
+            return new CurrentQuotas(
+                QuotaCountUsage.count(this.count.asLong() + 
updateQuotas.count.asLong()),
+                QuotaSizeUsage.size(this.size.asLong() + 
updateQuotas.size.asLong()));
+        }
+
+        public CurrentQuotas decrease(CurrentQuotas updateQuotas) {
+            return new CurrentQuotas(
+                QuotaCountUsage.count(this.count.asLong() - 
updateQuotas.count.asLong()),
+                QuotaSizeUsage.size(this.size.asLong() - 
updateQuotas.size.asLong()));
+        }
     }
 
 }
\ No newline at end of file


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

Reply via email to