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