You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2022/08/22 15:59:12 UTC

[james-project] branch master updated (b9bebce005 -> b26a9d82ee)

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

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


    from b9bebce005 JAMES-3788 JMAP/WebAdmin add X-Real-IP to logging MDC (#1138)
     new 33c750fbf6 JAMES-3774 Fasten keyspace creation
     new b26a9d82ee JAMES-3774 MPT tests should rely on CassandraClusterExtension

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


Summary of changes:
 .../backends/cassandra/init/ClusterFactory.java    | 11 ++++++---
 .../backends/cassandra/init/KeyspaceFactory.java   | 22 ++----------------
 .../cassandra/host/CassandraHostSystem.java        | 16 +++----------
 .../host/CassandraHostSystemExtension.java         | 10 ++++----
 .../cassandra/CassandraManageSieveMPTTest.java     | 25 +++++++++++---------
 .../cassandra/host/CassandraHostSystem.java        | 27 +++-------------------
 6 files changed, 36 insertions(+), 75 deletions(-)


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


[james-project] 02/02: JAMES-3774 MPT tests should rely on CassandraClusterExtension

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

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

commit b26a9d82eeceedf6f34e1a0aa5d59473e51b0b3d
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Aug 22 12:11:47 2022 +0700

    JAMES-3774 MPT tests should rely on CassandraClusterExtension
    
    Allows reusing of CqlSession across tests, significantly fasting the MPT tests up (by an order of magnitude!)
---
 .../cassandra/host/CassandraHostSystem.java        | 16 +++----------
 .../host/CassandraHostSystemExtension.java         | 10 ++++----
 .../cassandra/CassandraManageSieveMPTTest.java     | 25 +++++++++++---------
 .../cassandra/host/CassandraHostSystem.java        | 27 +++-------------------
 4 files changed, 26 insertions(+), 52 deletions(-)

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 60e8b0b911..aec693c450 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
@@ -35,7 +35,6 @@ 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.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManager;
 import org.apache.james.mailbox.cassandra.quota.CassandraGlobalMaxQuotaDao;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerDomainMaxQuotaDao;
@@ -66,7 +65,6 @@ import org.apache.james.metrics.tests.RecordingMetricFactory;
 import org.apache.james.mpt.api.ImapFeatures;
 import org.apache.james.mpt.api.ImapFeatures.Feature;
 import org.apache.james.mpt.host.JamesImapHostSystem;
-import org.apache.james.util.Host;
 
 import com.datastax.oss.driver.api.core.CqlSession;
 
@@ -79,13 +77,12 @@ public class CassandraHostSystem extends JamesImapHostSystem {
         Feature.ANNOTATION_SUPPORT,
         Feature.MOD_SEQ_SEARCH);
 
-    private final Host cassandraHost;
+    private final CassandraCluster cassandra;
     private CassandraMailboxManager mailboxManager;
-    private CassandraCluster cassandra;
     private CassandraPerUserMaxQuotaManager perUserMaxQuotaManager;
     
-    public CassandraHostSystem(Host cassandraHost) {
-        this.cassandraHost = cassandraHost;
+    public CassandraHostSystem(CassandraCluster cluster) {
+        this.cassandra = cluster;
     }
 
     public CassandraCluster getCassandra() {
@@ -95,7 +92,6 @@ public class CassandraHostSystem extends JamesImapHostSystem {
     @Override
     public void beforeTest() throws Exception {
         super.beforeTest();
-        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE_WITH_QUOTA, cassandraHost);
         CqlSession session = cassandra.getConf();
         CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory();
         ThreadIdGuessingAlgorithm threadIdGuessingAlgorithm = new NaiveThreadIdGuessingAlgorithm();
@@ -138,12 +134,6 @@ public class CassandraHostSystem extends JamesImapHostSystem {
                 DefaultImapProcessorFactory.createDefaultProcessor(mailboxManager, eventBus, subscriptionManager, quotaManager, quotaRootResolver, new DefaultMetricFactory()));
     }
 
-    @Override
-    public void afterTest() throws Exception {
-        super.afterTest();
-        cassandra.close();
-    }
-
     @Override
     public boolean supports(Feature... features) {
         return IMAP_FEATURES.supports(features);
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystemExtension.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystemExtension.java
index 1c329229a4..b329f93dad 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystemExtension.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystemExtension.java
@@ -18,7 +18,8 @@
  ****************************************************************/
 package org.apache.james.mpt.imapmailbox.cassandra.host;
 
-import org.apache.james.backends.cassandra.DockerCassandraExtension;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mpt.host.JamesImapHostSystem;
 import org.junit.jupiter.api.extension.AfterAllCallback;
 import org.junit.jupiter.api.extension.AfterEachCallback;
@@ -27,11 +28,11 @@ import org.junit.jupiter.api.extension.BeforeEachCallback;
 import org.junit.jupiter.api.extension.ExtensionContext;
 
 public class CassandraHostSystemExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback {
-    private final DockerCassandraExtension cassandraExtension;
+    private final CassandraClusterExtension cassandraExtension;
     private CassandraHostSystem system;
 
     public CassandraHostSystemExtension() {
-        this.cassandraExtension = new DockerCassandraExtension();
+        this.cassandraExtension = new CassandraClusterExtension(MailboxAggregateModule.MODULE_WITH_QUOTA);
     }
 
     @Override
@@ -42,6 +43,7 @@ public class CassandraHostSystemExtension implements BeforeAllCallback, AfterAll
     @Override
     public void afterEach(ExtensionContext extensionContext) throws Exception {
         system.afterTest();
+        cassandraExtension.afterEach(extensionContext);
     }
 
     @Override
@@ -52,7 +54,7 @@ public class CassandraHostSystemExtension implements BeforeAllCallback, AfterAll
     @Override
     public void beforeEach(ExtensionContext extensionContext) throws Exception {
         cassandraExtension.beforeEach(extensionContext);
-        system = new CassandraHostSystem(cassandraExtension.getDockerCassandra().getHost());
+        system = new CassandraHostSystem(cassandraExtension.getCassandraCluster());
         system.beforeTest();
     }
 
diff --git a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraManageSieveMPTTest.java b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraManageSieveMPTTest.java
index d31ffcfc6d..0064a456d7 100644
--- a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraManageSieveMPTTest.java
+++ b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/CassandraManageSieveMPTTest.java
@@ -19,21 +19,29 @@
 
 package org.apache.james.mpt.managesieve.cassandra;
 
-import org.apache.james.backends.cassandra.DockerCassandraExtension;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.domainlist.cassandra.CassandraDomainListModule;
 import org.apache.james.mpt.ManageSieveMPTContract;
 import org.apache.james.mpt.host.ManageSieveHostSystem;
 import org.apache.james.mpt.managesieve.cassandra.host.CassandraHostSystem;
-import org.junit.jupiter.api.AfterEach;
+import org.apache.james.sieve.cassandra.CassandraSieveRepositoryModule;
+import org.apache.james.user.cassandra.CassandraUsersRepositoryModule;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(DockerCassandraExtension.class)
 class CassandraManageSieveMPTTest implements ManageSieveMPTContract {
+    @RegisterExtension
+    static CassandraClusterExtension cassandra = new CassandraClusterExtension(CassandraModule.aggregateModules(
+        CassandraDomainListModule.MODULE,
+        CassandraSieveRepositoryModule.MODULE,
+        CassandraUsersRepositoryModule.MODULE));
+
     private ManageSieveHostSystem system;
 
     @BeforeEach
-    void setUp(DockerCassandraExtension.DockerCassandra dockerCassandra) throws Exception {
-        system = new CassandraHostSystem(dockerCassandra.getHost());
+    void setUp() throws Exception {
+        system = new CassandraHostSystem(cassandra.getCassandraCluster());
         system.beforeTest();
     }
 
@@ -41,9 +49,4 @@ class CassandraManageSieveMPTTest implements ManageSieveMPTContract {
     public ManageSieveHostSystem hostSystem() {
         return system;
     }
-
-    @AfterEach
-    void tearDown() throws Exception {
-        hostSystem().afterTest();
-    }
 }
diff --git a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/host/CassandraHostSystem.java b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/host/CassandraHostSystem.java
index ca0fd9fb4a..7684e3dfb1 100644
--- a/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/host/CassandraHostSystem.java
+++ b/mpt/impl/managesieve/cassandra/src/test/java/org/apache/james/mpt/managesieve/cassandra/host/CassandraHostSystem.java
@@ -20,39 +20,23 @@
 package org.apache.james.mpt.managesieve.cassandra.host;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.domainlist.api.DomainList;
-import org.apache.james.domainlist.cassandra.CassandraDomainListModule;
 import org.apache.james.mpt.host.JamesManageSieveHostSystem;
 import org.apache.james.sieve.cassandra.CassandraActiveScriptDAO;
 import org.apache.james.sieve.cassandra.CassandraSieveDAO;
 import org.apache.james.sieve.cassandra.CassandraSieveQuotaDAO;
 import org.apache.james.sieve.cassandra.CassandraSieveRepository;
-import org.apache.james.sieve.cassandra.CassandraSieveRepositoryModule;
 import org.apache.james.sieverepository.api.SieveRepository;
 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.apache.james.util.Host;
 
 public class CassandraHostSystem extends JamesManageSieveHostSystem {
     private static final DomainList NO_DOMAIN_LIST = null;
-    private final Host cassandraHost;
-    private CassandraCluster cassandra;
+    private final CassandraCluster cassandra;
 
-    public CassandraHostSystem(Host cassandraHost) {
-        this.cassandraHost = cassandraHost;
-    }
-
-    @Override
-    public void beforeTest() throws Exception {
-        CassandraModule modules = CassandraModule.aggregateModules(
-            CassandraDomainListModule.MODULE,
-            CassandraSieveRepositoryModule.MODULE,
-            CassandraUsersRepositoryModule.MODULE);
-        cassandra = CassandraCluster.create(modules, cassandraHost);
-        super.beforeTest();
+    public CassandraHostSystem(CassandraCluster cassandra) {
+        this.cassandra = cassandra;
     }
 
     @Override
@@ -70,9 +54,4 @@ public class CassandraHostSystem extends JamesManageSieveHostSystem {
         usersRepository.setEnableVirtualHosting(false);
         return usersRepository;
     }
-
-    @Override
-    public void afterTest() {
-        cassandra.close();
-    }
 }


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


[james-project] 01/02: JAMES-3774 Fasten keyspace creation

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

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

commit 33c750fbf616f132e226527a765c6e2a2555ead1
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Aug 22 12:09:35 2022 +0700

    JAMES-3774 Fasten keyspace creation
    
    Because CqlSession is immutable, keyspace creation is
    attempted on a dedicated, temporary session. We can
    close that temporary session in an asynchronous fashion,
    which is faster (~1 second)
    
    Also use CqlSession metadata to see if the cluster exists.
---
 .../backends/cassandra/init/ClusterFactory.java    | 11 ++++++++---
 .../backends/cassandra/init/KeyspaceFactory.java   | 22 ++--------------------
 2 files changed, 10 insertions(+), 23 deletions(-)

diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/ClusterFactory.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/ClusterFactory.java
index b33cb54051..6637df9815 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/ClusterFactory.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/ClusterFactory.java
@@ -45,9 +45,8 @@ public class ClusterFactory {
 
         sessionBuilder.withLocalDatacenter(configuration.getLocalDC().orElse("datacenter1"));
 
-        try (CqlSession session = sessionBuilder.build()) {
-            KeyspaceFactory.createKeyspace(keyspaceConfiguration, session);
-        }
+        createKeyspace(keyspaceConfiguration, sessionBuilder);
+
         sessionBuilder.withKeyspace(keyspaceConfiguration.getKeyspace());
         CqlSession session = sessionBuilder.build();
 
@@ -60,6 +59,12 @@ public class ClusterFactory {
         }
     }
 
+    private static void createKeyspace(KeyspaceConfiguration keyspaceConfiguration, CqlSessionBuilder sessionBuilder) {
+        CqlSession cqlSession = sessionBuilder.build();
+        KeyspaceFactory.createKeyspace(keyspaceConfiguration, cqlSession);
+        cqlSession.forceCloseAsync();
+    }
+
     private static void ensureContactable(CqlSession session) {
         session.execute("SELECT dateof(now()) FROM system.local ;");
     }
diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/KeyspaceFactory.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/KeyspaceFactory.java
index b942975f0a..a52029ec77 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/KeyspaceFactory.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/init/KeyspaceFactory.java
@@ -19,21 +19,15 @@
 
 package org.apache.james.backends.cassandra.init;
 
-import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.literal;
-import static com.datastax.oss.driver.api.querybuilder.QueryBuilder.selectFrom;
-
 import org.apache.james.backends.cassandra.init.configuration.KeyspaceConfiguration;
 
+import com.datastax.oss.driver.api.core.CqlIdentifier;
 import com.datastax.oss.driver.api.core.CqlSession;
 import com.datastax.oss.driver.api.querybuilder.SchemaBuilder;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableMap;
 
 public class KeyspaceFactory {
-    private static final String SYSTEM_SCHEMA = "system_schema";
-    private static final String KEYSPACES = "keyspaces";
-    private static final String KEYSPACE_NAME = "keyspace_name";
-
     public static void createKeyspace(KeyspaceConfiguration configuration, CqlSession session) {
         if (!keyspaceExist(session, configuration.getKeyspace())) {
             session.execute(SchemaBuilder.createKeyspace(configuration.getKeyspace())
@@ -49,18 +43,6 @@ public class KeyspaceFactory {
 
     @VisibleForTesting
     public static boolean keyspaceExist(CqlSession session, String keyspaceName) {
-        long numberOfKeyspaces = session.execute(selectFrom(SYSTEM_SCHEMA, KEYSPACES)
-                .countAll()
-                .whereColumn(KEYSPACE_NAME)
-                    .isEqualTo(literal(keyspaceName))
-            .build())
-            .one()
-            .getLong("count");
-
-        if (numberOfKeyspaces > 1 || numberOfKeyspaces < 0) {
-            throw new IllegalStateException(String.format("unexpected keyspace('%s') count being %d", keyspaceName, numberOfKeyspaces));
-        }
-
-        return numberOfKeyspaces == 1;
+        return session.getMetadata().getKeyspaces().get(CqlIdentifier.fromCql(keyspaceName)) != null;
     }
 }


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