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