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

[james-project] 24/39: JAMES-3137 Move Cassandra cache session initialization to its own module

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 41035e157dae8d54213e8cd648f4593ca4d9f0ac
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Apr 9 09:55:35 2020 +0700

    JAMES-3137 Move Cassandra cache session initialization to its own module
---
 .../CassandraRabbitMQAwsS3SmtpTestRuleFactory.java |  8 +++
 .../mpt/smtp/CassandraSmtpTestRuleFactory.java     |  8 +++
 .../mailbox/CassandraCacheSessionModule.java       | 84 ++++++++++++++++++++++
 .../modules/mailbox/CassandraSessionModule.java    | 51 +++----------
 .../java/org/apache/james/CacheSessionTest.java    |  5 +-
 5 files changed, 110 insertions(+), 46 deletions(-)

diff --git a/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java b/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
index fe02a02..01c82b4 100644
--- a/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
+++ b/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
@@ -29,6 +29,7 @@ import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.modules.TestAwsS3BlobStoreModule;
 import org.apache.james.modules.TestRabbitMQModule;
 import org.apache.james.modules.blobstore.BlobStoreChoosingModule;
+import org.apache.james.modules.mailbox.KeyspacesConfiguration;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import org.apache.james.modules.protocols.SmtpGuiceProbe.SmtpServerConnectedType;
 import org.apache.james.modules.rabbitmq.RabbitMQModule;
@@ -64,6 +65,13 @@ public final class CassandraRabbitMQAwsS3SmtpTestRuleFactory {
             .overrideWith(
                 new TestRabbitMQModule(DockerRabbitMQSingleton.SINGLETON),
                 new TestAwsS3BlobStoreModule(awsS3TestRule),
+                binder -> binder.bind(KeyspacesConfiguration.class)
+                    .toInstance(KeyspacesConfiguration.builder()
+                        .keyspace(DockerCassandra.KEYSPACE)
+                        .cacheKeyspace(DockerCassandra.CACHE_KEYSPACE)
+                        .replicationFactor(1)
+                        .disableDurableWrites()
+                        .build()),
                 binder -> binder.bind(ClusterConfiguration.class).toInstance(
                     DockerCassandra.configurationBuilder(cassandraHost)
                         .build()),
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
index e8d85c8..98cb9c4 100644
--- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
@@ -24,6 +24,7 @@ import org.apache.james.GuiceJamesServer;
 import org.apache.james.backends.cassandra.DockerCassandra;
 import org.apache.james.backends.cassandra.init.configuration.ClusterConfiguration;
 import org.apache.james.dnsservice.api.DNSService;
+import org.apache.james.modules.mailbox.KeyspacesConfiguration;
 import org.apache.james.modules.protocols.SmtpGuiceProbe.SmtpServerConnectedType;
 import org.apache.james.modules.server.CamelMailetContainerModule;
 import org.apache.james.queue.api.MailQueueItemDecoratorFactory;
@@ -55,6 +56,13 @@ public final class CassandraSmtpTestRuleFactory {
                 binder -> binder.bind(ClusterConfiguration.class).toInstance(
                     DockerCassandra.configurationBuilder(cassandraHost)
                         .build()),
+                binder -> binder.bind(KeyspacesConfiguration.class)
+                    .toInstance(KeyspacesConfiguration.builder()
+                        .keyspace(DockerCassandra.KEYSPACE)
+                        .cacheKeyspace(DockerCassandra.CACHE_KEYSPACE)
+                        .replicationFactor(1)
+                        .disableDurableWrites()
+                        .build()),
                 binder -> binder.bind(DNSService.class).toInstance(dnsService));
     }
 }
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraCacheSessionModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraCacheSessionModule.java
new file mode 100644
index 0000000..71796b1
--- /dev/null
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraCacheSessionModule.java
@@ -0,0 +1,84 @@
+/****************************************************************
+ * 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.modules.mailbox;
+
+import java.util.Set;
+
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.init.KeyspaceFactory;
+import org.apache.james.backends.cassandra.init.SessionWithInitializedTablesFactory;
+import org.apache.james.backends.cassandra.init.configuration.ClusterConfiguration;
+import org.apache.james.backends.cassandra.init.configuration.InjectionNames;
+import org.apache.james.backends.cassandra.init.configuration.KeyspaceConfiguration;
+
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.Session;
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Provides;
+import com.google.inject.Scopes;
+import com.google.inject.Singleton;
+import com.google.inject.multibindings.Multibinder;
+import com.google.inject.name.Named;
+import com.google.inject.name.Names;
+
+public class CassandraCacheSessionModule extends AbstractModule {
+    @Override
+    protected void configure() {
+        bind(InitializedCacheCluster.class).in(Scopes.SINGLETON);
+        Multibinder.newSetBinder(binder(), CassandraModule.class, Names.named(InjectionNames.CACHE));
+    }
+
+    @Named(InjectionNames.CACHE)
+    @Provides
+    @Singleton
+    KeyspaceConfiguration provideCacheKeyspaceConfiguration(KeyspacesConfiguration keyspacesConfiguration) {
+        return keyspacesConfiguration.cacheKeyspaceConfiguration();
+    }
+
+    @Singleton
+    @Named(InjectionNames.CACHE)
+    @Provides
+    Session provideSession(@Named(InjectionNames.CACHE) KeyspaceConfiguration keyspaceConfiguration,
+                           InitializedCacheCluster cluster,
+                           @Named(InjectionNames.CACHE) CassandraModule module) {
+        return new SessionWithInitializedTablesFactory(keyspaceConfiguration, cluster.cluster, module).get();
+    }
+
+    @Named(InjectionNames.CACHE)
+    @Provides
+    @Singleton
+    CassandraModule composeCacheDefinitions(@Named(InjectionNames.CACHE) Set<CassandraModule> modules) {
+        return CassandraModule.aggregateModules(modules);
+    }
+
+    static class InitializedCacheCluster {
+        private final Cluster cluster;
+
+        @Inject
+        private InitializedCacheCluster(Cluster cluster, ClusterConfiguration clusterConfiguration, KeyspacesConfiguration keyspacesConfiguration) {
+            this.cluster = cluster;
+
+            if (clusterConfiguration.shouldCreateKeyspace()) {
+                KeyspaceFactory.createKeyspace(keyspacesConfiguration.cacheKeyspaceConfiguration(), cluster);
+            }
+        }
+    }
+}
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
index e68713e..d8004f2 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraSessionModule.java
@@ -30,7 +30,6 @@ import org.apache.james.backends.cassandra.init.ResilientClusterProvider;
 import org.apache.james.backends.cassandra.init.SessionWithInitializedTablesFactory;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.init.configuration.ClusterConfiguration;
-import org.apache.james.backends.cassandra.init.configuration.InjectionNames;
 import org.apache.james.backends.cassandra.init.configuration.KeyspaceConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraHealthCheck;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
@@ -39,7 +38,6 @@ import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManage
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.core.healthcheck.HealthCheck;
 import org.apache.james.lifecycle.api.StartUpCheck;
-import org.apache.james.lifecycle.api.Startable;
 import org.apache.james.mailbox.store.BatchSizes;
 import org.apache.james.server.CassandraProbe;
 import org.apache.james.util.Host;
@@ -57,8 +55,6 @@ import com.google.inject.Provides;
 import com.google.inject.Scopes;
 import com.google.inject.Singleton;
 import com.google.inject.multibindings.Multibinder;
-import com.google.inject.name.Named;
-import com.google.inject.name.Names;
 
 public class CassandraSessionModule extends AbstractModule {
 
@@ -75,19 +71,13 @@ public class CassandraSessionModule extends AbstractModule {
         bind(Cluster.class).toProvider(ResilientClusterProvider.class);
 
         bind(InitializedCluster.class).in(Scopes.SINGLETON);
-        bind(MainSessionWithInitializedTablesFactory.class).in(Scopes.SINGLETON);
-        bind(CacheSessionWithInitializedTablesFactory.class).in(Scopes.SINGLETON);
 
-        bind(Session.class).toProvider(MainSessionWithInitializedTablesFactory.class);
-        bind(Session.class).annotatedWith(Names.named(InjectionNames.CACHE))
-            .toProvider(CacheSessionWithInitializedTablesFactory.class);
+        bind(Session.class).toProvider(SessionWithInitializedTablesFactory.class);
 
         Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
         cassandraDataDefinitions.addBinding().toInstance(CassandraZonedDateTimeModule.MODULE);
         cassandraDataDefinitions.addBinding().toInstance(CassandraSchemaVersionModule.MODULE);
 
-        Multibinder.newSetBinder(binder(), CassandraModule.class, Names.named(InjectionNames.CACHE));
-
         bind(CassandraSchemaVersionManager.class).in(Scopes.SINGLETON);
         bind(CassandraSchemaVersionDAO.class).in(Scopes.SINGLETON);
 
@@ -99,16 +89,17 @@ public class CassandraSessionModule extends AbstractModule {
         Multibinder.newSetBinder(binder(), HealthCheck.class).addBinding().to(CassandraHealthCheck.class);
     }
 
-    @Provides
     @Singleton
-    CassandraModule composeDataDefinitions(Set<CassandraModule> modules) {
-        return CassandraModule.aggregateModules(modules);
+    @Provides
+    SessionWithInitializedTablesFactory provideSessionFactory(KeyspaceConfiguration keyspaceConfiguration,
+                                               InitializedCluster cluster,
+                                               CassandraModule module) {
+        return new SessionWithInitializedTablesFactory(keyspaceConfiguration, cluster.cluster, module);
     }
 
-    @Named(InjectionNames.CACHE)
     @Provides
     @Singleton
-    CassandraModule composeCacheDefinitions(@Named(InjectionNames.CACHE) Set<CassandraModule> modules) {
+    CassandraModule composeDataDefinitions(Set<CassandraModule> modules) {
         return CassandraModule.aggregateModules(modules);
     }
 
@@ -174,32 +165,7 @@ public class CassandraSessionModule extends AbstractModule {
         return keyspacesConfiguration.mainKeyspaceConfiguration();
     }
 
-    @Named(InjectionNames.CACHE)
-    @Provides
-    @Singleton
-    KeyspaceConfiguration provideCacheKeyspaceConfiguration(KeyspacesConfiguration keyspacesConfiguration) {
-        return keyspacesConfiguration.cacheKeyspaceConfiguration();
-    }
-
-    private static class MainSessionWithInitializedTablesFactory extends SessionWithInitializedTablesFactory {
-        @Inject
-        public MainSessionWithInitializedTablesFactory(KeyspaceConfiguration keyspaceConfiguration,
-                                                       InitializedCluster cluster,
-                                                       CassandraModule module) {
-            super(keyspaceConfiguration, cluster.cluster, module);
-        }
-    }
-
-    private static class CacheSessionWithInitializedTablesFactory extends SessionWithInitializedTablesFactory {
-        @Inject
-        public CacheSessionWithInitializedTablesFactory(@Named(InjectionNames.CACHE) KeyspaceConfiguration keyspaceConfiguration,
-                                                        InitializedCluster cluster,
-                                                        @Named(InjectionNames.CACHE) CassandraModule module) {
-            super(keyspaceConfiguration, cluster.cluster, module);
-        }
-    }
-
-    private static class InitializedCluster implements Startable {
+    static class InitializedCluster {
         private final Cluster cluster;
 
         @Inject
@@ -208,7 +174,6 @@ public class CassandraSessionModule extends AbstractModule {
 
             if (clusterConfiguration.shouldCreateKeyspace()) {
                 KeyspaceFactory.createKeyspace(keyspacesConfiguration.mainKeyspaceConfiguration(), cluster);
-                KeyspaceFactory.createKeyspace(keyspacesConfiguration.cacheKeyspaceConfiguration(), cluster);
             }
         }
     }
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CacheSessionTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CacheSessionTest.java
index ca6f9a7..d689285 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CacheSessionTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CacheSessionTest.java
@@ -21,14 +21,13 @@ package org.apache.james;
 
 import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
 import static org.apache.james.CassandraJamesServerMain.ALL_BUT_JMX_CASSANDRA_MODULE;
-import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatCode;
 
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.init.configuration.InjectionNames;
 import org.apache.james.lifecycle.api.StartUpCheck;
-import org.apache.james.modules.ConfigurationProbe;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.mailbox.CassandraCacheSessionModule;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
@@ -79,7 +78,7 @@ class CacheSessionTest {
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(ALL_BUT_JMX_CASSANDRA_MODULE)
+            .combineWith(ALL_BUT_JMX_CASSANDRA_MODULE, new CassandraCacheSessionModule())
             .overrideWith(TestJMAPServerModule.limitToTenMessages()))
         .overrideServerModule(binder -> Multibinder.newSetBinder(binder, CassandraModule.class, Names.named(InjectionNames.CACHE))
             .addBinding()


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