You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2023/08/30 07:50:49 UTC
[james-project] branch james-3926-mailbox-current-quotas created (now d01b1e825b)
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a change to branch james-3926-mailbox-current-quotas
in repository https://gitbox.apache.org/repos/asf/james-project.git
at d01b1e825b JAMES-3926 Using CassandraCurrentQuotaManagerV2 instead of deprecated V1 for Cassandra tests
This branch includes the following new commits:
new 85bef866fb JAMES-3926 Implement CassandraCurrentQuotaManagerV2
new 9b182105f7 JAMES-3926 Implement FakeCassandraCurrentQuotaManager
new a2e1b0f0a0 JAMES-3926 Implement CassandraCurrentQuotaManagerMigration
new a76adbc9ba JAMES-3926 Configuration for quota compatibility mode
new c6fb69ad18 JAMES-3926 Module choosing for Mailbox Quota
new 796ee9be2a JAMES-3926 Register CassandraCurrentQuotaManagerMigration
new a4b1e745fc JAMES-3926 Mark older mailbox current quota datamodel as deprecated
new 9733a6b9cc JAMES-3926 Upgrade instructions
new f14f6d2e1c JAMES-3926 fetch current mailbox quotas with only 1 cassandra request
new d01b1e825b JAMES-3926 Using CassandraCurrentQuotaManagerV2 instead of deprecated V1 for Cassandra tests
The 10 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.
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org
[james-project] 06/10: JAMES-3926 Register CassandraCurrentQuotaManagerMigration
Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch james-3926-mailbox-current-quotas
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 796ee9be2a25ff82b26a88fc40e5d5c21af92e98
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] 05/10: JAMES-3926 Module choosing for Mailbox Quota
Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch james-3926-mailbox-current-quotas
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit c6fb69ad1810484fd036f915abc5a5545c2c25a4
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] 03/10: JAMES-3926 Implement CassandraCurrentQuotaManagerMigration
Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch james-3926-mailbox-current-quotas
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit a2e1b0f0a0fe36d798d7e30ad3c84bd9696f4f5a
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] 01/10: JAMES-3926 Implement CassandraCurrentQuotaManagerV2
Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch james-3926-mailbox-current-quotas
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 85bef866fb552c5935b0273782f232dae61e2806
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] 08/10: JAMES-3926 Upgrade instructions
Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch james-3926-mailbox-current-quotas
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 9733a6b9cc0bfdecd55ac0a2c8b5ff9542438351
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] 07/10: JAMES-3926 Mark older mailbox current quota datamodel as deprecated
Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch james-3926-mailbox-current-quotas
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit a4b1e745fc62912f382aa9ccee6372ff4f2c6964
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
[james-project] 10/10: JAMES-3926 Using CassandraCurrentQuotaManagerV2 instead of deprecated V1 for Cassandra tests
Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch james-3926-mailbox-current-quotas
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit d01b1e825bf8cad20b47cbc323d346bb7cab742d
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] 02/10: JAMES-3926 Implement FakeCassandraCurrentQuotaManager
Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch james-3926-mailbox-current-quotas
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 9b182105f70a7f17df0292e2ebe181241335e144
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] 09/10: JAMES-3926 fetch current mailbox quotas with only 1 cassandra request
Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch james-3926-mailbox-current-quotas
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit f14f6d2e1c886dfa66ad041f73bbe7265dd49dce
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/10: JAMES-3926 Configuration for quota compatibility mode
Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch james-3926-mailbox-current-quotas
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit a76adbc9ba9a80dca91c98fb78be52f82e1c52a6
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