You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2023/09/01 09:33:38 UTC

[james-project] branch master updated (ebded1d42c -> 5c51d0fe61)

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

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


    from ebded1d42c JAMES-3925 Rework JMAP quota cleanup
     new dba9304e9e JAMES-3926 Rename CassandraCurrentQuotaManager to CassandraCurrentQuotaManagerV1
     new 81e4982b5b JAMES-3926 Move mutualized quota DAOs to backend/cassandra
     new 3dc2d41a39 JAMES-3926 Implement CassandraCurrentQuotaManagerV2
     new c75c7dbc27 JAMES-3926 Implement FakeCassandraCurrentQuotaManager
     new f22d4c4f70 JAMES-3926 Implement CassandraCurrentQuotaManagerMigration
     new df1675b7b6 JAMES-3926 Configuration for quota compatibility mode
     new 1d9d7b8f96 JAMES-3926 Module choosing for Mailbox Quota
     new 5269b11eea JAMES-3926 Register CassandraCurrentQuotaManagerMigration
     new 8b03b70b32 JAMES-3926 Mark older mailbox current quota datamodel as deprecated
     new 25cf5479dd JAMES-3926 Upgrade instructions
     new 933aba1047 JAMES-3926 fetch current mailbox quotas with only 1 cassandra request
     new 5e859cf239 JAMES-3926 Using CassandraCurrentQuotaManagerV2 instead of deprecated V1 for Cassandra tests
     new f47284b8aa JAMES-3926 Fix CassandraQuotaCurrentValueDaoTest
     new 5c51d0fe61 JAMES-3926 Fix issues with recompute quota tests in ConsistencyTasksIntegrationTest

The 14 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../components/CassandraMutualizedQuotaModule.java |  47 +------
 .../components}/CassandraQuotaCurrentValueDao.java |  29 ++++-
 .../CassandraQuotaCurrentValueTable.java           |   2 +-
 .../components}/CassandraQuotaLimitDao.java        |  14 +-
 .../components}/CassandraQuotaLimitTable.java      |   2 +-
 .../versions/CassandraSchemaVersionManager.java    |   2 +-
 .../quota/CassandraQuotaCurrentValueDaoTest.java   | 145 +++++++++++++++++++++
 .../quota/CassandraQuotaLimitDaoTest.java          |  16 +--
 mailbox/cassandra/pom.xml                          |  10 ++
 .../modules/CassandraMailboxQuotaModule.java       |  43 +++---
 .../cassandra/modules/CassandraQuotaModule.java    |  33 -----
 ...er.java => CassandraCurrentQuotaManagerV1.java} |   5 +-
 .../quota/CassandraCurrentQuotaManagerV2.java      | 134 +++++++++++++++++++
 .../quota/FakeCassandraCurrentQuotaManager.java    |  71 ++++++++++
 .../CassandraCurrentQuotaManagerMigration.java     |  67 ++++++++++
 .../cassandra/table/CassandraCurrentQuota.java     |   1 +
 .../cassandra/CassandraMailboxManagerProvider.java |   5 +-
 .../cassandra/CassandraTestSystemFixture.java      |   5 +-
 .../cassandra/mail/MailboxAggregateModule.java     |   3 +-
 ...CassandraRecomputeCurrentQuotasServiceTest.java |   7 +-
 ...ava => CassandraCurrentQuotaManagerV1Test.java} |  11 +-
 ...ava => CassandraCurrentQuotaManagerV2Test.java} |  19 ++-
 .../quota/CassandraPerUserMaxQuotaManagerTest.java |   4 +-
 .../quota/CassandraQuotaCurrentValueDaoTest.java   | 136 -------------------
 .../CassandraCurrentQuotaManagerMigrationTest.java | 126 ++++++++++++++++++
 .../cassandra/host/CassandraHostSystem.java        |   5 +-
 .../james/CassandraJamesServerConfiguration.java   |  25 +++-
 .../org/apache/james/CassandraJamesServerMain.java |  11 ++
 .../james/CassandraLegacyQuotaJamesServerTest.java |  30 +++--
 .../james/CassandraRabbitMQJamesConfiguration.java |  30 ++++-
 .../james/CassandraRabbitMQJamesServerMain.java    |  11 ++
 ...assandraRabbitMQLegacyQuotaJamesServerTest.java |  32 +++--
 .../james/DistributedPOP3JamesConfiguration.java   |  31 ++++-
 .../james/DistributedPOP3JamesServerMain.java      |  11 ++
 .../mailbox/CassandraMailboxQuotaLegacyModule.java |  27 ++--
 .../mailbox/CassandraMailboxQuotaModule.java       |  22 ++--
 .../modules/mailbox/CassandraQuotaModule.java      |  11 +-
 .../modules/webadmin/CassandraRoutesModule.java    |   3 +
 .../upload/CassandraUploadUsageRepository.java     |   2 +-
 .../upload/CassandraUploadUsageRepositoryTest.java |   5 +-
 .../rabbitmq/ConsistencyTasksIntegrationTest.java  |   4 +-
 .../RabbitMQWebAdminServerIntegrationTest.java     |   2 +-
 upgrade-instructions.md                            |  17 ++-
 43 files changed, 864 insertions(+), 352 deletions(-)
 copy mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java => backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraMutualizedQuotaModule.java (50%)
 rename {mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota => backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components}/CassandraQuotaCurrentValueDao.java (86%)
 rename {mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table => backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components}/CassandraQuotaCurrentValueTable.java (96%)
 rename {mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota => backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components}/CassandraQuotaLimitDao.java (93%)
 rename {mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table => backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components}/CassandraQuotaLimitTable.java (96%)
 create mode 100644 backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
 rename {mailbox/cassandra/src/test/java/org/apache/james/mailbox => backends-common/cassandra/src/test/java/org/apache/james/backends}/cassandra/quota/CassandraQuotaLimitDaoTest.java (90%)
 copy server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java => mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxQuotaModule.java (51%)
 rename mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/{CassandraCurrentQuotaManager.java => CassandraCurrentQuotaManagerV1.java} (97%)
 create mode 100644 mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2.java
 create mode 100644 mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/FakeCassandraCurrentQuotaManager.java
 create mode 100644 mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraCurrentQuotaManagerMigration.java
 copy mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/{CassandraCurrentQuotaManagerTest.java => CassandraCurrentQuotaManagerV1Test.java} (74%)
 copy mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/{CassandraCurrentQuotaManagerTest.java => CassandraCurrentQuotaManagerV2Test.java} (69%)
 delete mode 100644 mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
 create mode 100644 mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraCurrentQuotaManagerMigrationTest.java
 copy mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java => server/apps/cassandra-app/src/test/java/org/apache/james/CassandraLegacyQuotaJamesServerTest.java (57%)
 copy mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java => server/apps/distributed-app/src/test/java/org/apache/james/CassandraRabbitMQLegacyQuotaJamesServerTest.java (54%)
 copy mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java => server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxQuotaLegacyModule.java (55%)
 rename mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java => server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxQuotaModule.java (64%)


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 05/14: JAMES-3926 Implement CassandraCurrentQuotaManagerMigration

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f22d4c4f70e4389db5089d4d200098f1c2a7a66e
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Aug 25 17:27:42 2023 +0700

    JAMES-3926 Implement CassandraCurrentQuotaManagerMigration
---
 mailbox/cassandra/pom.xml                          |  10 ++
 .../CassandraCurrentQuotaManagerMigration.java     |  67 +++++++++++
 .../CassandraCurrentQuotaManagerMigrationTest.java | 124 +++++++++++++++++++++
 3 files changed, 201 insertions(+)

diff --git a/mailbox/cassandra/pom.xml b/mailbox/cassandra/pom.xml
index 22255438ea..101c1c92aa 100644
--- a/mailbox/cassandra/pom.xml
+++ b/mailbox/cassandra/pom.xml
@@ -111,11 +111,21 @@
             <type>test-jar</type>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-data-api</artifactId>
+        </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
             <artifactId>james-server-data-cassandra</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-data-library</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
             <artifactId>james-server-task-api</artifactId>
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraCurrentQuotaManagerMigration.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraCurrentQuotaManagerMigration.java
new file mode 100644
index 0000000000..b22e2aec63
--- /dev/null
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraCurrentQuotaManagerMigration.java
@@ -0,0 +1,67 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.cassandra.quota.migration;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.apache.james.backends.cassandra.migration.Migration;
+import org.apache.james.core.Username;
+import org.apache.james.mailbox.model.QuotaOperation;
+import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
+import org.apache.james.mailbox.quota.UserQuotaRootResolver;
+import org.apache.james.user.api.UsersRepository;
+
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+public class CassandraCurrentQuotaManagerMigration implements Migration {
+    private final UsersRepository usersRepository;
+    private final UserQuotaRootResolver userQuotaRootResolver;
+    private final CurrentQuotaManager oldCurrentQuotaManager;
+    private final CurrentQuotaManager newCurrentQuotaManager;
+
+    @Inject
+    public CassandraCurrentQuotaManagerMigration(UsersRepository usersRepository,
+                                                 UserQuotaRootResolver userQuotaRootResolver,
+                                                 @Named("old") CurrentQuotaManager oldCurrentQuotaManager,
+                                                 CurrentQuotaManager newCurrentQuotaManager) {
+        this.usersRepository = usersRepository;
+        this.userQuotaRootResolver = userQuotaRootResolver;
+        this.oldCurrentQuotaManager = oldCurrentQuotaManager;
+        this.newCurrentQuotaManager = newCurrentQuotaManager;
+    }
+
+    @Override
+    public void apply() throws InterruptedException {
+        Flux.from(usersRepository.listReactive())
+            .flatMap(this::migrateCurrentValue)
+            .then()
+            .block();
+    }
+
+    private Mono<Void> migrateCurrentValue(Username username) {
+        QuotaRoot quotaRoot = userQuotaRootResolver.forUser(username);
+
+        return Mono.from(oldCurrentQuotaManager.getCurrentQuotas(quotaRoot))
+            .flatMap(currentQuotas -> Mono.from(newCurrentQuotaManager.setCurrentQuotas(QuotaOperation.from(quotaRoot, currentQuotas))));
+    }
+}
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraCurrentQuotaManagerMigrationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraCurrentQuotaManagerMigrationTest.java
new file mode 100644
index 0000000000..cb33b72735
--- /dev/null
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraCurrentQuotaManagerMigrationTest.java
@@ -0,0 +1,124 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.cassandra.quota.migration;
+
+import static org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver.SEPARATOR;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.commons.configuration2.BaseHierarchicalConfiguration;
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
+import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
+import org.apache.james.core.Domain;
+import org.apache.james.core.Username;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
+import org.apache.james.domainlist.api.DomainList;
+import org.apache.james.domainlist.api.mock.SimpleDomainList;
+import org.apache.james.domainlist.cassandra.CassandraDomainListModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
+import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV1;
+import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV2;
+import org.apache.james.mailbox.model.CurrentQuotas;
+import org.apache.james.mailbox.model.MailboxConstants;
+import org.apache.james.mailbox.model.QuotaOperation;
+import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.UserQuotaRootResolver;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.cassandra.CassandraUsersDAO;
+import org.apache.james.user.cassandra.CassandraUsersRepositoryModule;
+import org.apache.james.user.lib.UsersRepositoryImpl;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+public class CassandraCurrentQuotaManagerMigrationTest {
+    private static final Username BOB = Username.of("bob");
+    private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot(MailboxConstants.USER_NAMESPACE + SEPARATOR + BOB.asString(), BOB.getDomainPart());
+
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(
+        CassandraQuotaModule.MODULE,
+        CassandraUsersRepositoryModule.MODULE,
+        CassandraDomainListModule.MODULE,
+        CassandraMutualizedQuotaModule.MODULE));
+
+    private UsersRepositoryImpl<CassandraUsersDAO> getUsersRepository() throws Exception {
+        boolean enableVirtualHosting = false;
+        DomainList domainList = new SimpleDomainList();
+        domainList.addDomain(Domain.of("domain.tld"));
+        CassandraUsersDAO usersDAO = new CassandraUsersDAO(cassandraCluster.getCassandraCluster().getConf());
+        BaseHierarchicalConfiguration configuration = new BaseHierarchicalConfiguration();
+        configuration.addProperty("enableVirtualHosting", String.valueOf(enableVirtualHosting));
+
+        UsersRepositoryImpl<CassandraUsersDAO> usersRepository = new UsersRepositoryImpl<>(domainList, usersDAO);
+        usersRepository.configure(configuration);
+        return usersRepository;
+    }
+
+    private CassandraCurrentQuotaManagerV1 oldCurrentQuotaManager;
+    private CassandraCurrentQuotaManagerV2 newCurrentQuotaManager;
+    private UserQuotaRootResolver userQuotaRootResolver;
+    private CassandraCurrentQuotaManagerMigration testee;
+
+    @BeforeEach
+    void setUp() throws Exception {
+        CassandraCluster cassandra = cassandraCluster.getCassandraCluster();
+
+        oldCurrentQuotaManager = new CassandraCurrentQuotaManagerV1(cassandra.getConf());
+        newCurrentQuotaManager = new CassandraCurrentQuotaManagerV2(new CassandraQuotaCurrentValueDao(cassandra.getConf()));
+        UsersRepository usersRepository = getUsersRepository();
+
+        usersRepository.addUser(BOB, "passBob");
+
+        userQuotaRootResolver = mock(UserQuotaRootResolver.class);
+        when(userQuotaRootResolver.forUser(eq(BOB))).thenReturn(QUOTA_ROOT);
+
+        testee = new CassandraCurrentQuotaManagerMigration(usersRepository, userQuotaRootResolver, oldCurrentQuotaManager, newCurrentQuotaManager);
+    }
+
+    @Test
+    void shouldMigrateQuotaUsage() throws Exception {
+        CurrentQuotas currentQuotas = new CurrentQuotas(QuotaCountUsage.count(42L), QuotaSizeUsage.size(172L));
+        QuotaOperation quotaOperation =  QuotaOperation.from(QUOTA_ROOT, currentQuotas);
+
+        oldCurrentQuotaManager.setCurrentQuotas(quotaOperation).block();
+
+        testee.apply();
+
+        assertThat(newCurrentQuotaManager.getCurrentQuotas(QUOTA_ROOT).block())
+            .isEqualTo(currentQuotas);
+    }
+
+    @Test
+    void shouldNotFailWhenNoQuota() throws Exception {
+        CurrentQuotas defaultQuota = new CurrentQuotas(QuotaCountUsage.count(0L), QuotaSizeUsage.size(0L));
+
+        testee.apply();
+
+        assertThat(newCurrentQuotaManager.getCurrentQuotas(QUOTA_ROOT).block())
+            .isEqualTo(defaultQuota);
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 12/14: JAMES-3926 Using CassandraCurrentQuotaManagerV2 instead of deprecated V1 for Cassandra tests

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5e859cf2391598236835111bb5a5e373a7e1634d
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Wed Aug 30 14:35:30 2023 +0700

    JAMES-3926 Using CassandraCurrentQuotaManagerV2 instead of deprecated V1 for Cassandra tests
---
 .../james/mailbox/cassandra/CassandraMailboxManagerProvider.java   | 5 +++--
 .../apache/james/mailbox/cassandra/CassandraTestSystemFixture.java | 5 +++--
 .../james/mailbox/cassandra/mail/MailboxAggregateModule.java       | 3 +--
 .../mail/task/CassandraRecomputeCurrentQuotasServiceTest.java      | 7 +++++--
 .../james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java  | 5 +++--
 .../jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java  | 1 -
 6 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
index 105938088c..a0122c7a87 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
@@ -23,6 +23,7 @@ import java.time.Clock;
 import java.time.Instant;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.events.EventBusTestFixture;
 import org.apache.james.events.InVMEventBus;
@@ -34,7 +35,7 @@ import org.apache.james.mailbox.Authorizator;
 import org.apache.james.mailbox.acl.MailboxACLResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV1;
+import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV2;
 import org.apache.james.mailbox.cassandra.quota.CassandraGlobalMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerDomainMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaDao;
@@ -117,7 +118,7 @@ public class CassandraMailboxManagerProvider {
         CassandraPerUserMaxQuotaManager maxQuotaManager = new CassandraPerUserMaxQuotaManager(new CassandraPerUserMaxQuotaDao(session),
             new CassandraPerDomainMaxQuotaDao(session),
             new CassandraGlobalMaxQuotaDao(session));
-        CassandraCurrentQuotaManagerV1 currentQuotaUpdater = new CassandraCurrentQuotaManagerV1(session);
+        CassandraCurrentQuotaManagerV2 currentQuotaUpdater = new CassandraCurrentQuotaManagerV2(new CassandraQuotaCurrentValueDao(session));
         StoreQuotaManager storeQuotaManager = new StoreQuotaManager(currentQuotaUpdater, maxQuotaManager);
         QuotaRootResolver quotaRootResolver = new DefaultUserQuotaRootResolver(sessionProvider, mapperFactory);
         ListeningCurrentQuotaUpdater quotaUpdater = new ListeningCurrentQuotaUpdater(currentQuotaUpdater, quotaRootResolver, eventBus, storeQuotaManager);
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
index f3839faed7..71e516986e 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
@@ -24,6 +24,7 @@ import static org.mockito.Mockito.mock;
 import java.time.Instant;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
 import org.apache.james.events.EventBus;
 import org.apache.james.events.EventBusTestFixture;
 import org.apache.james.events.InVMEventBus;
@@ -34,7 +35,7 @@ import org.apache.james.mailbox.Authenticator;
 import org.apache.james.mailbox.Authorizator;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV1;
+import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV2;
 import org.apache.james.mailbox.cassandra.quota.CassandraGlobalMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerDomainMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaDao;
@@ -109,7 +110,7 @@ public class CassandraTestSystemFixture {
     }
 
     public static CurrentQuotaManager createCurrentQuotaManager(CassandraCluster cassandra) {
-        return new CassandraCurrentQuotaManagerV1(cassandra.getConf());
+        return new CassandraCurrentQuotaManagerV2(new CassandraQuotaCurrentValueDao(cassandra.getConf()));
     }
 
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxAggregateModule.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxAggregateModule.java
index e4183c7972..dd8c2b7c9d 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxAggregateModule.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxAggregateModule.java
@@ -32,7 +32,6 @@ import org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMailboxQuotaModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
@@ -61,5 +60,5 @@ public interface MailboxAggregateModule {
         CassandraUidModule.MODULE,
         CassandraThreadModule.MODULE);
 
-    CassandraModule MODULE_WITH_QUOTA = CassandraModule.aggregateModules(CassandraQuotaModule.MODULE, CassandraMailboxQuotaModule.MODULE, CassandraMutualizedQuotaModule.MODULE, MODULE);
+    CassandraModule MODULE_WITH_QUOTA = CassandraModule.aggregateModules(CassandraQuotaModule.MODULE, CassandraMutualizedQuotaModule.MODULE, MODULE);
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
index 9b5d3b628a..d248dc6ac5 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
@@ -49,6 +49,7 @@ import org.apache.james.user.cassandra.CassandraUsersDAO;
 import org.apache.james.user.cassandra.CassandraUsersRepositoryModule;
 import org.apache.james.user.lib.UsersRepositoryImpl;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
@@ -119,6 +120,7 @@ public class CassandraRecomputeCurrentQuotasServiceTest implements RecomputeCurr
         return testee;
     }
 
+    @Disabled("JAMES-3926: new CassandraQuotaCurrentValueDao does not crash at failure on increase and decrease operations, thus we can't simulate the recompute task to fail by failing those cassandra queries")
     @Test
     void recomputeCurrentQuotasShouldReturnPartialWhenFailureAtReset() throws Exception {
         usersRepository().addUser(USER_1, PASSWORD);
@@ -131,12 +133,13 @@ public class CassandraRecomputeCurrentQuotasServiceTest implements RecomputeCurr
 
         cassandraCluster.getCassandraCluster().getConf().registerScenario(fail()
             .times(1)
-            .whenQueryStartsWith("UPDATE currentquota SET"));
+            .whenQueryStartsWith("UPDATE quotacurrentvalue SET"));
 
         assertThat(testee().recomputeCurrentQuotas(new RecomputeCurrentQuotasService.Context(), RunningOptions.DEFAULT).block())
             .isEqualTo(Task.Result.PARTIAL);
     }
 
+    @Disabled("JAMES-3926: new CassandraQuotaCurrentValueDao does not crash at failure on increase and decrease operations, thus we can't simulate the recompute task to fail by failing those cassandra queries")
     @Test
     void recomputeCurrentQuotasShouldUpdateContextWhenFailureAtReset() throws Exception {
         usersRepository().addUser(USER_1, PASSWORD);
@@ -149,7 +152,7 @@ public class CassandraRecomputeCurrentQuotasServiceTest implements RecomputeCurr
 
         cassandraCluster.getCassandraCluster().getConf().registerScenario(fail()
             .times(1)
-            .whenQueryStartsWith("UPDATE currentquota SET"));
+            .whenQueryStartsWith("UPDATE quotacurrentvalue SET"));
 
         RecomputeCurrentQuotasService.Context context = new RecomputeCurrentQuotasService.Context();
         testee().recomputeCurrentQuotas(context, RunningOptions.DEFAULT).block();
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
index 0c863bee60..2c64cc1afa 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
@@ -21,6 +21,7 @@ package org.apache.james.mpt.imapmailbox.cassandra.host;
 import java.time.Instant;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
 import org.apache.james.core.quota.QuotaCountLimit;
 import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.events.EventBusTestFixture;
@@ -37,7 +38,7 @@ import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
 import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
 import org.apache.james.mailbox.cassandra.TestCassandraMailboxSessionMapperFactory;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV1;
+import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV2;
 import org.apache.james.mailbox.cassandra.quota.CassandraGlobalMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerDomainMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaDao;
@@ -114,7 +115,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
             new CassandraPerUserMaxQuotaDao(session),
             new CassandraPerDomainMaxQuotaDao(cassandra.getConf()),
             new CassandraGlobalMaxQuotaDao(session));
-        CassandraCurrentQuotaManagerV1 currentQuotaManager = new CassandraCurrentQuotaManagerV1(session);
+        CassandraCurrentQuotaManagerV2 currentQuotaManager = new CassandraCurrentQuotaManagerV2(new CassandraQuotaCurrentValueDao(session));
         StoreQuotaManager quotaManager = new StoreQuotaManager(currentQuotaManager, perUserMaxQuotaManager);
         ListeningCurrentQuotaUpdater quotaUpdater = new ListeningCurrentQuotaUpdater(currentQuotaManager, quotaRootResolver, eventBus, quotaManager);
         QuotaComponents quotaComponents = new QuotaComponents(perUserMaxQuotaManager, quotaManager, quotaRootResolver);
diff --git a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java
index 1f9c4ba118..c029f3e128 100644
--- a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java
+++ b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java
@@ -25,7 +25,6 @@ import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaMo
 import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
 import org.apache.james.jmap.api.upload.UploadUsageRepository;
 import org.apache.james.jmap.api.upload.UploadUsageRepositoryContract;
-import org.apache.james.mailbox.cassandra.modules.CassandraMailboxQuotaModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.RegisterExtension;


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 11/14: JAMES-3926 fetch current mailbox quotas with only 1 cassandra request

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 933aba1047cbff6c173bc09819fae00b87a6894b
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Tue Aug 29 11:22:13 2023 +0700

    JAMES-3926 fetch current mailbox quotas with only 1 cassandra request
---
 .../components/CassandraQuotaCurrentValueDao.java  | 17 +++++++++++++
 .../quota/CassandraQuotaCurrentValueDaoTest.java   | 28 ++++++++++++++++++----
 .../quota/CassandraCurrentQuotaManagerV2.java      | 27 +++++++++++++++++----
 3 files changed, 64 insertions(+), 8 deletions(-)

diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueDao.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueDao.java
index 62f09ffb62..2c77929750 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueDao.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueDao.java
@@ -49,6 +49,7 @@ import com.datastax.oss.driver.api.querybuilder.select.Select;
 import com.datastax.oss.driver.api.querybuilder.update.Update;
 import com.google.common.base.MoreObjects;
 
+import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
 public class CassandraQuotaCurrentValueDao {
@@ -112,6 +113,7 @@ public class CassandraQuotaCurrentValueDao {
     private final PreparedStatement increaseStatement;
     private final PreparedStatement decreaseStatement;
     private final PreparedStatement getQuotaCurrentValueStatement;
+    private final PreparedStatement getQuotasByComponentStatement;
     private final PreparedStatement deleteQuotaCurrentValueStatement;
 
     @Inject
@@ -120,6 +122,7 @@ public class CassandraQuotaCurrentValueDao {
         this.increaseStatement = session.prepare(increaseStatement().build());
         this.decreaseStatement = session.prepare(decreaseStatement().build());
         this.getQuotaCurrentValueStatement = session.prepare(getQuotaCurrentValueStatement().build());
+        this.getQuotasByComponentStatement = session.prepare(getQuotasByComponentStatement().build());
         this.deleteQuotaCurrentValueStatement = session.prepare(deleteQuotaCurrentValueStatement().build());
     }
 
@@ -164,6 +167,13 @@ public class CassandraQuotaCurrentValueDao {
             .setString(QUOTA_TYPE, quotaKey.getQuotaType().getValue()));
     }
 
+    public Flux<QuotaCurrentValue> getQuotasByComponent(QuotaComponent quotaComponent, String identifier) {
+        return queryExecutor.executeRows(getQuotasByComponentStatement.bind()
+                .setString(QUOTA_COMPONENT, quotaComponent.getValue())
+                .setString(IDENTIFIER, identifier))
+            .map(row -> convertRowToModel(row));
+    }
+
     private Update increaseStatement() {
         return update(TABLE_NAME)
             .increment(CURRENT_VALUE, bindMarker(CURRENT_VALUE))
@@ -188,6 +198,13 @@ public class CassandraQuotaCurrentValueDao {
                 column(QUOTA_TYPE).isEqualTo(bindMarker(QUOTA_TYPE)));
     }
 
+    private Select getQuotasByComponentStatement() {
+        return selectFrom(TABLE_NAME)
+            .all()
+            .where(column(IDENTIFIER).isEqualTo(bindMarker(IDENTIFIER)),
+                column(QUOTA_COMPONENT).isEqualTo(bindMarker(QUOTA_COMPONENT)));
+    }
+
     private Delete deleteQuotaCurrentValueStatement() {
         return deleteFrom(TABLE_NAME)
             .where(column(IDENTIFIER).isEqualTo(bindMarker(IDENTIFIER)),
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
index 139e8d5dfc..8460b11146 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
@@ -21,10 +21,13 @@ package org.apache.james.backends.cassandra.quota;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.util.List;
+
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
 import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
+import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao.QuotaKey;
 import org.apache.james.core.quota.QuotaComponent;
 import org.apache.james.core.quota.QuotaCurrentValue;
 import org.apache.james.core.quota.QuotaType;
@@ -33,14 +36,12 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 public class CassandraQuotaCurrentValueDaoTest {
-
-    private static final CassandraQuotaCurrentValueDao.QuotaKey QUOTA_KEY
-        = CassandraQuotaCurrentValueDao.QuotaKey.of(QuotaComponent.MAILBOX, "james@abc.com", QuotaType.SIZE);
+    private static final QuotaKey QUOTA_KEY = QuotaKey.of(QuotaComponent.MAILBOX, "james@abc.com", QuotaType.SIZE);
 
     private CassandraQuotaCurrentValueDao cassandraQuotaCurrentValueDao;
 
     @RegisterExtension
-    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(CassandraMutualizedQuotaModule.MODULE));
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraMutualizedQuotaModule.MODULE);
 
     @BeforeEach
     void setup() {
@@ -121,4 +122,23 @@ public class CassandraQuotaCurrentValueDaoTest {
         cassandraQuotaCurrentValueDao.decrease(QUOTA_KEY, 100l).block();
         cassandraCluster.unpause();
     }
+
+    @Test
+    void getQuotasByComponentShouldGetAllQuotaTypesSuccessfully() {
+        QuotaKey countQuotaKey = QuotaKey.of(QuotaComponent.MAILBOX, "james@abc.com", QuotaType.COUNT);
+
+        QuotaCurrentValue expectedQuotaSize = QuotaCurrentValue.builder().quotaComponent(QUOTA_KEY.getQuotaComponent())
+            .identifier(QUOTA_KEY.getIdentifier()).quotaType(QUOTA_KEY.getQuotaType()).currentValue(100l).build();
+        QuotaCurrentValue expectedQuotaCount = QuotaCurrentValue.builder().quotaComponent(countQuotaKey.getQuotaComponent())
+            .identifier(countQuotaKey.getIdentifier()).quotaType(countQuotaKey.getQuotaType()).currentValue(56l).build();
+
+        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100l).block();
+        cassandraQuotaCurrentValueDao.increase(countQuotaKey, 56l).block();
+
+        List<QuotaCurrentValue> actual = cassandraQuotaCurrentValueDao.getQuotasByComponent(QUOTA_KEY.getQuotaComponent(), QUOTA_KEY.getIdentifier())
+            .collectList()
+            .block();
+
+        assertThat(actual).containsExactlyInAnyOrder(expectedQuotaSize, expectedQuotaCount);
+    }
 }
\ No newline at end of file
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2.java
index 7eb85da2b0..15746cd2e6 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.mailbox.cassandra.quota;
 
+import java.util.List;
+import java.util.Optional;
 import java.util.function.Predicate;
 
 import javax.inject.Inject;
@@ -63,10 +65,27 @@ public class CassandraCurrentQuotaManagerV2 implements CurrentQuotaManager {
 
     @Override
     public Mono<CurrentQuotas> getCurrentQuotas(QuotaRoot quotaRoot) {
-        return Mono.zip(
-                getCurrentMessageCount(quotaRoot),
-                getCurrentStorage(quotaRoot))
-            .map(tuple2 -> new CurrentQuotas(tuple2.getT1(), tuple2.getT2()));
+        return currentValueDao.getQuotasByComponent(QuotaComponent.MAILBOX, quotaRoot.asString())
+            .collectList()
+            .map(this::buildCurrentQuotas);
+    }
+
+    private CurrentQuotas buildCurrentQuotas(List<QuotaCurrentValue> quotaCurrentValues) {
+        QuotaCountUsage count = extractQuotaByType(quotaCurrentValues, QuotaType.COUNT)
+            .map(value -> QuotaCountUsage.count(value.getCurrentValue()))
+            .orElse(QuotaCountUsage.count(0L));
+
+        QuotaSizeUsage size = extractQuotaByType(quotaCurrentValues, QuotaType.SIZE)
+            .map(value -> QuotaSizeUsage.size(value.getCurrentValue()))
+            .orElse(QuotaSizeUsage.size(0L));
+
+        return new CurrentQuotas(count, size);
+    }
+
+    private Optional<QuotaCurrentValue> extractQuotaByType(List<QuotaCurrentValue> quotaCurrentValues, QuotaType quotaType) {
+        return quotaCurrentValues.stream()
+            .filter(quotaValue -> quotaValue.getQuotaType().equals(quotaType))
+            .findAny();
     }
 
     @Override


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 04/14: JAMES-3926 Implement FakeCassandraCurrentQuotaManager

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit c75c7dbc27cd053b8442a2a9dc94d46b0c34e59b
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Aug 25 15:40:10 2023 +0700

    JAMES-3926 Implement FakeCassandraCurrentQuotaManager
---
 .../quota/FakeCassandraCurrentQuotaManager.java    | 69 ++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/FakeCassandraCurrentQuotaManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/FakeCassandraCurrentQuotaManager.java
new file mode 100644
index 0000000000..0392af55a9
--- /dev/null
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/FakeCassandraCurrentQuotaManager.java
@@ -0,0 +1,69 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.cassandra.quota;
+
+import javax.inject.Inject;
+
+import org.apache.commons.lang3.NotImplementedException;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
+import org.apache.james.mailbox.model.CurrentQuotas;
+import org.apache.james.mailbox.model.QuotaOperation;
+import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
+
+import reactor.core.publisher.Mono;
+
+public class FakeCassandraCurrentQuotaManager implements CurrentQuotaManager {
+    @Inject
+    public FakeCassandraCurrentQuotaManager() {
+
+    }
+
+    @Override
+    public Mono<QuotaCountUsage> getCurrentMessageCount(QuotaRoot quotaRoot) {
+        return Mono.error(new NotImplementedException());
+    }
+
+    @Override
+    public Mono<QuotaSizeUsage> getCurrentStorage(QuotaRoot quotaRoot) {
+        return Mono.error(new NotImplementedException());
+    }
+
+    @Override
+    public Mono<CurrentQuotas> getCurrentQuotas(QuotaRoot quotaRoot) {
+        return Mono.error(new NotImplementedException());
+    }
+
+    @Override
+    public Mono<Void> increase(QuotaOperation quotaOperation) {
+        return Mono.error(new NotImplementedException());
+    }
+
+    @Override
+    public Mono<Void> decrease(QuotaOperation quotaOperation) {
+        return Mono.error(new NotImplementedException());
+    }
+
+    @Override
+    public Mono<Void> setCurrentQuotas(QuotaOperation quotaOperation) {
+        return Mono.error(new NotImplementedException());
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 14/14: JAMES-3926 Fix issues with recompute quota tests in ConsistencyTasksIntegrationTest

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5c51d0fe610a4b6d5d6d5bb198a61e21c0cbe8bb
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Thu Aug 31 16:09:01 2023 +0700

    JAMES-3926 Fix issues with recompute quota tests in ConsistencyTasksIntegrationTest
---
 .../integration/rabbitmq/ConsistencyTasksIntegrationTest.java         | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java
index 063e351697..585cd0ce69 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java
@@ -303,7 +303,7 @@ class ConsistencyTasksIntegrationTest {
     void shouldRecomputeQuotas(GuiceJamesServer server) throws Exception {
         Barrier barrier1 = new Barrier();
         Barrier barrier2 = new Barrier();
-        String updatedQuotaQueryString = "UPDATE currentquota SET messagecount";
+        String updatedQuotaQueryString = "UPDATE quotacurrentvalue SET";
         server.getProbe(TestingSessionProbe.class)
             .getTestingSession().registerScenario(
                 awaitOn(barrier1) // Event bus first execution
@@ -482,7 +482,7 @@ class ConsistencyTasksIntegrationTest {
                 awaitOn(barrier) // Event bus first execution
                     .thenExecuteNormally()
                     .times(1)
-                    .whenQueryStartsWith("UPDATE currentquota SET messagecount"));
+                    .whenQueryStartsWith("UPDATE quotacurrentvalue SET"));
 
         smtpMessageSender.connect(LOCALHOST_IP, server.getProbe(SmtpGuiceProbe.class).getSmtpPort())
             .sendMessageWithHeaders(ALICE.asString(), BOB.asString(), MESSAGE);


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 02/14: JAMES-3926 Move mutualized quota DAOs to backend/cassandra

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 81e4982b5bdd2424eed50c32e8c14bc0775365e6
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Thu Aug 24 14:46:31 2023 +0700

    JAMES-3926 Move mutualized quota DAOs to backend/cassandra
---
 .../components/CassandraMutualizedQuotaModule.java | 47 +---------------------
 .../components}/CassandraQuotaCurrentValueDao.java | 12 +++---
 .../CassandraQuotaCurrentValueTable.java           |  2 +-
 .../components}/CassandraQuotaLimitDao.java        | 14 +++----
 .../components}/CassandraQuotaLimitTable.java      |  2 +-
 .../quota/CassandraQuotaCurrentValueDaoTest.java   | 32 +++++----------
 .../quota/CassandraQuotaLimitDaoTest.java          | 16 +++-----
 .../cassandra/modules/CassandraQuotaModule.java    | 22 ----------
 .../cassandra/mail/MailboxAggregateModule.java     |  3 +-
 .../quota/CassandraCurrentQuotaManagerV1Test.java  |  5 ++-
 .../quota/CassandraPerUserMaxQuotaManagerTest.java |  4 +-
 .../modules/mailbox/CassandraQuotaModule.java      |  6 ++-
 .../upload/CassandraUploadUsageRepository.java     |  2 +-
 .../upload/CassandraUploadUsageRepositoryTest.java |  2 +-
 14 files changed, 48 insertions(+), 121 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraMutualizedQuotaModule.java
similarity index 50%
copy from mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java
copy to backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraMutualizedQuotaModule.java
index 9164b27a7a..f370477920 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraMutualizedQuotaModule.java
@@ -17,60 +17,17 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.cassandra.modules;
+package org.apache.james.backends.cassandra.components;
 
 import static com.datastax.oss.driver.api.core.type.DataTypes.BIGINT;
 import static com.datastax.oss.driver.api.core.type.DataTypes.COUNTER;
 import static com.datastax.oss.driver.api.core.type.DataTypes.TEXT;
 import static com.datastax.oss.driver.api.querybuilder.SchemaBuilder.RowsPerPartition.rows;
 
-import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.utils.CassandraConstants;
-import org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota;
-import org.apache.james.mailbox.cassandra.table.CassandraDomainMaxQuota;
-import org.apache.james.mailbox.cassandra.table.CassandraGlobalMaxQuota;
-import org.apache.james.mailbox.cassandra.table.CassandraMaxQuota;
-import org.apache.james.mailbox.cassandra.table.CassandraQuotaCurrentValueTable;
-import org.apache.james.mailbox.cassandra.table.CassandraQuotaLimitTable;
 
-public interface CassandraQuotaModule {
+public interface CassandraMutualizedQuotaModule {
     CassandraModule MODULE = CassandraModule.builder()
-        .table(CassandraCurrentQuota.TABLE_NAME)
-        .comment("Holds per quota-root current values. Quota-roots defines groups of mailboxes which shares quotas limitations.")
-        .options(options -> options
-            .withCaching(true, rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
-        .statement(statement -> types -> statement
-            .withPartitionKey(CassandraCurrentQuota.QUOTA_ROOT, TEXT)
-            .withColumn(CassandraCurrentQuota.MESSAGE_COUNT, COUNTER)
-            .withColumn(CassandraCurrentQuota.STORAGE, COUNTER))
-
-        .table(CassandraMaxQuota.TABLE_NAME)
-        .comment("Holds per quota-root limitations. Limitations can concern the number of messages in a quota-root or the total size of a quota-root.")
-        .options(options -> options
-            .withCaching(true, rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
-        .statement(statement -> types -> statement
-            .withPartitionKey(CassandraMaxQuota.QUOTA_ROOT, TEXT)
-            .withColumn(CassandraMaxQuota.MESSAGE_COUNT, BIGINT)
-            .withColumn(CassandraMaxQuota.STORAGE, BIGINT))
-
-        .table(CassandraDomainMaxQuota.TABLE_NAME)
-        .comment("Holds per domain limitations. Limitations can concern the number of messages in a quota-root or the total size of a quota-root.")
-        .options(options -> options
-            .withCaching(true, rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
-        .statement(statement -> types -> statement
-            .withPartitionKey(CassandraDomainMaxQuota.DOMAIN, TEXT)
-            .withColumn(CassandraDomainMaxQuota.MESSAGE_COUNT, BIGINT)
-            .withColumn(CassandraDomainMaxQuota.STORAGE, BIGINT))
-
-        .table(CassandraGlobalMaxQuota.TABLE_NAME)
-        .comment("Holds defaults limitations definition.")
-        .options(options -> options
-            .withCaching(true, rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
-        .statement(statement -> types -> statement
-            .withPartitionKey(CassandraGlobalMaxQuota.KEY, TEXT)
-            .withColumn(CassandraGlobalMaxQuota.STORAGE, BIGINT)
-            .withColumn(CassandraGlobalMaxQuota.MESSAGE, BIGINT))
-
         .table(CassandraQuotaLimitTable.TABLE_NAME)
         .comment("Holds quota limits.")
         .options(options -> options
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraQuotaCurrentValueDao.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueDao.java
similarity index 93%
rename from mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraQuotaCurrentValueDao.java
rename to backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueDao.java
index 4a5546a8cc..62f09ffb62 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraQuotaCurrentValueDao.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueDao.java
@@ -17,18 +17,18 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.cassandra.quota;
+package org.apache.james.backends.cassandra.components;
 
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.bindMarker;
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.deleteFrom;
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.selectFrom;
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.update;
 import static com.datastax.oss.driver.api.querybuilder.relation.Relation.column;
-import static org.apache.james.mailbox.cassandra.table.CassandraQuotaCurrentValueTable.CURRENT_VALUE;
-import static org.apache.james.mailbox.cassandra.table.CassandraQuotaCurrentValueTable.IDENTIFIER;
-import static org.apache.james.mailbox.cassandra.table.CassandraQuotaCurrentValueTable.QUOTA_COMPONENT;
-import static org.apache.james.mailbox.cassandra.table.CassandraQuotaCurrentValueTable.QUOTA_TYPE;
-import static org.apache.james.mailbox.cassandra.table.CassandraQuotaCurrentValueTable.TABLE_NAME;
+import static org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueTable.CURRENT_VALUE;
+import static org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueTable.IDENTIFIER;
+import static org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueTable.QUOTA_COMPONENT;
+import static org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueTable.QUOTA_TYPE;
+import static org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueTable.TABLE_NAME;
 
 import java.util.Objects;
 
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraQuotaCurrentValueTable.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueTable.java
similarity index 96%
rename from mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraQuotaCurrentValueTable.java
rename to backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueTable.java
index 5d3c088761..dbb5576b09 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraQuotaCurrentValueTable.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaCurrentValueTable.java
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.cassandra.table;
+package org.apache.james.backends.cassandra.components;
 
 import com.datastax.oss.driver.api.core.CqlIdentifier;
 
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraQuotaLimitDao.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaLimitDao.java
similarity index 93%
rename from mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraQuotaLimitDao.java
rename to backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaLimitDao.java
index 6062eebb6f..4a6844b0db 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraQuotaLimitDao.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaLimitDao.java
@@ -17,19 +17,19 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.cassandra.quota;
+package org.apache.james.backends.cassandra.components;
 
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.bindMarker;
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.deleteFrom;
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.insertInto;
 import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.selectFrom;
 import static com.datastax.oss.driver.api.querybuilder.relation.Relation.column;
-import static org.apache.james.mailbox.cassandra.table.CassandraQuotaLimitTable.IDENTIFIER;
-import static org.apache.james.mailbox.cassandra.table.CassandraQuotaLimitTable.QUOTA_COMPONENT;
-import static org.apache.james.mailbox.cassandra.table.CassandraQuotaLimitTable.QUOTA_LIMIT;
-import static org.apache.james.mailbox.cassandra.table.CassandraQuotaLimitTable.QUOTA_SCOPE;
-import static org.apache.james.mailbox.cassandra.table.CassandraQuotaLimitTable.QUOTA_TYPE;
-import static org.apache.james.mailbox.cassandra.table.CassandraQuotaLimitTable.TABLE_NAME;
+import static org.apache.james.backends.cassandra.components.CassandraQuotaLimitTable.IDENTIFIER;
+import static org.apache.james.backends.cassandra.components.CassandraQuotaLimitTable.QUOTA_COMPONENT;
+import static org.apache.james.backends.cassandra.components.CassandraQuotaLimitTable.QUOTA_LIMIT;
+import static org.apache.james.backends.cassandra.components.CassandraQuotaLimitTable.QUOTA_SCOPE;
+import static org.apache.james.backends.cassandra.components.CassandraQuotaLimitTable.QUOTA_TYPE;
+import static org.apache.james.backends.cassandra.components.CassandraQuotaLimitTable.TABLE_NAME;
 
 import java.util.Objects;
 
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraQuotaLimitTable.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaLimitTable.java
similarity index 96%
rename from mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraQuotaLimitTable.java
rename to backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaLimitTable.java
index b9215e3d31..bc84e89a18 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraQuotaLimitTable.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/components/CassandraQuotaLimitTable.java
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.cassandra.table;
+package org.apache.james.backends.cassandra.components;
 
 import com.datastax.oss.driver.api.core.CqlIdentifier;
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
similarity index 79%
rename from mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
rename to backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
index 447cca50c0..139e8d5dfc 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
@@ -17,19 +17,17 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.cassandra.quota;
+package org.apache.james.backends.cassandra.quota;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatRuntimeException;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.core.Username;
+import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
+import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
 import org.apache.james.core.quota.QuotaComponent;
 import org.apache.james.core.quota.QuotaCurrentValue;
 import org.apache.james.core.quota.QuotaType;
-import org.apache.james.mailbox.cassandra.mail.utils.GuiceUtils;
-import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -42,20 +40,11 @@ public class CassandraQuotaCurrentValueDaoTest {
     private CassandraQuotaCurrentValueDao cassandraQuotaCurrentValueDao;
 
     @RegisterExtension
-    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(CassandraQuotaModule.MODULE));
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(CassandraMutualizedQuotaModule.MODULE));
 
     @BeforeEach
-    private void setup() {
-        cassandraQuotaCurrentValueDao = GuiceUtils.testInjector(cassandraCluster.getCassandraCluster()).getInstance(CassandraQuotaCurrentValueDao.class);
-        resetCounterToZero();
-    }
-
-    private void resetCounterToZero() {
-        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 0).block();
-        QuotaCurrentValue quotaCurrentValue = cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block();
-        cassandraQuotaCurrentValueDao.decrease(QUOTA_KEY, quotaCurrentValue.getCurrentValue()).block();
-        QuotaCurrentValue actual = cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block();
-        assertThat(actual.getCurrentValue()).isEqualTo(0l);
+    void setup() {
+        cassandraQuotaCurrentValueDao = new CassandraQuotaCurrentValueDao(cassandraCluster.getCassandraCluster().getConf());
     }
 
     @Test
@@ -80,13 +69,12 @@ public class CassandraQuotaCurrentValueDaoTest {
 
     @Test
     void increaseQuotaCurrentValueShouldIncreaseValueSuccessfully() {
-        QuotaCurrentValue expected = QuotaCurrentValue.builder().quotaComponent(QUOTA_KEY.getQuotaComponent())
-            .identifier(QUOTA_KEY.getIdentifier()).quotaType(QUOTA_KEY.getQuotaType()).currentValue(200l).build();
-        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100l).block();
-        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100l).block();
+        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100L).block();
+        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100L).block();
 
         QuotaCurrentValue actual = cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block();
-        assertThat(actual).isEqualTo(expected);
+
+        assertThat(actual.getCurrentValue()).isEqualTo(200L);
     }
 
     @Test
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraQuotaLimitDaoTest.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaLimitDaoTest.java
similarity index 90%
rename from mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraQuotaLimitDaoTest.java
rename to backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaLimitDaoTest.java
index 15c9f9cdae..2c260d6e05 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraQuotaLimitDaoTest.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaLimitDaoTest.java
@@ -17,22 +17,18 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.cassandra.quota;
+package org.apache.james.backends.cassandra.quota;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import java.util.Arrays;
-import java.util.List;
-
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.blob.cassandra.CassandraBlobModule;
+import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
+import org.apache.james.backends.cassandra.components.CassandraQuotaLimitDao;
 import org.apache.james.core.quota.QuotaComponent;
 import org.apache.james.core.quota.QuotaLimit;
 import org.apache.james.core.quota.QuotaScope;
 import org.apache.james.core.quota.QuotaType;
-import org.apache.james.mailbox.cassandra.mail.utils.GuiceUtils;
-import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -42,11 +38,11 @@ public class CassandraQuotaLimitDaoTest {
     private CassandraQuotaLimitDao cassandraQuotaLimitDao;
 
     @RegisterExtension
-    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(CassandraQuotaModule.MODULE));
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(CassandraMutualizedQuotaModule.MODULE));
 
     @BeforeEach
-    private void setup() {
-        cassandraQuotaLimitDao = GuiceUtils.testInjector(cassandraCluster.getCassandraCluster()).getInstance(CassandraQuotaLimitDao.class);
+    void setup() {
+        cassandraQuotaLimitDao = new CassandraQuotaLimitDao(cassandraCluster.getCassandraCluster().getConf());
     }
 
     @Test
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java
index 9164b27a7a..196ce14cbb 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java
@@ -30,8 +30,6 @@ import org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota;
 import org.apache.james.mailbox.cassandra.table.CassandraDomainMaxQuota;
 import org.apache.james.mailbox.cassandra.table.CassandraGlobalMaxQuota;
 import org.apache.james.mailbox.cassandra.table.CassandraMaxQuota;
-import org.apache.james.mailbox.cassandra.table.CassandraQuotaCurrentValueTable;
-import org.apache.james.mailbox.cassandra.table.CassandraQuotaLimitTable;
 
 public interface CassandraQuotaModule {
     CassandraModule MODULE = CassandraModule.builder()
@@ -71,25 +69,5 @@ public interface CassandraQuotaModule {
             .withColumn(CassandraGlobalMaxQuota.STORAGE, BIGINT)
             .withColumn(CassandraGlobalMaxQuota.MESSAGE, BIGINT))
 
-        .table(CassandraQuotaLimitTable.TABLE_NAME)
-        .comment("Holds quota limits.")
-        .options(options -> options
-            .withCaching(true, rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
-        .statement(statement -> types -> statement
-            .withPartitionKey(CassandraQuotaLimitTable.QUOTA_SCOPE, TEXT)
-            .withPartitionKey(CassandraQuotaLimitTable.IDENTIFIER, TEXT)
-            .withClusteringColumn(CassandraQuotaLimitTable.QUOTA_COMPONENT, TEXT)
-            .withClusteringColumn(CassandraQuotaLimitTable.QUOTA_TYPE, TEXT)
-            .withColumn(CassandraQuotaLimitTable.QUOTA_LIMIT, BIGINT))
-
-        .table(CassandraQuotaCurrentValueTable.TABLE_NAME)
-        .comment("Holds quota current values.")
-        .options(options -> options
-            .withCaching(true, rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
-        .statement(statement -> types -> statement
-            .withPartitionKey(CassandraQuotaCurrentValueTable.IDENTIFIER, TEXT)
-            .withClusteringColumn(CassandraQuotaCurrentValueTable.QUOTA_COMPONENT, TEXT)
-            .withClusteringColumn(CassandraQuotaCurrentValueTable.QUOTA_TYPE, TEXT)
-            .withColumn(CassandraQuotaCurrentValueTable.CURRENT_VALUE, COUNTER))
         .build();
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxAggregateModule.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxAggregateModule.java
index 8ecda80089..dd8c2b7c9d 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxAggregateModule.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxAggregateModule.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.cassandra.mail;
 
 import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.eventsourcing.eventstore.cassandra.CassandraEventStoreModule;
@@ -59,5 +60,5 @@ public interface MailboxAggregateModule {
         CassandraUidModule.MODULE,
         CassandraThreadModule.MODULE);
 
-    CassandraModule MODULE_WITH_QUOTA = CassandraModule.aggregateModules(CassandraQuotaModule.MODULE, MODULE);
+    CassandraModule MODULE_WITH_QUOTA = CassandraModule.aggregateModules(CassandraQuotaModule.MODULE, CassandraMutualizedQuotaModule.MODULE, MODULE);
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
index 1d8202a9f1..5908cbdd06 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
@@ -20,6 +20,8 @@
 package org.apache.james.mailbox.cassandra.quota;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.CurrentQuotaManagerContract;
@@ -28,7 +30,8 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class CassandraCurrentQuotaManagerV1Test implements CurrentQuotaManagerContract {
 
     @RegisterExtension
-    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraQuotaModule.MODULE);
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(CassandraQuotaModule.MODULE,
+        CassandraMutualizedQuotaModule.MODULE));
 
     @Override
     public CurrentQuotaManager testee() {
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerTest.java
index 140ac4a522..c1d3adb69f 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerTest.java
@@ -25,6 +25,7 @@ import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.StatementRecorder;
 import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
 import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.mail.utils.GuiceUtils;
 import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
@@ -38,7 +39,8 @@ class CassandraPerUserMaxQuotaManagerTest extends GenericMaxQuotaManagerTest {
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(
         CassandraBlobModule.MODULE,
-        CassandraQuotaModule.MODULE));
+        CassandraQuotaModule.MODULE,
+        CassandraMutualizedQuotaModule.MODULE));
 
     @Override
     protected MaxQuotaManager provideMaxQuotaManager() {
diff --git a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
index 93eb2a9284..9100d2b38f 100644
--- a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
+++ b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
@@ -20,14 +20,15 @@
 package org.apache.james.modules.mailbox;
 
 import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
+import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
+import org.apache.james.backends.cassandra.components.CassandraQuotaLimitDao;
 import org.apache.james.events.EventListener;
 import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV1;
 import org.apache.james.mailbox.cassandra.quota.CassandraGlobalMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerDomainMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaManager;
-import org.apache.james.mailbox.cassandra.quota.CassandraQuotaCurrentValueDao;
-import org.apache.james.mailbox.cassandra.quota.CassandraQuotaLimitDao;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
@@ -66,6 +67,7 @@ public class CassandraQuotaModule extends AbstractModule {
 
         Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
         cassandraDataDefinitions.addBinding().toInstance(org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule.MODULE);
+        cassandraDataDefinitions.addBinding().toInstance(CassandraMutualizedQuotaModule.MODULE);
 
         bind(ListeningCurrentQuotaUpdater.class).in(Scopes.SINGLETON);
         bind(QuotaUpdater.class).to(ListeningCurrentQuotaUpdater.class);
diff --git a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepository.java b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepository.java
index 83f52adca1..7ceb174aa5 100644
--- a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepository.java
+++ b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepository.java
@@ -21,12 +21,12 @@ package org.apache.james.jmap.cassandra.upload;
 
 import javax.inject.Inject;
 
+import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
 import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaComponent;
 import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.core.quota.QuotaType;
 import org.apache.james.jmap.api.upload.UploadUsageRepository;
-import org.apache.james.mailbox.cassandra.quota.CassandraQuotaCurrentValueDao;
 
 import reactor.core.publisher.Mono;
 
diff --git a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java
index 9eab33a494..f35ef96d98 100644
--- a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java
+++ b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java
@@ -21,10 +21,10 @@ package org.apache.james.jmap.cassandra.upload;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
 import org.apache.james.jmap.api.upload.UploadUsageRepository;
 import org.apache.james.jmap.api.upload.UploadUsageRepositoryContract;
 import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
-import org.apache.james.mailbox.cassandra.quota.CassandraQuotaCurrentValueDao;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.RegisterExtension;
 


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 01/14: JAMES-3926 Rename CassandraCurrentQuotaManager to CassandraCurrentQuotaManagerV1

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit dba9304e9e45845c51988f82ac7c95a672bdcaef
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Aug 25 14:28:45 2023 +0700

    JAMES-3926 Rename CassandraCurrentQuotaManager to CassandraCurrentQuotaManagerV1
---
 ...CurrentQuotaManager.java => CassandraCurrentQuotaManagerV1.java} | 4 ++--
 .../james/mailbox/cassandra/CassandraMailboxManagerProvider.java    | 4 ++--
 .../apache/james/mailbox/cassandra/CassandraTestSystemFixture.java  | 4 ++--
 ...uotaManagerTest.java => CassandraCurrentQuotaManagerV1Test.java} | 4 ++--
 .../james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java   | 4 ++--
 .../java/org/apache/james/modules/mailbox/CassandraQuotaModule.java | 6 +++---
 6 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1.java
similarity index 97%
rename from mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
rename to mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1.java
index 8872ad3229..661ddf1a9e 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1.java
@@ -46,7 +46,7 @@ import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 
 import reactor.core.publisher.Mono;
 
-public class CassandraCurrentQuotaManager implements CurrentQuotaManager {
+public class CassandraCurrentQuotaManagerV1 implements CurrentQuotaManager {
 
     private final CassandraAsyncExecutor cassandraAsyncExecutor;
     private final PreparedStatement increaseStatement;
@@ -56,7 +56,7 @@ public class CassandraCurrentQuotaManager implements CurrentQuotaManager {
     private final PreparedStatement getCurrentQuotasStatement;
 
     @Inject
-    public CassandraCurrentQuotaManager(CqlSession session) {
+    public CassandraCurrentQuotaManagerV1(CqlSession session) {
         this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
         this.increaseStatement = session.prepare(update(TABLE_NAME)
             .increment(MESSAGE_COUNT, bindMarker())
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
index f3b669ec97..105938088c 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
@@ -34,7 +34,7 @@ import org.apache.james.mailbox.Authorizator;
 import org.apache.james.mailbox.acl.MailboxACLResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManager;
+import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV1;
 import org.apache.james.mailbox.cassandra.quota.CassandraGlobalMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerDomainMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaDao;
@@ -117,7 +117,7 @@ public class CassandraMailboxManagerProvider {
         CassandraPerUserMaxQuotaManager maxQuotaManager = new CassandraPerUserMaxQuotaManager(new CassandraPerUserMaxQuotaDao(session),
             new CassandraPerDomainMaxQuotaDao(session),
             new CassandraGlobalMaxQuotaDao(session));
-        CassandraCurrentQuotaManager currentQuotaUpdater = new CassandraCurrentQuotaManager(session);
+        CassandraCurrentQuotaManagerV1 currentQuotaUpdater = new CassandraCurrentQuotaManagerV1(session);
         StoreQuotaManager storeQuotaManager = new StoreQuotaManager(currentQuotaUpdater, maxQuotaManager);
         QuotaRootResolver quotaRootResolver = new DefaultUserQuotaRootResolver(sessionProvider, mapperFactory);
         ListeningCurrentQuotaUpdater quotaUpdater = new ListeningCurrentQuotaUpdater(currentQuotaUpdater, quotaRootResolver, eventBus, storeQuotaManager);
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
index 774959e2ca..f3839faed7 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
@@ -34,7 +34,7 @@ import org.apache.james.mailbox.Authenticator;
 import org.apache.james.mailbox.Authorizator;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManager;
+import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV1;
 import org.apache.james.mailbox.cassandra.quota.CassandraGlobalMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerDomainMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaDao;
@@ -109,7 +109,7 @@ public class CassandraTestSystemFixture {
     }
 
     public static CurrentQuotaManager createCurrentQuotaManager(CassandraCluster cassandra) {
-        return new CassandraCurrentQuotaManager(cassandra.getConf());
+        return new CassandraCurrentQuotaManagerV1(cassandra.getConf());
     }
 
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
similarity index 90%
rename from mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java
rename to mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
index f8f3fe8e7d..1d8202a9f1 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
@@ -25,13 +25,13 @@ import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.CurrentQuotaManagerContract;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-class CassandraCurrentQuotaManagerTest implements CurrentQuotaManagerContract {
+class CassandraCurrentQuotaManagerV1Test implements CurrentQuotaManagerContract {
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraQuotaModule.MODULE);
 
     @Override
     public CurrentQuotaManager testee() {
-        return new CassandraCurrentQuotaManager(cassandraCluster.getCassandraCluster().getConf());
+        return new CassandraCurrentQuotaManagerV1(cassandraCluster.getCassandraCluster().getConf());
     }
 }
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
index 055718d03e..0c863bee60 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
@@ -37,7 +37,7 @@ import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
 import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
 import org.apache.james.mailbox.cassandra.TestCassandraMailboxSessionMapperFactory;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManager;
+import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV1;
 import org.apache.james.mailbox.cassandra.quota.CassandraGlobalMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerDomainMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaDao;
@@ -114,7 +114,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
             new CassandraPerUserMaxQuotaDao(session),
             new CassandraPerDomainMaxQuotaDao(cassandra.getConf()),
             new CassandraGlobalMaxQuotaDao(session));
-        CassandraCurrentQuotaManager currentQuotaManager = new CassandraCurrentQuotaManager(session);
+        CassandraCurrentQuotaManagerV1 currentQuotaManager = new CassandraCurrentQuotaManagerV1(session);
         StoreQuotaManager quotaManager = new StoreQuotaManager(currentQuotaManager, perUserMaxQuotaManager);
         ListeningCurrentQuotaUpdater quotaUpdater = new ListeningCurrentQuotaUpdater(currentQuotaManager, quotaRootResolver, eventBus, quotaManager);
         QuotaComponents quotaComponents = new QuotaComponents(perUserMaxQuotaManager, quotaManager, quotaRootResolver);
diff --git a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
index f79fc9d1d6..93eb2a9284 100644
--- a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
+++ b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
@@ -21,7 +21,7 @@ package org.apache.james.modules.mailbox;
 
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.events.EventListener;
-import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManager;
+import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV1;
 import org.apache.james.mailbox.cassandra.quota.CassandraGlobalMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerDomainMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaDao;
@@ -47,7 +47,7 @@ public class CassandraQuotaModule extends AbstractModule {
 
     @Override
     protected void configure() {
-        bind(CassandraCurrentQuotaManager.class).in(Scopes.SINGLETON);
+        bind(CassandraCurrentQuotaManagerV1.class).in(Scopes.SINGLETON);
         bind(CassandraQuotaLimitDao.class).in(Scopes.SINGLETON);
         bind(CassandraQuotaCurrentValueDao.class).in(Scopes.SINGLETON);
         bind(CassandraGlobalMaxQuotaDao.class).in(Scopes.SINGLETON);
@@ -57,7 +57,7 @@ public class CassandraQuotaModule extends AbstractModule {
         bind(DefaultUserQuotaRootResolver.class).in(Scopes.SINGLETON);
         bind(StoreQuotaManager.class).in(Scopes.SINGLETON);
 
-        bind(CurrentQuotaManager.class).to(CassandraCurrentQuotaManager.class);
+        bind(CurrentQuotaManager.class).to(CassandraCurrentQuotaManagerV1.class);
         bind(MaxQuotaManager.class).to(CassandraPerUserMaxQuotaManager.class);
         bind(QuotaManager.class).to(StoreQuotaManager.class);
         bind(QuotaRootResolver.class).to(DefaultUserQuotaRootResolver.class);


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 03/14: JAMES-3926 Implement CassandraCurrentQuotaManagerV2

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3dc2d41a3969c394c4ca341921514f8509c05aeb
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Aug 25 15:36:21 2023 +0700

    JAMES-3926 Implement CassandraCurrentQuotaManagerV2
---
 .../quota/CassandraCurrentQuotaManagerV2.java      | 115 +++++++++++++++++++++
 .../quota/CassandraCurrentQuotaManagerV2Test.java  |  46 +++++++++
 2 files changed, 161 insertions(+)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2.java
new file mode 100644
index 0000000000..7eb85da2b0
--- /dev/null
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2.java
@@ -0,0 +1,115 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.cassandra.quota;
+
+import java.util.function.Predicate;
+
+import javax.inject.Inject;
+
+import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
+import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao.QuotaKey;
+import org.apache.james.core.quota.QuotaComponent;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaCurrentValue;
+import org.apache.james.core.quota.QuotaSizeUsage;
+import org.apache.james.core.quota.QuotaType;
+import org.apache.james.mailbox.model.CurrentQuotas;
+import org.apache.james.mailbox.model.QuotaOperation;
+import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
+
+import reactor.core.publisher.Mono;
+
+public class CassandraCurrentQuotaManagerV2 implements CurrentQuotaManager {
+    private final CassandraQuotaCurrentValueDao currentValueDao;
+
+    @Inject
+    public CassandraCurrentQuotaManagerV2(CassandraQuotaCurrentValueDao currentValueDao) {
+        this.currentValueDao = currentValueDao;
+    }
+
+    @Override
+    public Mono<QuotaCountUsage> getCurrentMessageCount(QuotaRoot quotaRoot) {
+        return currentValueDao.getQuotaCurrentValue(asQuotaKeyCount(quotaRoot))
+            .map(QuotaCurrentValue::getCurrentValue)
+            .map(QuotaCountUsage::count)
+            .defaultIfEmpty(QuotaCountUsage.count(0L));
+    }
+
+    @Override
+    public Mono<QuotaSizeUsage> getCurrentStorage(QuotaRoot quotaRoot) {
+        return currentValueDao.getQuotaCurrentValue(asQuotaKeySize(quotaRoot))
+            .map(QuotaCurrentValue::getCurrentValue)
+            .map(QuotaSizeUsage::size)
+            .defaultIfEmpty(QuotaSizeUsage.size(0L));
+    }
+
+    @Override
+    public Mono<CurrentQuotas> getCurrentQuotas(QuotaRoot quotaRoot) {
+        return Mono.zip(
+                getCurrentMessageCount(quotaRoot),
+                getCurrentStorage(quotaRoot))
+            .map(tuple2 -> new CurrentQuotas(tuple2.getT1(), tuple2.getT2()));
+    }
+
+    @Override
+    public Mono<Void> increase(QuotaOperation quotaOperation) {
+        return currentValueDao.increase(asQuotaKeyCount(quotaOperation.quotaRoot()), quotaOperation.count().asLong())
+            .then(currentValueDao.increase(asQuotaKeySize(quotaOperation.quotaRoot()), quotaOperation.size().asLong()));
+    }
+
+    @Override
+    public Mono<Void> decrease(QuotaOperation quotaOperation) {
+        return decrease(quotaOperation.quotaRoot(), quotaOperation.count(), quotaOperation.size());
+    }
+
+    private Mono<Void> decrease(QuotaRoot quotaRoot, QuotaCountUsage count, QuotaSizeUsage size) {
+        return currentValueDao.decrease(asQuotaKeyCount(quotaRoot), count.asLong())
+            .then(currentValueDao.decrease(asQuotaKeySize(quotaRoot), size.asLong()));
+    }
+
+    @Override
+    public Mono<Void> setCurrentQuotas(QuotaOperation quotaOperation) {
+        return getCurrentQuotas(quotaOperation.quotaRoot())
+            .filter(Predicate.not(Predicate.isEqual(CurrentQuotas.from(quotaOperation))))
+            .flatMap(storedQuotas -> {
+                long count = quotaOperation.count().asLong() - storedQuotas.count().asLong();
+                long size = quotaOperation.size().asLong() - storedQuotas.size().asLong();
+
+                return currentValueDao.increase(asQuotaKeyCount(quotaOperation.quotaRoot()), count)
+                    .then(currentValueDao.increase(asQuotaKeySize(quotaOperation.quotaRoot()), size));
+            });
+    }
+
+    private QuotaKey asQuotaKeyCount(QuotaRoot quotaRoot) {
+        return asQuotaKey(quotaRoot, QuotaType.COUNT);
+    }
+
+    private QuotaKey asQuotaKeySize(QuotaRoot quotaRoot) {
+        return asQuotaKey(quotaRoot, QuotaType.SIZE);
+    }
+
+    private QuotaKey asQuotaKey(QuotaRoot quotaRoot, QuotaType quotaType) {
+        return QuotaKey.of(
+            QuotaComponent.MAILBOX,
+            quotaRoot.asString(),
+            quotaType);
+    }
+}
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2Test.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2Test.java
new file mode 100644
index 0000000000..80750f0c96
--- /dev/null
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV2Test.java
@@ -0,0 +1,46 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mailbox.cassandra.quota;
+
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
+import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
+import org.apache.james.mailbox.store.quota.CurrentQuotaManagerContract;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+public class CassandraCurrentQuotaManagerV2Test implements CurrentQuotaManagerContract {
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraMutualizedQuotaModule.MODULE);
+
+    private CassandraCurrentQuotaManagerV2 currentQuotaManager;
+
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
+        currentQuotaManager = new CassandraCurrentQuotaManagerV2(new CassandraQuotaCurrentValueDao(cassandra.getConf()));
+    }
+
+    @Override
+    public CurrentQuotaManager testee() {
+        return currentQuotaManager;
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 07/14: JAMES-3926 Module choosing for Mailbox Quota

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 1d9d7b8f9619b3792dae2b381355ec7dd27943b5
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Mon Aug 28 16:48:37 2023 +0700

    JAMES-3926 Module choosing for Mailbox Quota
---
 ...odule.java => CassandraMailboxQuotaModule.java} | 33 +-------------------
 .../cassandra/modules/CassandraQuotaModule.java    | 11 -------
 .../cassandra/mail/MailboxAggregateModule.java     |  3 +-
 .../quota/CassandraCurrentQuotaManagerV1Test.java  |  2 ++
 .../CassandraCurrentQuotaManagerMigrationTest.java |  2 ++
 .../org/apache/james/CassandraJamesServerMain.java | 11 +++++++
 .../james/CassandraLegacyQuotaJamesServerTest.java | 33 ++++++++++----------
 .../james/CassandraRabbitMQJamesServerMain.java    | 11 +++++++
 ...assandraRabbitMQLegacyQuotaJamesServerTest.java | 35 ++++++++++++----------
 .../james/DistributedPOP3JamesServerMain.java      | 11 +++++++
 .../mailbox/CassandraMailboxQuotaLegacyModule.java | 27 +++++++++--------
 .../mailbox/CassandraMailboxQuotaModule.java       | 25 +++++++---------
 .../modules/mailbox/CassandraQuotaModule.java      |  5 ----
 .../upload/CassandraUploadUsageRepositoryTest.java |  4 ++-
 14 files changed, 104 insertions(+), 109 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxQuotaModule.java
similarity index 54%
copy from mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java
copy to mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxQuotaModule.java
index 196ce14cbb..da6dcee591 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxQuotaModule.java
@@ -19,7 +19,6 @@
 
 package org.apache.james.mailbox.cassandra.modules;
 
-import static com.datastax.oss.driver.api.core.type.DataTypes.BIGINT;
 import static com.datastax.oss.driver.api.core.type.DataTypes.COUNTER;
 import static com.datastax.oss.driver.api.core.type.DataTypes.TEXT;
 import static com.datastax.oss.driver.api.querybuilder.SchemaBuilder.RowsPerPartition.rows;
@@ -27,11 +26,8 @@ import static com.datastax.oss.driver.api.querybuilder.SchemaBuilder.RowsPerPart
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.utils.CassandraConstants;
 import org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota;
-import org.apache.james.mailbox.cassandra.table.CassandraDomainMaxQuota;
-import org.apache.james.mailbox.cassandra.table.CassandraGlobalMaxQuota;
-import org.apache.james.mailbox.cassandra.table.CassandraMaxQuota;
 
-public interface CassandraQuotaModule {
+public interface CassandraMailboxQuotaModule {
     CassandraModule MODULE = CassandraModule.builder()
         .table(CassandraCurrentQuota.TABLE_NAME)
         .comment("Holds per quota-root current values. Quota-roots defines groups of mailboxes which shares quotas limitations.")
@@ -42,32 +38,5 @@ public interface CassandraQuotaModule {
             .withColumn(CassandraCurrentQuota.MESSAGE_COUNT, COUNTER)
             .withColumn(CassandraCurrentQuota.STORAGE, COUNTER))
 
-        .table(CassandraMaxQuota.TABLE_NAME)
-        .comment("Holds per quota-root limitations. Limitations can concern the number of messages in a quota-root or the total size of a quota-root.")
-        .options(options -> options
-            .withCaching(true, rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
-        .statement(statement -> types -> statement
-            .withPartitionKey(CassandraMaxQuota.QUOTA_ROOT, TEXT)
-            .withColumn(CassandraMaxQuota.MESSAGE_COUNT, BIGINT)
-            .withColumn(CassandraMaxQuota.STORAGE, BIGINT))
-
-        .table(CassandraDomainMaxQuota.TABLE_NAME)
-        .comment("Holds per domain limitations. Limitations can concern the number of messages in a quota-root or the total size of a quota-root.")
-        .options(options -> options
-            .withCaching(true, rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
-        .statement(statement -> types -> statement
-            .withPartitionKey(CassandraDomainMaxQuota.DOMAIN, TEXT)
-            .withColumn(CassandraDomainMaxQuota.MESSAGE_COUNT, BIGINT)
-            .withColumn(CassandraDomainMaxQuota.STORAGE, BIGINT))
-
-        .table(CassandraGlobalMaxQuota.TABLE_NAME)
-        .comment("Holds defaults limitations definition.")
-        .options(options -> options
-            .withCaching(true, rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
-        .statement(statement -> types -> statement
-            .withPartitionKey(CassandraGlobalMaxQuota.KEY, TEXT)
-            .withColumn(CassandraGlobalMaxQuota.STORAGE, BIGINT)
-            .withColumn(CassandraGlobalMaxQuota.MESSAGE, BIGINT))
-
         .build();
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java
index 196ce14cbb..9a9f4c7de4 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraQuotaModule.java
@@ -20,28 +20,17 @@
 package org.apache.james.mailbox.cassandra.modules;
 
 import static com.datastax.oss.driver.api.core.type.DataTypes.BIGINT;
-import static com.datastax.oss.driver.api.core.type.DataTypes.COUNTER;
 import static com.datastax.oss.driver.api.core.type.DataTypes.TEXT;
 import static com.datastax.oss.driver.api.querybuilder.SchemaBuilder.RowsPerPartition.rows;
 
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.utils.CassandraConstants;
-import org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota;
 import org.apache.james.mailbox.cassandra.table.CassandraDomainMaxQuota;
 import org.apache.james.mailbox.cassandra.table.CassandraGlobalMaxQuota;
 import org.apache.james.mailbox.cassandra.table.CassandraMaxQuota;
 
 public interface CassandraQuotaModule {
     CassandraModule MODULE = CassandraModule.builder()
-        .table(CassandraCurrentQuota.TABLE_NAME)
-        .comment("Holds per quota-root current values. Quota-roots defines groups of mailboxes which shares quotas limitations.")
-        .options(options -> options
-            .withCaching(true, rows(CassandraConstants.DEFAULT_CACHED_ROW_PER_PARTITION)))
-        .statement(statement -> types -> statement
-            .withPartitionKey(CassandraCurrentQuota.QUOTA_ROOT, TEXT)
-            .withColumn(CassandraCurrentQuota.MESSAGE_COUNT, COUNTER)
-            .withColumn(CassandraCurrentQuota.STORAGE, COUNTER))
-
         .table(CassandraMaxQuota.TABLE_NAME)
         .comment("Holds per quota-root limitations. Limitations can concern the number of messages in a quota-root or the total size of a quota-root.")
         .options(options -> options
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxAggregateModule.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxAggregateModule.java
index dd8c2b7c9d..e4183c7972 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxAggregateModule.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxAggregateModule.java
@@ -32,6 +32,7 @@ import org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraMailboxQuotaModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
@@ -60,5 +61,5 @@ public interface MailboxAggregateModule {
         CassandraUidModule.MODULE,
         CassandraThreadModule.MODULE);
 
-    CassandraModule MODULE_WITH_QUOTA = CassandraModule.aggregateModules(CassandraQuotaModule.MODULE, CassandraMutualizedQuotaModule.MODULE, MODULE);
+    CassandraModule MODULE_WITH_QUOTA = CassandraModule.aggregateModules(CassandraQuotaModule.MODULE, CassandraMailboxQuotaModule.MODULE, CassandraMutualizedQuotaModule.MODULE, MODULE);
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
index 5908cbdd06..2b3caf1f58 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
@@ -22,6 +22,7 @@ package org.apache.james.mailbox.cassandra.quota;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraMailboxQuotaModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.CurrentQuotaManagerContract;
@@ -31,6 +32,7 @@ class CassandraCurrentQuotaManagerV1Test implements CurrentQuotaManagerContract
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(CassandraQuotaModule.MODULE,
+        CassandraMailboxQuotaModule.MODULE,
         CassandraMutualizedQuotaModule.MODULE));
 
     @Override
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraCurrentQuotaManagerMigrationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraCurrentQuotaManagerMigrationTest.java
index cb33b72735..e898fb3b1f 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraCurrentQuotaManagerMigrationTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/migration/CassandraCurrentQuotaManagerMigrationTest.java
@@ -38,6 +38,7 @@ import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.mock.SimpleDomainList;
 import org.apache.james.domainlist.cassandra.CassandraDomainListModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraMailboxQuotaModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
 import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV1;
 import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV2;
@@ -61,6 +62,7 @@ public class CassandraCurrentQuotaManagerMigrationTest {
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(
         CassandraQuotaModule.MODULE,
+        CassandraMailboxQuotaModule.MODULE,
         CassandraUsersRepositoryModule.MODULE,
         CassandraDomainListModule.MODULE,
         CassandraMutualizedQuotaModule.MODULE));
diff --git a/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerMain.java b/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerMain.java
index c0cf0d93ab..2dc58da132 100644
--- a/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerMain.java
+++ b/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerMain.java
@@ -42,6 +42,8 @@ import org.apache.james.modules.mailbox.CassandraBlobStoreDependenciesModule;
 import org.apache.james.modules.mailbox.CassandraBucketModule;
 import org.apache.james.modules.mailbox.CassandraDeletedMessageVaultModule;
 import org.apache.james.modules.mailbox.CassandraMailboxModule;
+import org.apache.james.modules.mailbox.CassandraMailboxQuotaLegacyModule;
+import org.apache.james.modules.mailbox.CassandraMailboxQuotaModule;
 import org.apache.james.modules.mailbox.CassandraQuotaMailingModule;
 import org.apache.james.modules.mailbox.CassandraSessionModule;
 import org.apache.james.modules.mailbox.TikaMailboxModule;
@@ -196,6 +198,7 @@ public class CassandraJamesServerMain implements JamesServerMain {
             .combineWith(new UsersRepositoryModuleChooser(new CassandraUsersRepositoryModule())
                 .chooseModules(configuration.getUsersRepositoryImplementation()))
             .combineWith(chooseDeletedMessageVault(configuration.getVaultConfiguration()))
+            .combineWith(chooseMailboxQuotaModule(configuration))
             .combineWith(chooseJmapModule(configuration));
     }
 
@@ -218,4 +221,12 @@ public class CassandraJamesServerMain implements JamesServerMain {
 
         };
     }
+
+    private static Module chooseMailboxQuotaModule(CassandraJamesServerConfiguration configuration) {
+        if (configuration.isQuotaCompatibilityMode()) {
+            return new CassandraMailboxQuotaLegacyModule();
+        } else {
+            return new CassandraMailboxQuotaModule();
+        }
+    }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java b/server/apps/cassandra-app/src/test/java/org/apache/james/CassandraLegacyQuotaJamesServerTest.java
similarity index 57%
copy from mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
copy to server/apps/cassandra-app/src/test/java/org/apache/james/CassandraLegacyQuotaJamesServerTest.java
index 5908cbdd06..bc38057525 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
+++ b/server/apps/cassandra-app/src/test/java/org/apache/james/CassandraLegacyQuotaJamesServerTest.java
@@ -17,24 +17,25 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.cassandra.quota;
+package org.apache.james;
 
-import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
-import org.apache.james.mailbox.quota.CurrentQuotaManager;
-import org.apache.james.mailbox.store.quota.CurrentQuotaManagerContract;
+import org.apache.james.jmap.draft.JmapJamesServerContract;
+import org.apache.james.modules.TestJMAPServerModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-class CassandraCurrentQuotaManagerV1Test implements CurrentQuotaManagerContract {
-
+public class CassandraLegacyQuotaJamesServerTest implements JamesServerConcreteContract, JmapJamesServerContract {
     @RegisterExtension
-    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(CassandraQuotaModule.MODULE,
-        CassandraMutualizedQuotaModule.MODULE));
-
-    @Override
-    public CurrentQuotaManager testee() {
-        return new CassandraCurrentQuotaManagerV1(cassandraCluster.getCassandraCluster().getConf());
-    }
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraJamesServerConfiguration>(tmpDir ->
+        CassandraJamesServerConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .searchConfiguration(SearchConfiguration.openSearch())
+            .quotaCompatibilityModeEnabled(true)
+            .build())
+        .extension(new DockerOpenSearchExtension())
+        .extension(new CassandraExtension())
+        .server(configuration -> CassandraJamesServerMain.createServer(configuration)
+            .overrideWith(new TestJMAPServerModule()))
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
+        .build();
 }
diff --git a/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java b/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
index e94f99be7d..008f040189 100644
--- a/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
+++ b/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
@@ -50,6 +50,8 @@ import org.apache.james.modules.event.RabbitMQEventBusModule;
 import org.apache.james.modules.eventstore.CassandraEventStoreModule;
 import org.apache.james.modules.mailbox.CassandraDeletedMessageVaultModule;
 import org.apache.james.modules.mailbox.CassandraMailboxModule;
+import org.apache.james.modules.mailbox.CassandraMailboxQuotaLegacyModule;
+import org.apache.james.modules.mailbox.CassandraMailboxQuotaModule;
 import org.apache.james.modules.mailbox.CassandraQuotaMailingModule;
 import org.apache.james.modules.mailbox.CassandraSessionModule;
 import org.apache.james.modules.mailbox.TikaMailboxModule;
@@ -202,6 +204,7 @@ public class CassandraRabbitMQJamesServerMain implements JamesServerMain {
             .combineWith(new UsersRepositoryModuleChooser(new CassandraUsersRepositoryModule())
                 .chooseModules(configuration.getUsersRepositoryImplementation()))
             .combineWith(chooseDeletedMessageVault(configuration.getVaultConfiguration()))
+            .combineWith(chooseMailboxQuotaModule(configuration))
             .combineWith(chooseJmapModule(configuration));
     }
 
@@ -224,4 +227,12 @@ public class CassandraRabbitMQJamesServerMain implements JamesServerMain {
 
         };
     }
+
+    private static Module chooseMailboxQuotaModule(CassandraRabbitMQJamesConfiguration configuration) {
+        if (configuration.isQuotaCompatibilityMode()) {
+            return new CassandraMailboxQuotaLegacyModule();
+        } else {
+            return new CassandraMailboxQuotaModule();
+        }
+    }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java b/server/apps/distributed-app/src/test/java/org/apache/james/CassandraRabbitMQLegacyQuotaJamesServerTest.java
similarity index 54%
copy from mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
copy to server/apps/distributed-app/src/test/java/org/apache/james/CassandraRabbitMQLegacyQuotaJamesServerTest.java
index 5908cbdd06..6701ec6fd5 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
+++ b/server/apps/distributed-app/src/test/java/org/apache/james/CassandraRabbitMQLegacyQuotaJamesServerTest.java
@@ -17,24 +17,27 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.cassandra.quota;
+package org.apache.james;
 
-import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
-import org.apache.james.mailbox.quota.CurrentQuotaManager;
-import org.apache.james.mailbox.store.quota.CurrentQuotaManagerContract;
+import org.apache.james.jmap.draft.JmapJamesServerContract;
+import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.TestJMAPServerModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-class CassandraCurrentQuotaManagerV1Test implements CurrentQuotaManagerContract {
-
+public class CassandraRabbitMQLegacyQuotaJamesServerTest implements JamesServerConcreteContract, JmapJamesServerContract {
     @RegisterExtension
-    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(CassandraQuotaModule.MODULE,
-        CassandraMutualizedQuotaModule.MODULE));
-
-    @Override
-    public CurrentQuotaManager testee() {
-        return new CassandraCurrentQuotaManagerV1(cassandraCluster.getCassandraCluster().getConf());
-    }
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .searchConfiguration(SearchConfiguration.openSearch())
+            .quotaCompatibilityModeEnabled(true)
+            .build())
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
+            .overrideWith(new TestJMAPServerModule()))
+        .extension(new DockerOpenSearchExtension())
+        .extension(new CassandraExtension())
+        .extension(new RabbitMQExtension())
+        .lifeCycle(JamesServerExtension.Lifecycle.PER_CLASS)
+        .build();
 }
diff --git a/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesServerMain.java b/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesServerMain.java
index 91ebe766ce..0a15dcfb65 100644
--- a/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesServerMain.java
+++ b/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesServerMain.java
@@ -59,6 +59,8 @@ import org.apache.james.modules.eventstore.CassandraEventStoreModule;
 import org.apache.james.modules.mailbox.CassandraBlobStoreDependenciesModule;
 import org.apache.james.modules.mailbox.CassandraDeletedMessageVaultModule;
 import org.apache.james.modules.mailbox.CassandraMailboxModule;
+import org.apache.james.modules.mailbox.CassandraMailboxQuotaLegacyModule;
+import org.apache.james.modules.mailbox.CassandraMailboxQuotaModule;
 import org.apache.james.modules.mailbox.CassandraSessionModule;
 import org.apache.james.modules.mailbox.TikaMailboxModule;
 import org.apache.james.modules.mailrepository.CassandraMailRepositoryModule;
@@ -195,6 +197,7 @@ public class DistributedPOP3JamesServerMain implements JamesServerMain {
             .combineWith(BlobStoreModulesChooser.chooseModules(blobStoreConfiguration))
             .combineWith(BlobStoreCacheModulesChooser.chooseModules(blobStoreConfiguration))
             .combineWith(SearchModuleChooser.chooseModules(searchConfiguration))
+            .combineWith(chooseMailboxQuotaModule(configuration))
             .combineWith(new UsersRepositoryModuleChooser(new CassandraUsersRepositoryModule())
                 .chooseModules(configuration.getUsersRepositoryImplementation()))
             .overrideWith(new DistributedPop3Module())
@@ -219,4 +222,12 @@ public class DistributedPOP3JamesServerMain implements JamesServerMain {
 
         };
     }
+
+    private static Module chooseMailboxQuotaModule(DistributedPOP3JamesConfiguration configuration) {
+        if (configuration.isQuotaCompatibilityMode()) {
+            return new CassandraMailboxQuotaLegacyModule();
+        } else {
+            return new CassandraMailboxQuotaModule();
+        }
+    }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxQuotaLegacyModule.java
similarity index 59%
copy from mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
copy to server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxQuotaLegacyModule.java
index 5908cbdd06..db45571dcd 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
+++ b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxQuotaLegacyModule.java
@@ -17,24 +17,25 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.cassandra.quota;
+package org.apache.james.modules.mailbox;
 
-import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
+import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV1;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
-import org.apache.james.mailbox.store.quota.CurrentQuotaManagerContract;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
-class CassandraCurrentQuotaManagerV1Test implements CurrentQuotaManagerContract {
-
-    @RegisterExtension
-    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(CassandraQuotaModule.MODULE,
-        CassandraMutualizedQuotaModule.MODULE));
+import com.google.inject.AbstractModule;
+import com.google.inject.Scopes;
+import com.google.inject.multibindings.Multibinder;
+import com.google.inject.name.Names;
 
+public class CassandraMailboxQuotaLegacyModule extends AbstractModule {
     @Override
-    public CurrentQuotaManager testee() {
-        return new CassandraCurrentQuotaManagerV1(cassandraCluster.getCassandraCluster().getConf());
+    protected void configure() {
+        bind(CassandraCurrentQuotaManagerV1.class).in(Scopes.SINGLETON);
+        bind(CurrentQuotaManager.class).to(CassandraCurrentQuotaManagerV1.class);
+        bind(CurrentQuotaManager.class).annotatedWith(Names.named("old")).to(CassandraCurrentQuotaManagerV1.class);
+
+        Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
+        cassandraDataDefinitions.addBinding().toInstance(org.apache.james.mailbox.cassandra.modules.CassandraMailboxQuotaModule.MODULE);
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxQuotaModule.java
similarity index 57%
copy from mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
copy to server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxQuotaModule.java
index 5908cbdd06..08ee61dd60 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1Test.java
+++ b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxQuotaModule.java
@@ -17,24 +17,21 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.cassandra.quota;
+package org.apache.james.modules.mailbox;
 
-import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
+import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV2;
+import org.apache.james.mailbox.cassandra.quota.FakeCassandraCurrentQuotaManager;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
-import org.apache.james.mailbox.store.quota.CurrentQuotaManagerContract;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
-class CassandraCurrentQuotaManagerV1Test implements CurrentQuotaManagerContract {
-
-    @RegisterExtension
-    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(CassandraQuotaModule.MODULE,
-        CassandraMutualizedQuotaModule.MODULE));
+import com.google.inject.AbstractModule;
+import com.google.inject.Scopes;
+import com.google.inject.name.Names;
 
+public class CassandraMailboxQuotaModule extends AbstractModule {
     @Override
-    public CurrentQuotaManager testee() {
-        return new CassandraCurrentQuotaManagerV1(cassandraCluster.getCassandraCluster().getConf());
+    protected void configure() {
+        bind(CassandraCurrentQuotaManagerV2.class).in(Scopes.SINGLETON);
+        bind(CurrentQuotaManager.class).to(CassandraCurrentQuotaManagerV2.class);
+        bind(CurrentQuotaManager.class).annotatedWith(Names.named("old")).to(FakeCassandraCurrentQuotaManager.class);
     }
 }
diff --git a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
index 9100d2b38f..2684ce7bfe 100644
--- a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
+++ b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
@@ -24,12 +24,10 @@ import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaMo
 import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
 import org.apache.james.backends.cassandra.components.CassandraQuotaLimitDao;
 import org.apache.james.events.EventListener;
-import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManagerV1;
 import org.apache.james.mailbox.cassandra.quota.CassandraGlobalMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerDomainMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaManager;
-import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootDeserializer;
@@ -45,10 +43,8 @@ import com.google.inject.Scopes;
 import com.google.inject.multibindings.Multibinder;
 
 public class CassandraQuotaModule extends AbstractModule {
-
     @Override
     protected void configure() {
-        bind(CassandraCurrentQuotaManagerV1.class).in(Scopes.SINGLETON);
         bind(CassandraQuotaLimitDao.class).in(Scopes.SINGLETON);
         bind(CassandraQuotaCurrentValueDao.class).in(Scopes.SINGLETON);
         bind(CassandraGlobalMaxQuotaDao.class).in(Scopes.SINGLETON);
@@ -58,7 +54,6 @@ public class CassandraQuotaModule extends AbstractModule {
         bind(DefaultUserQuotaRootResolver.class).in(Scopes.SINGLETON);
         bind(StoreQuotaManager.class).in(Scopes.SINGLETON);
 
-        bind(CurrentQuotaManager.class).to(CassandraCurrentQuotaManagerV1.class);
         bind(MaxQuotaManager.class).to(CassandraPerUserMaxQuotaManager.class);
         bind(QuotaManager.class).to(StoreQuotaManager.class);
         bind(QuotaRootResolver.class).to(DefaultUserQuotaRootResolver.class);
diff --git a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java
index f35ef96d98..1f9c4ba118 100644
--- a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java
+++ b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/upload/CassandraUploadUsageRepositoryTest.java
@@ -21,9 +21,11 @@ package org.apache.james.jmap.cassandra.upload;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
 import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
 import org.apache.james.jmap.api.upload.UploadUsageRepository;
 import org.apache.james.jmap.api.upload.UploadUsageRepositoryContract;
+import org.apache.james.mailbox.cassandra.modules.CassandraMailboxQuotaModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -31,7 +33,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 public class CassandraUploadUsageRepositoryTest implements UploadUsageRepositoryContract {
 
     @RegisterExtension
-    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(CassandraQuotaModule.MODULE));
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(CassandraQuotaModule.MODULE, CassandraMutualizedQuotaModule.MODULE));
 
     private CassandraUploadUsageRepository cassandraUploadUsageRepository;
 


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 06/14: JAMES-3926 Configuration for quota compatibility mode

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit df1675b7b6cb8ce7ac81307341190ba5dd23a16d
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Thu Aug 24 19:52:58 2023 +0700

    JAMES-3926 Configuration for quota compatibility mode
---
 .../james/CassandraJamesServerConfiguration.java   | 25 +++++++++++++++--
 .../james/CassandraRabbitMQJamesConfiguration.java | 30 +++++++++++++++++++--
 .../james/DistributedPOP3JamesConfiguration.java   | 31 ++++++++++++++++++++--
 3 files changed, 80 insertions(+), 6 deletions(-)

diff --git a/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerConfiguration.java b/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerConfiguration.java
index 7d93448da5..ee8d86a699 100644
--- a/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerConfiguration.java
+++ b/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerConfiguration.java
@@ -55,6 +55,7 @@ public class CassandraJamesServerConfiguration implements Configuration {
         private Optional<UsersRepositoryModuleChooser.Implementation> usersRepositoryImplementation;
         private Optional<VaultConfiguration> vaultConfiguration;
         private Optional<Boolean> jmapEnabled;
+        private Optional<Boolean> quotaCompatibilityMode;
 
         private Builder() {
             rootDirectory = Optional.empty();
@@ -64,6 +65,7 @@ public class CassandraJamesServerConfiguration implements Configuration {
             blobStoreConfiguration = Optional.empty();
             vaultConfiguration = Optional.empty();
             jmapEnabled = Optional.empty();
+            quotaCompatibilityMode = Optional.empty();
         }
 
         public Builder workingDirectory(String path) {
@@ -114,6 +116,11 @@ public class CassandraJamesServerConfiguration implements Configuration {
             return this;
         }
 
+        public Builder quotaCompatibilityModeEnabled(boolean value) {
+            this.quotaCompatibilityMode = Optional.of(value);
+            return this;
+        }
+
         public CassandraJamesServerConfiguration build() {
             ConfigurationPath configurationPath = this.configurationPath.orElse(new ConfigurationPath(FileSystem.FILE_PROTOCOL_AND_CONF));
             JamesServerResourceLoader directories = new JamesServerResourceLoader(rootDirectory
@@ -142,6 +149,14 @@ public class CassandraJamesServerConfiguration implements Configuration {
                 }
             });
 
+            boolean quotaCompatibilityMode = this.quotaCompatibilityMode.orElseGet(() -> {
+                try {
+                    return configurationProvider.getConfiguration("cassandra").getBoolean("quota.compatibility.mode", false);
+                } catch (ConfigurationException e) {
+                    return false;
+                }
+            });
+
             boolean jmapEnabled = this.jmapEnabled.orElseGet(() -> {
                 try {
                     return JMAPModule.parseConfiguration(propertiesProvider).isEnabled();
@@ -152,7 +167,7 @@ public class CassandraJamesServerConfiguration implements Configuration {
                 }
             });
 
-            return new CassandraJamesServerConfiguration(configurationPath, directories, searchConfiguration, blobStoreConfiguration, usersRepositoryChoice, vaultConfiguration, jmapEnabled);
+            return new CassandraJamesServerConfiguration(configurationPath, directories, searchConfiguration, blobStoreConfiguration, usersRepositoryChoice, vaultConfiguration, jmapEnabled, quotaCompatibilityMode);
         }
     }
 
@@ -167,11 +182,12 @@ public class CassandraJamesServerConfiguration implements Configuration {
     private final UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation;
     private final VaultConfiguration vaultConfiguration;
     private final boolean jmapEnabled;
+    private final boolean quotaCompatibilityMode;
 
     private CassandraJamesServerConfiguration(ConfigurationPath configurationPath, JamesDirectoriesProvider directories,
                                               SearchConfiguration searchConfiguration, BlobStoreConfiguration blobStoreConfiguration,
                                               UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation,
-                                              VaultConfiguration vaultConfiguration, boolean jmapEnabled) {
+                                              VaultConfiguration vaultConfiguration, boolean jmapEnabled, boolean quotaCompatibilityMode) {
         this.configurationPath = configurationPath;
         this.directories = directories;
         this.searchConfiguration = searchConfiguration;
@@ -179,6 +195,7 @@ public class CassandraJamesServerConfiguration implements Configuration {
         this.usersRepositoryImplementation = usersRepositoryImplementation;
         this.vaultConfiguration = vaultConfiguration;
         this.jmapEnabled = jmapEnabled;
+        this.quotaCompatibilityMode = quotaCompatibilityMode;
     }
 
     @Override
@@ -210,4 +227,8 @@ public class CassandraJamesServerConfiguration implements Configuration {
     public boolean isJmapEnabled() {
         return jmapEnabled;
     }
+
+    public boolean isQuotaCompatibilityMode() {
+        return quotaCompatibilityMode;
+    }
 }
diff --git a/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java b/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
index 1f9913b770..ae230f2495 100644
--- a/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
+++ b/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
@@ -50,6 +50,7 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
         private Optional<UsersRepositoryModuleChooser.Implementation> usersRepositoryImplementation;
         private Optional<VaultConfiguration> vaultConfiguration;
         private Optional<Boolean> jmapEnabled;
+        private Optional<Boolean> quotaCompatibilityMode;
 
         private Builder() {
             searchConfiguration = Optional.empty();
@@ -60,6 +61,7 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
             mailQueueViewChoice = Optional.empty();
             vaultConfiguration = Optional.empty();
             jmapEnabled = Optional.empty();
+            quotaCompatibilityMode = Optional.empty();
         }
 
         public Builder workingDirectory(String path) {
@@ -120,6 +122,11 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
             return this;
         }
 
+        public Builder quotaCompatibilityModeEnabled(boolean value) {
+            this.quotaCompatibilityMode = Optional.of(value);
+            return this;
+        }
+
         public CassandraRabbitMQJamesConfiguration build() {
             ConfigurationPath configurationPath = this.configurationPath.orElse(new ConfigurationPath(FileSystem.FILE_PROTOCOL_AND_CONF));
             JamesServerResourceLoader directories = new JamesServerResourceLoader(rootDirectory
@@ -161,6 +168,14 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
                 }
             });
 
+            boolean quotaCompatibilityMode = this.quotaCompatibilityMode.orElseGet(() -> {
+                try {
+                    return configurationProvider.getConfiguration("cassandra").getBoolean("quota.compatibility.mode", false);
+                } catch (ConfigurationException e) {
+                    return false;
+                }
+            });
+
             return new CassandraRabbitMQJamesConfiguration(
                 configurationPath,
                 directories,
@@ -168,7 +183,8 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
                 searchConfiguration,
                 usersRepositoryChoice,
                 mailQueueViewChoice, vaultConfiguration,
-                jmapEnabled);
+                jmapEnabled,
+                quotaCompatibilityMode);
         }
     }
 
@@ -184,8 +200,13 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
     private final MailQueueViewChoice mailQueueViewChoice;
     private final VaultConfiguration vaultConfiguration;
     private final boolean jmapEnabled;
+    private final boolean quotaCompatibilityMode;
 
-    public CassandraRabbitMQJamesConfiguration(ConfigurationPath configurationPath, JamesDirectoriesProvider directories, BlobStoreConfiguration blobStoreConfiguration, SearchConfiguration searchConfiguration, UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation, MailQueueViewChoice mailQueueViewChoice, VaultConfiguration vaultConfiguration, boolean jmapEnabled) {
+    public CassandraRabbitMQJamesConfiguration(ConfigurationPath configurationPath, JamesDirectoriesProvider directories,
+                                               BlobStoreConfiguration blobStoreConfiguration, SearchConfiguration searchConfiguration,
+                                               UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation,
+                                               MailQueueViewChoice mailQueueViewChoice, VaultConfiguration vaultConfiguration,
+                                               boolean jmapEnabled, boolean quotaCompatibilityMode) {
         this.configurationPath = configurationPath;
         this.directories = directories;
         this.blobStoreConfiguration = blobStoreConfiguration;
@@ -194,6 +215,7 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
         this.mailQueueViewChoice = mailQueueViewChoice;
         this.vaultConfiguration = vaultConfiguration;
         this.jmapEnabled = jmapEnabled;
+        this.quotaCompatibilityMode = quotaCompatibilityMode;
     }
 
     public MailQueueViewChoice getMailQueueViewChoice() {
@@ -229,4 +251,8 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
     public boolean isJmapEnabled() {
         return jmapEnabled;
     }
+
+    public boolean isQuotaCompatibilityMode() {
+        return quotaCompatibilityMode;
+    }
 }
diff --git a/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesConfiguration.java b/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesConfiguration.java
index 138aa4c135..6264d1bd61 100644
--- a/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesConfiguration.java
+++ b/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesConfiguration.java
@@ -47,6 +47,7 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
         private Optional<UsersRepositoryModuleChooser.Implementation> usersRepositoryImplementation;
         private Optional<MailQueueViewChoice> mailQueueViewChoice;
         private Optional<VaultConfiguration> vaultConfiguration;
+        private Optional<Boolean> quotaCompatibilityMode;
 
         private Builder() {
             searchConfiguration = Optional.empty();
@@ -56,6 +57,7 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
             usersRepositoryImplementation = Optional.empty();
             mailQueueViewChoice = Optional.empty();
             vaultConfiguration = Optional.empty();
+            quotaCompatibilityMode = Optional.empty();
         }
 
         public Builder workingDirectory(String path) {
@@ -107,6 +109,11 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
             return this;
         }
 
+        public Builder quotaCompatibilityMode(boolean value) {
+            this.quotaCompatibilityMode = Optional.of(value);
+            return this;
+        }
+
         public DistributedPOP3JamesConfiguration build() {
             ConfigurationPath configurationPath = this.configurationPath.orElse(new ConfigurationPath(FileSystem.FILE_PROTOCOL_AND_CONF));
             JamesServerResourceLoader directories = new JamesServerResourceLoader(rootDirectory
@@ -139,13 +146,23 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
                 }
             });
 
+            boolean quotaCompatibilityMode = this.quotaCompatibilityMode.orElseGet(() -> {
+                try {
+                    return configurationProvider.getConfiguration("cassandra").getBoolean("quota.compatibility.mode", false);
+                } catch (ConfigurationException e) {
+                    return false;
+                }
+            });
+
             return new DistributedPOP3JamesConfiguration(
                 configurationPath,
                 directories,
                 blobStoreConfiguration,
                 searchConfiguration,
                 usersRepositoryChoice,
-                mailQueueViewChoice, vaultConfiguration);
+                mailQueueViewChoice,
+                vaultConfiguration,
+                quotaCompatibilityMode);
         }
     }
 
@@ -160,8 +177,13 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
     private final UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation;
     private final MailQueueViewChoice mailQueueViewChoice;
     private final VaultConfiguration vaultConfiguration;
+    private final boolean quotaCompatibilityMode;
 
-    public DistributedPOP3JamesConfiguration(ConfigurationPath configurationPath, JamesDirectoriesProvider directories, BlobStoreConfiguration blobStoreConfiguration, SearchConfiguration searchConfiguration, UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation, MailQueueViewChoice mailQueueViewChoice, VaultConfiguration vaultConfiguration) {
+    public DistributedPOP3JamesConfiguration(ConfigurationPath configurationPath, JamesDirectoriesProvider directories,
+                                             BlobStoreConfiguration blobStoreConfiguration, SearchConfiguration searchConfiguration,
+                                             UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation,
+                                             MailQueueViewChoice mailQueueViewChoice, VaultConfiguration vaultConfiguration,
+                                             boolean quotaCompatibilityMode) {
         this.configurationPath = configurationPath;
         this.directories = directories;
         this.blobStoreConfiguration = blobStoreConfiguration;
@@ -169,6 +191,7 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
         this.usersRepositoryImplementation = usersRepositoryImplementation;
         this.mailQueueViewChoice = mailQueueViewChoice;
         this.vaultConfiguration = vaultConfiguration;
+        this.quotaCompatibilityMode = quotaCompatibilityMode;
     }
 
     public MailQueueViewChoice getMailQueueViewChoice() {
@@ -200,4 +223,8 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
     public VaultConfiguration getVaultConfiguration() {
         return vaultConfiguration;
     }
+
+    public boolean isQuotaCompatibilityMode() {
+        return quotaCompatibilityMode;
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 08/14: JAMES-3926 Register CassandraCurrentQuotaManagerMigration

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5269b11eea9769455e5906a2de633f831b88340e
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Mon Aug 28 16:53:56 2023 +0700

    JAMES-3926 Register CassandraCurrentQuotaManagerMigration
---
 .../cassandra/versions/CassandraSchemaVersionManager.java  |  2 +-
 .../cassandra/quota/FakeCassandraCurrentQuotaManager.java  | 14 ++++++++------
 .../james/modules/webadmin/CassandraRoutesModule.java      |  3 +++
 .../rabbitmq/RabbitMQWebAdminServerIntegrationTest.java    |  2 +-
 4 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java
index a976df9cd4..dc518119b0 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/versions/CassandraSchemaVersionManager.java
@@ -36,7 +36,7 @@ import reactor.core.publisher.Mono;
 
 public class CassandraSchemaVersionManager {
     public static final SchemaVersion MIN_VERSION = new SchemaVersion(8);
-    public static final SchemaVersion MAX_VERSION = new SchemaVersion(12);
+    public static final SchemaVersion MAX_VERSION = new SchemaVersion(13);
     public static final SchemaVersion DEFAULT_VERSION = MIN_VERSION;
 
     private static final Logger LOGGER = LoggerFactory.getLogger(CassandraSchemaVersionManager.class);
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/FakeCassandraCurrentQuotaManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/FakeCassandraCurrentQuotaManager.java
index 0392af55a9..54e1c09dbb 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/FakeCassandraCurrentQuotaManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/FakeCassandraCurrentQuotaManager.java
@@ -32,6 +32,8 @@ import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import reactor.core.publisher.Mono;
 
 public class FakeCassandraCurrentQuotaManager implements CurrentQuotaManager {
+    private static final String MESSAGE = "Use quota compatility mode in cassandra.properties for running the 12 -> 13 migration";
+
     @Inject
     public FakeCassandraCurrentQuotaManager() {
 
@@ -39,31 +41,31 @@ public class FakeCassandraCurrentQuotaManager implements CurrentQuotaManager {
 
     @Override
     public Mono<QuotaCountUsage> getCurrentMessageCount(QuotaRoot quotaRoot) {
-        return Mono.error(new NotImplementedException());
+        return Mono.error(new NotImplementedException(MESSAGE));
     }
 
     @Override
     public Mono<QuotaSizeUsage> getCurrentStorage(QuotaRoot quotaRoot) {
-        return Mono.error(new NotImplementedException());
+        return Mono.error(new NotImplementedException(MESSAGE));
     }
 
     @Override
     public Mono<CurrentQuotas> getCurrentQuotas(QuotaRoot quotaRoot) {
-        return Mono.error(new NotImplementedException());
+        return Mono.error(new NotImplementedException(MESSAGE));
     }
 
     @Override
     public Mono<Void> increase(QuotaOperation quotaOperation) {
-        return Mono.error(new NotImplementedException());
+        return Mono.error(new NotImplementedException(MESSAGE));
     }
 
     @Override
     public Mono<Void> decrease(QuotaOperation quotaOperation) {
-        return Mono.error(new NotImplementedException());
+        return Mono.error(new NotImplementedException(MESSAGE));
     }
 
     @Override
     public Mono<Void> setCurrentQuotas(QuotaOperation quotaOperation) {
-        return Mono.error(new NotImplementedException());
+        return Mono.error(new NotImplementedException(MESSAGE));
     }
 }
diff --git a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/webadmin/CassandraRoutesModule.java b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/webadmin/CassandraRoutesModule.java
index 77e63bbd6a..867c63996f 100644
--- a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/webadmin/CassandraRoutesModule.java
+++ b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/webadmin/CassandraRoutesModule.java
@@ -29,6 +29,7 @@ import org.apache.james.mailbox.cassandra.mail.migration.AclV2Migration;
 import org.apache.james.mailbox.cassandra.mail.migration.AttachmentMessageIdMigration;
 import org.apache.james.mailbox.cassandra.mail.migration.MessageDenormalizationMigration;
 import org.apache.james.mailbox.cassandra.mail.migration.MessageV3Migration;
+import org.apache.james.mailbox.cassandra.quota.migration.CassandraCurrentQuotaManagerMigration;
 import org.apache.james.webadmin.Routes;
 import org.apache.james.webadmin.routes.CassandraMailboxMergingRoutes;
 import org.apache.james.webadmin.routes.CassandraMigrationRoutes;
@@ -44,6 +45,7 @@ public class CassandraRoutesModule extends AbstractModule {
     private static final SchemaTransition FROM_V9_TO_V10 = SchemaTransition.to(new SchemaVersion(10));
     private static final SchemaTransition FROM_V10_TO_V11 = SchemaTransition.to(new SchemaVersion(11));
     private static final SchemaTransition FROM_V11_TO_V12 = SchemaTransition.to(new SchemaVersion(12));
+    private static final SchemaTransition FROM_V12_TO_V13 = SchemaTransition.to(new SchemaVersion(13));
 
     @Override
     protected void configure() {
@@ -63,6 +65,7 @@ public class CassandraRoutesModule extends AbstractModule {
         allMigrationClazzBinder.addBinding(FROM_V9_TO_V10).to(AclV2Migration.class);
         allMigrationClazzBinder.addBinding(FROM_V10_TO_V11).to(MessageDenormalizationMigration.class);
         allMigrationClazzBinder.addBinding(FROM_V11_TO_V12).to(AttachmentMessageIdMigration.class);
+        allMigrationClazzBinder.addBinding(FROM_V12_TO_V13).to(CassandraCurrentQuotaManagerMigration.class);
 
         bind(SchemaVersion.class)
             .annotatedWith(Names.named(CassandraMigrationService.LATEST_VERSION))
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
index 03f904a9d3..21ebee4aab 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
@@ -136,7 +136,7 @@ class RabbitMQWebAdminServerIntegrationTest extends WebAdminServerIntegrationTes
         .then()
             .statusCode(HttpStatus.OK_200)
             .contentType(JSON_CONTENT_TYPE)
-            .body(is("{\"version\":12}"));
+            .body(is("{\"version\":13}"));
     }
 
     @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 13/14: JAMES-3926 Fix CassandraQuotaCurrentValueDaoTest

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f47284b8aaf2d6ffd2f923ee71011faf96de8599
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Fri Aug 25 12:07:46 2023 +0700

    JAMES-3926 Fix CassandraQuotaCurrentValueDaoTest
---
 .../quota/CassandraQuotaCurrentValueDaoTest.java   | 61 +++++++++++-----------
 1 file changed, 31 insertions(+), 30 deletions(-)

diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
index 8460b11146..a4995855ac 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/quota/CassandraQuotaCurrentValueDaoTest.java
@@ -32,6 +32,7 @@ import org.apache.james.core.quota.QuotaComponent;
 import org.apache.james.core.quota.QuotaCurrentValue;
 import org.apache.james.core.quota.QuotaType;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
@@ -50,76 +51,76 @@ public class CassandraQuotaCurrentValueDaoTest {
 
     @Test
     void increaseQuotaCurrentValueShouldCreateNewRowSuccessfully() {
-        QuotaCurrentValue expected = QuotaCurrentValue.builder().quotaComponent(QUOTA_KEY.getQuotaComponent())
-            .identifier(QUOTA_KEY.getIdentifier()).quotaType(QUOTA_KEY.getQuotaType()).currentValue(100l).build();
-        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100l).block();
+        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100L).block();
 
-        QuotaCurrentValue actual = cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block();
-        assertThat(actual).isEqualTo(expected);
+        assertThat(cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block().getCurrentValue()).isEqualTo(100L);
     }
 
     @Test
     void increaseQuotaCurrentValueShouldCreateNewRowSuccessfullyWhenIncreaseAmountIsZero() {
-        QuotaCurrentValue expected = QuotaCurrentValue.builder().quotaComponent(QUOTA_KEY.getQuotaComponent())
-            .identifier(QUOTA_KEY.getIdentifier()).quotaType(QUOTA_KEY.getQuotaType()).currentValue(0l).build();
-        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 0l).block();
+        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 0L).block();
 
-        QuotaCurrentValue actual = cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block();
-        assertThat(actual).isEqualTo(expected);
+        assertThat(cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block().getCurrentValue()).isEqualTo(0L);
     }
 
     @Test
     void increaseQuotaCurrentValueShouldIncreaseValueSuccessfully() {
+        cassandraCluster.getCassandraCluster().getConf().printStatements();
+        assertThat(cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block()).isNull();
+
         cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100L).block();
         cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100L).block();
 
-        QuotaCurrentValue actual = cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block();
-
-        assertThat(actual.getCurrentValue()).isEqualTo(200L);
+        assertThat(cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block().getCurrentValue()).isEqualTo(200L);
+        cassandraCluster.getCassandraCluster().getConf().stopPrintingStatements();
     }
 
     @Test
     void increaseQuotaCurrentValueShouldDecreaseValueSuccessfullyWhenIncreaseAmountIsNegative() {
-        QuotaCurrentValue expected = QuotaCurrentValue.builder().quotaComponent(QUOTA_KEY.getQuotaComponent())
-            .identifier(QUOTA_KEY.getIdentifier()).quotaType(QUOTA_KEY.getQuotaType()).currentValue(100l).build();
-        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 200l).block();
-        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, -100l).block();
+        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 200L).block();
+        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, -100L).block();
 
-        QuotaCurrentValue actual = cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block();
-        assertThat(actual).isEqualTo(expected);
+        assertThat(cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block().getCurrentValue()).isEqualTo(100L);
     }
 
     @Test
     void decreaseQuotaCurrentValueShouldDecreaseValueSuccessfully() {
-        QuotaCurrentValue expected = QuotaCurrentValue.builder().quotaComponent(QUOTA_KEY.getQuotaComponent())
-            .identifier(QUOTA_KEY.getIdentifier()).quotaType(QUOTA_KEY.getQuotaType()).currentValue(100l).build();
-        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 200l).block();
-        cassandraQuotaCurrentValueDao.decrease(QUOTA_KEY, 100l).block();
+        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 200L).block();
+        cassandraQuotaCurrentValueDao.decrease(QUOTA_KEY, 100L).block();
 
-        QuotaCurrentValue actual = cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block();
-        assertThat(actual).isEqualTo(expected);
+        assertThat(cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block().getCurrentValue()).isEqualTo(100L);
     }
 
     @Test
     void deleteQuotaCurrentValueShouldDeleteSuccessfully() {
-        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100l).block();
+        QuotaKey quotaKey = QuotaKey.of(QuotaComponent.MAILBOX, "andre@abc.com", QuotaType.SIZE);
+        cassandraQuotaCurrentValueDao.increase(quotaKey, 100L).block();
+        cassandraQuotaCurrentValueDao.deleteQuotaCurrentValue(quotaKey).block();
+
+        assertThat(cassandraQuotaCurrentValueDao.getQuotaCurrentValue(quotaKey).block()).isNull();
+    }
+
+    @Disabled("Cassandra counter deletion is reversed once counter is incremented")
+    @Test
+    void deleteQuotaCurrentValueShouldResetCounterForever() {
+        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100L).block();
         cassandraQuotaCurrentValueDao.deleteQuotaCurrentValue(QUOTA_KEY).block();
+        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100L).block();
 
-        QuotaCurrentValue actual = cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block();
-        assertThat(actual).isNull();
+        assertThat(cassandraQuotaCurrentValueDao.getQuotaCurrentValue(QUOTA_KEY).block().getCurrentValue()).isEqualTo(100L);
     }
 
     @Test
     void increaseQuotaCurrentValueShouldNotThrowExceptionWhenQueryExecutorThrowException() {
         cassandraCluster.pause();
-        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100l).block();
+        cassandraQuotaCurrentValueDao.increase(QUOTA_KEY, 100L).block();
         cassandraCluster.unpause();
     }
 
     @Test
     void decreaseQuotaCurrentValueShouldNotThrowExceptionWhenQueryExecutorThrowException() {
         cassandraCluster.pause();
-        cassandraQuotaCurrentValueDao.decrease(QUOTA_KEY, 100l).block();
+        cassandraQuotaCurrentValueDao.decrease(QUOTA_KEY, 100L).block();
         cassandraCluster.unpause();
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 10/14: JAMES-3926 Upgrade instructions

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 25cf5479dd85cdac8bb777a6a73cf866379e0adb
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Thu Aug 24 20:58:12 2023 +0700

    JAMES-3926 Upgrade instructions
---
 upgrade-instructions.md | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/upgrade-instructions.md b/upgrade-instructions.md
index abeb02d424..393de6d25d 100644
--- a/upgrade-instructions.md
+++ b/upgrade-instructions.md
@@ -19,6 +19,22 @@ Change list:
 
  - [Imap Packages](#imap-packages)
  - [Jmap uploads](#jmap-uploads)
+ - [Mutualize quota table](#mutualize-quota-table)
+
+### Mutualize quota table
+
+Date: 24/08/2023
+JIRA: https://issues.apache.org/jira/projects/JAMES/issues/JAMES-3926
+
+In order to upgrade to the latest Quota data model, one need to enable quota compatibility mode in `cassandra.properties`:
+
+```
+quota.compatibility.mode=true
+```
+
+This is required for going from Cassandra schema version 12 -> 13.
+
+then run the migration: https://james.apache.org/server/manage-webadmin.html#Cassandra_Schema_upgrades
 
 ### Jmap Uploads
 
@@ -26,7 +42,6 @@ Date: 24/08/2023
 
 `uploads` table can be deleted. Note that pending uploads will be lost during the migration, they are not used anymore.
 
-
 ### Imap Packages
 
 Date: 27/06/2023


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org


[james-project] 09/14: JAMES-3926 Mark older mailbox current quota datamodel as deprecated

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8b03b70b329cb3e23fedf8012829dc26a4445b9b
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Tue Aug 29 09:53:36 2023 +0700

    JAMES-3926 Mark older mailbox current quota datamodel as deprecated
---
 .../james/mailbox/cassandra/modules/CassandraMailboxQuotaModule.java     | 1 +
 .../james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1.java    | 1 +
 .../org/apache/james/mailbox/cassandra/table/CassandraCurrentQuota.java  | 1 +
 .../apache/james/modules/mailbox/CassandraMailboxQuotaLegacyModule.java  | 1 +
 4 files changed, 4 insertions(+)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxQuotaModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxQuotaModule.java
index da6dcee591..827f39d98d 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxQuotaModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraMailboxQuotaModule.java
@@ -27,6 +27,7 @@ import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.utils.CassandraConstants;
 import org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota;
 
+@Deprecated() // To be removed after release 3.9.0
 public interface CassandraMailboxQuotaModule {
     CassandraModule MODULE = CassandraModule.builder()
         .table(CassandraCurrentQuota.TABLE_NAME)
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1.java
index 661ddf1a9e..f587d2dca0 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerV1.java
@@ -46,6 +46,7 @@ import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 
 import reactor.core.publisher.Mono;
 
+@Deprecated() // To be removed after release 3.9.0
 public class CassandraCurrentQuotaManagerV1 implements CurrentQuotaManager {
 
     private final CassandraAsyncExecutor cassandraAsyncExecutor;
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraCurrentQuota.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraCurrentQuota.java
index 2e5970e568..a3495adcad 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraCurrentQuota.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraCurrentQuota.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.cassandra.table;
 
 import com.datastax.oss.driver.api.core.CqlIdentifier;
 
+@Deprecated() // To be removed after release 3.9.0
 public interface CassandraCurrentQuota {
 
     String TABLE_NAME = "currentQuota";
diff --git a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxQuotaLegacyModule.java b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxQuotaLegacyModule.java
index db45571dcd..80c6813dae 100644
--- a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxQuotaLegacyModule.java
+++ b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxQuotaLegacyModule.java
@@ -28,6 +28,7 @@ import com.google.inject.Scopes;
 import com.google.inject.multibindings.Multibinder;
 import com.google.inject.name.Names;
 
+@Deprecated() // To be removed after release 3.9.0
 public class CassandraMailboxQuotaLegacyModule extends AbstractModule {
     @Override
     protected void configure() {


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org