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:13 UTC

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

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