You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by rc...@apache.org on 2020/04/17 02:06:57 UTC

[james-project] 04/04: JAMES-3138 Simplify the quotaCache in InMemoryCurrentQuotaManager with CurrentQuotas

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 <rc...@linagora.com>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org