You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jl...@apache.org on 2022/08/12 11:46:35 UTC
[cassandra] branch trunk updated (5279d7f57e -> 570732375e)
This is an automated email from the ASF dual-hosted git repository.
jlewandowski pushed a change to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
from 5279d7f57e Merge branch 'cassandra-4.1' into trunk
add c1d89c32d2 Fix a race condition where a keyspace can be opened while it is being removed
new ab3b59ec42 Merge branch 'cassandra-4.1' into trunk
new 570732375e Fix a race condition where a keyspace can be opened while it is being removed
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:
CHANGES.txt | 1 +
src/java/org/apache/cassandra/db/Keyspace.java | 10 +-
.../schema/DefaultSchemaUpdateHandler.java | 13 +-
src/java/org/apache/cassandra/schema/Schema.java | 58 ++++----
.../cassandra/distributed/test/SchemaTest.java | 34 +++++
.../org/apache/cassandra/cql3/CorruptionTest.java | 21 ++-
.../unit/org/apache/cassandra/ServerTestUtils.java | 11 ++
.../cassandra/audit/AuditLoggerAuthTest.java | 7 +-
.../DebuggableScheduledThreadPoolExecutorTest.java | 15 ++-
.../unit/org/apache/cassandra/cql3/BatchTests.java | 17 ++-
test/unit/org/apache/cassandra/cql3/CQLTester.java | 6 +-
.../unit/org/apache/cassandra/cql3/PagingTest.java | 11 +-
.../apache/cassandra/metrics/BatchMetricsTest.java | 26 ++--
.../apache/cassandra/metrics/CQLMetricsTest.java | 21 ++-
.../metrics/ClientRequestMetricsTest.java | 23 ++--
.../cassandra/metrics/KeyspaceMetricsTest.java | 36 ++---
.../apache/cassandra/metrics/TableMetricsTest.java | 23 ++--
.../org/apache/cassandra/schema/SchemaTest.java | 41 ++++--
.../cassandra/tools/nodetool/ClientStatsTest.java | 147 ++++++++++++---------
.../cassandra/transport/CQLUserAuditTest.java | 7 +-
20 files changed, 336 insertions(+), 192 deletions(-)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org
[cassandra] 02/02: Fix a race condition where a keyspace can be opened while it is being removed
Posted by jl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jlewandowski pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit 570732375e4186741388adb81afeab6f155f57b9
Author: Jacek Lewandowski <le...@gmail.com>
AuthorDate: Fri Jun 10 11:43:53 2022 +0200
Fix a race condition where a keyspace can be opened while it is being removed
patch by Jacek Lewandowski; reviewed by Andrés de la Peña and Ekaterina Dimitrova for CASSANDRA 17658
---
CHANGES.txt | 1 +
src/java/org/apache/cassandra/db/Keyspace.java | 10 +-
.../schema/DefaultSchemaUpdateHandler.java | 13 +-
src/java/org/apache/cassandra/schema/Schema.java | 58 ++++----
.../cassandra/distributed/test/SchemaTest.java | 34 +++++
.../org/apache/cassandra/cql3/CorruptionTest.java | 21 ++-
.../unit/org/apache/cassandra/ServerTestUtils.java | 11 ++
.../cassandra/audit/AuditLoggerAuthTest.java | 7 +-
.../DebuggableScheduledThreadPoolExecutorTest.java | 15 ++-
.../unit/org/apache/cassandra/cql3/BatchTests.java | 17 ++-
test/unit/org/apache/cassandra/cql3/CQLTester.java | 6 +-
.../unit/org/apache/cassandra/cql3/PagingTest.java | 11 +-
.../apache/cassandra/metrics/BatchMetricsTest.java | 26 ++--
.../apache/cassandra/metrics/CQLMetricsTest.java | 21 ++-
.../metrics/ClientRequestMetricsTest.java | 23 ++--
.../cassandra/metrics/KeyspaceMetricsTest.java | 36 ++---
.../apache/cassandra/metrics/TableMetricsTest.java | 23 ++--
.../org/apache/cassandra/schema/SchemaTest.java | 41 ++++--
.../cassandra/tools/nodetool/ClientStatsTest.java | 147 ++++++++++++---------
.../cassandra/transport/CQLUserAuditTest.java | 7 +-
20 files changed, 336 insertions(+), 192 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index ca1db37af3..204544b760 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -28,6 +28,7 @@
* Add guardrail for ALTER TABLE ADD / DROP / REMOVE column operations (CASSANDRA-17495)
* Rename DisableFlag class to EnableFlag on guardrails (CASSANDRA-17544)
Merged from 4.1:
+ * Fix a race condition where a keyspace can be oopened while it is being removed (CASSANDRA-17658)
* DatabaseDescriptor will set the default failure detector during client initialization (CASSANDRA-17782)
* Avoid initializing schema via SystemKeyspace.getPreferredIP() with the BulkLoader tool (CASSANDRA-17740)
* Uncomment prepared_statements_cache_size, key_cache_size, counter_cache_size, index_summary_capacity which were
diff --git a/src/java/org/apache/cassandra/db/Keyspace.java b/src/java/org/apache/cassandra/db/Keyspace.java
index 63c02be5db..d6db700519 100644
--- a/src/java/org/apache/cassandra/db/Keyspace.java
+++ b/src/java/org/apache/cassandra/db/Keyspace.java
@@ -126,7 +126,10 @@ public class Keyspace
public static void setInitialized()
{
- initialized = true;
+ synchronized (Schema.instance)
+ {
+ initialized = true;
+ }
}
/**
@@ -137,7 +140,10 @@ public class Keyspace
@VisibleForTesting
public static void unsetInitialized()
{
- initialized = false;
+ synchronized (Schema.instance)
+ {
+ initialized = false;
+ }
}
public static Keyspace open(String keyspaceName)
diff --git a/src/java/org/apache/cassandra/schema/DefaultSchemaUpdateHandler.java b/src/java/org/apache/cassandra/schema/DefaultSchemaUpdateHandler.java
index 1ccecc60fc..381b4e5ad9 100644
--- a/src/java/org/apache/cassandra/schema/DefaultSchemaUpdateHandler.java
+++ b/src/java/org/apache/cassandra/schema/DefaultSchemaUpdateHandler.java
@@ -24,7 +24,6 @@ import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.function.BiConsumer;
-import java.util.function.Consumer;
import java.util.stream.Collectors;
import com.google.common.annotations.VisibleForTesting;
@@ -47,7 +46,6 @@ import org.apache.cassandra.schema.SchemaTransformation.SchemaTransformationResu
import org.apache.cassandra.service.StorageService;
import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.Pair;
-import org.apache.cassandra.utils.concurrent.ImmediateFuture;
import static org.apache.cassandra.schema.MigrationCoordinator.MAX_OUTSTANDING_VERSION_REQUESTS;
@@ -257,12 +255,11 @@ public class DefaultSchemaUpdateHandler implements SchemaUpdateHandler, IEndpoin
@Override
public SchemaTransformationResult reset(boolean local)
{
- return local
- ? reload()
- : migrationCoordinator.pullSchemaFromAnyNode()
- .flatMap(mutations -> ImmediateFuture.success(applyMutations(mutations)))
- .awaitThrowUncheckedOnInterrupt()
- .getNow();
+ if (local)
+ return reload();
+
+ Collection<Mutation> mutations = migrationCoordinator.pullSchemaFromAnyNode().awaitThrowUncheckedOnInterrupt().getNow();
+ return applyMutations(mutations);
}
@Override
diff --git a/src/java/org/apache/cassandra/schema/Schema.java b/src/java/org/apache/cassandra/schema/Schema.java
index f89f8d5110..f23370c549 100644
--- a/src/java/org/apache/cassandra/schema/Schema.java
+++ b/src/java/org/apache/cassandra/schema/Schema.java
@@ -19,6 +19,7 @@ package org.apache.cassandra.schema;
import java.time.Duration;
import java.util.*;
+import java.util.function.Consumer;
import java.util.function.Supplier;
import com.google.common.annotations.VisibleForTesting;
@@ -227,15 +228,15 @@ public class Schema implements SchemaProvider
return keyspaceInstances.blockingLoadIfAbsent(keyspaceName, loadFunction);
}
- public Keyspace maybeRemoveKeyspaceInstance(String keyspaceName, boolean dropData)
+ private Keyspace maybeRemoveKeyspaceInstance(String keyspaceName, Consumer<Keyspace> unloadFunction)
{
try
{
- return keyspaceInstances.blockingUnloadIfPresent(keyspaceName, keyspace -> keyspace.unload(dropData));
+ return keyspaceInstances.blockingUnloadIfPresent(keyspaceName, unloadFunction);
}
catch (LoadingMap.UnloadExecutionException e)
{
- throw new AssertionError("Failed to unload the keyspace " + keyspaceName);
+ throw new AssertionError("Failed to unload the keyspace " + keyspaceName, e);
}
}
@@ -532,16 +533,6 @@ public class Schema implements SchemaProvider
SchemaDiagnostics.versionUpdated(this);
}
- /**
- * Clear all KS/CF metadata and reset version.
- */
- public synchronized void clear()
- {
- distributedKeyspaces.forEach(this::unload);
- updateVersion(SchemaConstants.emptyVersion);
- SchemaDiagnostics.schemaCleared(this);
- }
-
/**
* When we receive {@link SchemaTransformationResult} in a callback invocation, the transformation result includes
* pre-transformation and post-transformation schema metadata and versions, and a diff between them. Basically
@@ -617,16 +608,18 @@ public class Schema implements SchemaProvider
}
/**
- * Clear all locally stored schema information and reset schema to initial state.
+ * Clear all locally stored schema information and fetch schema from another node.
* Called by user (via JMX) who wants to get rid of schema disagreement.
*/
- public void resetLocalSchema()
+ public synchronized void resetLocalSchema()
{
logger.debug("Clearing local schema...");
updateHandler.clear();
logger.debug("Clearing local schema keyspace instances...");
- clear();
+ distributedKeyspaces.forEach(this::unload);
+ updateVersion(SchemaConstants.emptyVersion);
+ SchemaDiagnostics.schemaCleared(this);
updateHandler.reset(false);
logger.info("Local schema reset is complete.");
@@ -692,37 +685,40 @@ public class Schema implements SchemaProvider
// we send mutations to the correct set of bootstrapping nodes. Refer CASSANDRA-15433.
if (keyspace.params.replication.klass != LocalStrategy.class && Keyspace.isInitialized())
{
- PendingRangeCalculatorService.calculatePendingRanges(Keyspace.open(keyspace.name).getReplicationStrategy(), keyspace.name);
+ PendingRangeCalculatorService.calculatePendingRanges(Keyspace.open(keyspace.name, this, true).getReplicationStrategy(), keyspace.name);
}
}
- private void dropKeyspace(KeyspaceMetadata keyspace, boolean dropData)
+ private void dropKeyspace(KeyspaceMetadata keyspaceMetadata, boolean dropData)
{
- SchemaDiagnostics.keyspaceDropping(this, keyspace);
+ SchemaDiagnostics.keyspaceDropping(this, keyspaceMetadata);
boolean initialized = Keyspace.isInitialized();
- Keyspace ks = initialized ? getKeyspaceInstance(keyspace.name) : null;
+ Keyspace keyspace = initialized ? Keyspace.open(keyspaceMetadata.name, this, false) : null;
if (initialized)
{
- if (ks == null)
+ if (keyspace == null)
return;
- keyspace.views.forEach(v -> dropView(ks, v, dropData));
- keyspace.tables.forEach(t -> dropTable(ks, t, dropData));
+ keyspaceMetadata.views.forEach(v -> dropView(keyspace, v, dropData));
+ keyspaceMetadata.tables.forEach(t -> dropTable(keyspace, t, dropData));
// remove the keyspace from the static instances
- maybeRemoveKeyspaceInstance(keyspace.name, dropData);
- }
+ Keyspace unloadedKeyspace = maybeRemoveKeyspaceInstance(keyspaceMetadata.name, ks -> {
+ ks.unload(dropData);
+ unload(keyspaceMetadata);
+ });
+ assert unloadedKeyspace == keyspace;
- unload(keyspace);
-
- if (initialized)
- {
Keyspace.writeOrder.awaitNewBarrier();
}
+ else
+ {
+ unload(keyspaceMetadata);
+ }
- schemaChangeNotifier.notifyKeyspaceDropped(keyspace, dropData);
- SchemaDiagnostics.keyspaceDropped(this, keyspace);
+ schemaChangeNotifier.notifyKeyspaceDropped(keyspaceMetadata, dropData);
+ SchemaDiagnostics.keyspaceDropped(this, keyspaceMetadata);
}
private void dropView(Keyspace keyspace, ViewMetadata metadata, boolean dropData)
diff --git a/test/distributed/org/apache/cassandra/distributed/test/SchemaTest.java b/test/distributed/org/apache/cassandra/distributed/test/SchemaTest.java
index a2ce32f6f3..7b03105063 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/SchemaTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/SchemaTest.java
@@ -18,10 +18,15 @@
package org.apache.cassandra.distributed.test;
+import java.time.Duration;
+
import org.junit.Test;
import org.apache.cassandra.distributed.Cluster;
import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.schema.Schema;
+import org.awaitility.Awaitility;
import static org.junit.Assert.assertTrue;
@@ -86,4 +91,33 @@ public class SchemaTest extends TestBaseImpl
assertTrue(causeIsUnknownColumn);
}
}
+
+ @Test
+ public void schemaReset() throws Throwable
+ {
+ try (Cluster cluster = init(Cluster.build(2).withConfig(cfg -> cfg.with(Feature.GOSSIP, Feature.NETWORK)).start()))
+ {
+ cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk INT PRIMARY KEY, v TEXT)");
+
+ assertTrue(cluster.get(1).callOnInstance(() -> Schema.instance.getTableMetadata(KEYSPACE, "tbl") != null));
+ assertTrue(cluster.get(2).callOnInstance(() -> Schema.instance.getTableMetadata(KEYSPACE, "tbl") != null));
+
+ cluster.get(2).shutdown().get();
+
+ // when schema is removed and there is no other node to fetch it from, node 1 should be left with clean schema
+ cluster.get(1).runOnInstance(() -> Schema.instance.resetLocalSchema());
+ assertTrue(cluster.get(1).callOnInstance(() -> Schema.instance.getTableMetadata(KEYSPACE, "tbl") == null));
+
+ // when the other node is started, schema should be back in sync
+ cluster.get(2).startup();
+ Awaitility.waitAtMost(Duration.ofMinutes(1))
+ .pollDelay(Duration.ofSeconds(1))
+ .until(() -> cluster.get(1).callOnInstance(() -> Schema.instance.getTableMetadata(KEYSPACE, "tbl") != null));
+
+ // when schema is removed and there is a node to fetch it from, node 1 should immediatelly restore the schema
+ cluster.get(1).runOnInstance(() -> Schema.instance.resetLocalSchema());
+ assertTrue(cluster.get(1).callOnInstance(() -> Schema.instance.getTableMetadata(KEYSPACE, "tbl") != null));
+ }
+ }
+
}
diff --git a/test/long/org/apache/cassandra/cql3/CorruptionTest.java b/test/long/org/apache/cassandra/cql3/CorruptionTest.java
index 78f587158a..0ef43a0991 100644
--- a/test/long/org/apache/cassandra/cql3/CorruptionTest.java
+++ b/test/long/org/apache/cassandra/cql3/CorruptionTest.java
@@ -26,7 +26,10 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
+import org.apache.cassandra.ServerTestUtils;
import org.apache.cassandra.io.util.File;
+
+import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -34,14 +37,12 @@ import com.datastax.driver.core.*;
import com.datastax.driver.core.policies.LoggingRetryPolicy;
import com.datastax.driver.core.policies.Policies;
import com.datastax.driver.core.utils.Bytes;
-import org.apache.cassandra.SchemaLoader;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.io.util.FileWriter;
-import org.apache.cassandra.schema.Schema;
import org.apache.cassandra.exceptions.ConfigurationException;
import org.apache.cassandra.service.EmbeddedCassandraService;
-public class CorruptionTest extends SchemaLoader
+public class CorruptionTest
{
private static EmbeddedCassandraService cassandra;
@@ -59,10 +60,7 @@ public class CorruptionTest extends SchemaLoader
@BeforeClass()
public static void setup() throws ConfigurationException, IOException
{
- Schema.instance.clear();
-
- cassandra = new EmbeddedCassandraService();
- cassandra.start();
+ cassandra = ServerTestUtils.startEmbeddedCassandraService();
cluster = Cluster.builder().addContactPoint("127.0.0.1")
.withRetryPolicy(new LoggingRetryPolicy(Policies.defaultRetryPolicy()))
@@ -102,6 +100,15 @@ public class CorruptionTest extends SchemaLoader
VALUE = s.toString();
}
+ @AfterClass
+ public static void tearDown()
+ {
+ if (cluster != null)
+ cluster.close();
+ if (cassandra != null)
+ cassandra.stop();
+ }
+
@Test
public void runCorruptionTest()
{
diff --git a/test/unit/org/apache/cassandra/ServerTestUtils.java b/test/unit/org/apache/cassandra/ServerTestUtils.java
index e35c8a6d0b..10cb082285 100644
--- a/test/unit/org/apache/cassandra/ServerTestUtils.java
+++ b/test/unit/org/apache/cassandra/ServerTestUtils.java
@@ -36,6 +36,7 @@ import org.apache.cassandra.locator.AbstractEndpointSnitch;
import org.apache.cassandra.locator.InetAddressAndPort;
import org.apache.cassandra.locator.Replica;
import org.apache.cassandra.security.ThreadAwareSecurityManager;
+import org.apache.cassandra.service.EmbeddedCassandraService;
/**
* Utility methodes used by SchemaLoader and CQLTester to manage the server and its state.
@@ -189,6 +190,16 @@ public final class ServerTestUtils
cleanupDirectory(DatabaseDescriptor.getSavedCachesLocation());
}
+ public static EmbeddedCassandraService startEmbeddedCassandraService() throws IOException
+ {
+ DatabaseDescriptor.daemonInitialization();
+ mkdirs();
+ cleanup();
+ EmbeddedCassandraService service = new EmbeddedCassandraService();
+ service.start();
+ return service;
+ }
+
private ServerTestUtils()
{
}
diff --git a/test/unit/org/apache/cassandra/audit/AuditLoggerAuthTest.java b/test/unit/org/apache/cassandra/audit/AuditLoggerAuthTest.java
index 71a88e526d..9a3c605f8e 100644
--- a/test/unit/org/apache/cassandra/audit/AuditLoggerAuthTest.java
+++ b/test/unit/org/apache/cassandra/audit/AuditLoggerAuthTest.java
@@ -33,11 +33,10 @@ import com.datastax.driver.core.Session;
import com.datastax.driver.core.exceptions.AuthenticationException;
import com.datastax.driver.core.exceptions.SyntaxError;
import com.datastax.driver.core.exceptions.UnauthorizedException;
-
+import org.apache.cassandra.ServerTestUtils;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.config.OverrideConfigurationLoader;
import org.apache.cassandra.config.ParameterizedClass;
-import org.apache.cassandra.cql3.CQLTester;
import org.apache.cassandra.cql3.PasswordObfuscator;
import org.apache.cassandra.locator.InetAddressAndPort;
import org.apache.cassandra.service.EmbeddedCassandraService;
@@ -75,11 +74,9 @@ public class AuditLoggerAuthTest
config.audit_logging_options.enabled = true;
config.audit_logging_options.logger = new ParameterizedClass("InMemoryAuditLogger", null);
});
- CQLTester.prepareServer();
System.setProperty("cassandra.superuser_setup_delay_ms", "0");
- embedded = new EmbeddedCassandraService();
- embedded.start();
+ embedded = ServerTestUtils.startEmbeddedCassandraService();
executeWithCredentials(
Arrays.asList(getCreateRoleCql(TEST_USER, true, false, false),
diff --git a/test/unit/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutorTest.java b/test/unit/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutorTest.java
index b37b014f00..c719d6bca6 100644
--- a/test/unit/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutorTest.java
+++ b/test/unit/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutorTest.java
@@ -26,10 +26,13 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger;
+import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.Assert;
+
+import org.apache.cassandra.ServerTestUtils;
import org.apache.cassandra.service.EmbeddedCassandraService;
import org.apache.cassandra.service.StorageService;
@@ -43,10 +46,14 @@ public class DebuggableScheduledThreadPoolExecutorTest
@BeforeClass
public static void startup() throws IOException
{
- //The DSTPE checks for if we are in the service shutdown hook so
- //to test it we need to start C* internally.
- service = new EmbeddedCassandraService();
- service.start();
+ service = ServerTestUtils.startEmbeddedCassandraService();
+ }
+
+ @AfterClass
+ public static void tearDown()
+ {
+ if (service != null)
+ service.stop();
}
@Test
diff --git a/test/unit/org/apache/cassandra/cql3/BatchTests.java b/test/unit/org/apache/cassandra/cql3/BatchTests.java
index 260db4eeed..f7629e204a 100644
--- a/test/unit/org/apache/cassandra/cql3/BatchTests.java
+++ b/test/unit/org/apache/cassandra/cql3/BatchTests.java
@@ -22,15 +22,18 @@ import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.exceptions.InvalidQueryException;
+import org.apache.cassandra.ServerTestUtils;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.exceptions.ConfigurationException;
import org.apache.cassandra.service.EmbeddedCassandraService;
+
+import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import java.io.IOException;
-public class BatchTests extends CQLTester
+public class BatchTests
{
private static EmbeddedCassandraService cassandra;
@@ -44,8 +47,7 @@ public class BatchTests extends CQLTester
@BeforeClass()
public static void setup() throws ConfigurationException, IOException
{
- cassandra = new EmbeddedCassandraService();
- cassandra.start();
+ cassandra = ServerTestUtils.startEmbeddedCassandraService();
cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
session = cluster.connect();
@@ -75,6 +77,15 @@ public class BatchTests extends CQLTester
clustering = session.prepare("insert into junit.clustering(id, clustering1, clustering2, clustering3, val) values(?,?,?,?,?)");
}
+ @AfterClass
+ public static void tearDown()
+ {
+ if (cluster != null)
+ cluster.close();
+ if (cassandra != null)
+ cassandra.stop();
+ }
+
@Test(expected = InvalidQueryException.class)
public void testMixedInCounterBatch()
{
diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java b/test/unit/org/apache/cassandra/cql3/CQLTester.java
index 7c2eebb8c5..f2734891c6 100644
--- a/test/unit/org/apache/cassandra/cql3/CQLTester.java
+++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java
@@ -429,12 +429,14 @@ public abstract class CQLTester
public static List<String> buildNodetoolArgs(List<String> args)
{
+ int port = jmxPort == 0 ? Integer.getInteger("cassandra.jmx.local.port", 7199) : jmxPort;
+ String host = jmxHost == null ? "127.0.0.1" : jmxHost;
List<String> allArgs = new ArrayList<>();
allArgs.add("bin/nodetool");
allArgs.add("-p");
- allArgs.add(Integer.toString(jmxPort));
+ allArgs.add(String.valueOf(port));
allArgs.add("-h");
- allArgs.add(jmxHost == null ? "127.0.0.1" : jmxHost);
+ allArgs.add(host);
allArgs.addAll(args);
return allArgs;
}
diff --git a/test/unit/org/apache/cassandra/cql3/PagingTest.java b/test/unit/org/apache/cassandra/cql3/PagingTest.java
index 9a95e03210..a3387c4e20 100644
--- a/test/unit/org/apache/cassandra/cql3/PagingTest.java
+++ b/test/unit/org/apache/cassandra/cql3/PagingTest.java
@@ -29,6 +29,7 @@ import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.SimpleStatement;
import com.datastax.driver.core.Statement;
+import org.apache.cassandra.ServerTestUtils;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.dht.Murmur3Partitioner.LongToken;
@@ -51,13 +52,14 @@ public class PagingTest
" WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 2 };";
private static final String dropKsStatement = "DROP KEYSPACE IF EXISTS " + KEYSPACE;
+ private static EmbeddedCassandraService cassandra;
@BeforeClass
public static void setup() throws Exception
{
System.setProperty("cassandra.config", "cassandra-murmur.yaml");
- EmbeddedCassandraService cassandra = new EmbeddedCassandraService();
- cassandra.start();
+
+ cassandra = ServerTestUtils.startEmbeddedCassandraService();
// Currently the native server start method return before the server is fully binded to the socket, so we need
// to wait slightly before trying to connect to it. We should fix this but in the meantime using a sleep.
@@ -75,7 +77,10 @@ public class PagingTest
@AfterClass
public static void tearDown()
{
- cluster.close();
+ if (cluster != null)
+ cluster.close();
+ if (cassandra != null)
+ cassandra.stop();
}
/**
diff --git a/test/unit/org/apache/cassandra/metrics/BatchMetricsTest.java b/test/unit/org/apache/cassandra/metrics/BatchMetricsTest.java
index aa6ad58636..b90f19a7fc 100644
--- a/test/unit/org/apache/cassandra/metrics/BatchMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/BatchMetricsTest.java
@@ -21,6 +21,7 @@ package org.apache.cassandra.metrics;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
+import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -28,20 +29,20 @@ import com.datastax.driver.core.BatchStatement;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Session;
-import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.ServerTestUtils;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.schema.Schema;
import org.apache.cassandra.service.EmbeddedCassandraService;
import static org.apache.cassandra.cql3.statements.BatchStatement.metrics;
-import static org.apache.cassandra.metrics.DecayingEstimatedHistogramReservoir.*;
+import static org.apache.cassandra.metrics.DecayingEstimatedHistogramReservoir.EstimatedHistogramReservoirSnapshot;
+import static org.apache.cassandra.metrics.DecayingEstimatedHistogramReservoir.Range;
import static org.junit.Assert.assertEquals;
import static org.quicktheories.QuickTheory.qt;
import static org.quicktheories.generators.Generate.intArrays;
import static org.quicktheories.generators.SourceDSL.integers;
-public class BatchMetricsTest extends SchemaLoader
+public class BatchMetricsTest
{
private static final int MAX_ROUNDS_TO_PERFORM = 3;
private static final int MAX_DISTINCT_PARTITIONS = 128;
@@ -62,13 +63,11 @@ public class BatchMetricsTest extends SchemaLoader
@BeforeClass()
public static void setup() throws ConfigurationException, IOException
{
- Schema.instance.clear();
-
- cassandra = new EmbeddedCassandraService();
- cassandra.start();
-
+ DatabaseDescriptor.daemonInitialization();
DatabaseDescriptor.setWriteRpcTimeout(TimeUnit.SECONDS.toMillis(10));
+ cassandra = ServerTestUtils.startEmbeddedCassandraService();
+
cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
session = cluster.connect();
@@ -81,6 +80,15 @@ public class BatchMetricsTest extends SchemaLoader
psCounter = session.prepare("UPDATE " + KEYSPACE + '.' + COUNTER_TABLE + " SET val = val + 1 WHERE id = ?;");
}
+ @AfterClass
+ public static void tearDown()
+ {
+ if (cluster != null)
+ cluster.close();
+ if (cassandra != null)
+ cassandra.stop();
+ }
+
private void executeLoggerBatch(BatchStatement.Type batchStatementType, int distinctPartitions, int statementsPerPartition)
{
BatchStatement batch = new BatchStatement(batchStatementType);
diff --git a/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java b/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java
index e14861ed3a..c41ded37db 100644
--- a/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java
@@ -20,6 +20,7 @@ package org.apache.cassandra.metrics;
import java.io.IOException;
+import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -28,9 +29,8 @@ import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.exceptions.InvalidQueryException;
-import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.ServerTestUtils;
import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.schema.Schema;
import org.apache.cassandra.cql3.QueryProcessor;
import org.apache.cassandra.exceptions.ConfigurationException;
import org.apache.cassandra.service.EmbeddedCassandraService;
@@ -39,18 +39,16 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-public class CQLMetricsTest extends SchemaLoader
+public class CQLMetricsTest
{
private static Cluster cluster;
private static Session session;
+ private static EmbeddedCassandraService cassandra;
@BeforeClass()
public static void setup() throws ConfigurationException, IOException
{
- Schema.instance.clear();
-
- EmbeddedCassandraService cassandra = new EmbeddedCassandraService();
- cassandra.start();
+ cassandra = ServerTestUtils.startEmbeddedCassandraService();
cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
session = cluster.connect();
@@ -59,6 +57,15 @@ public class CQLMetricsTest extends SchemaLoader
session.execute("CREATE TABLE IF NOT EXISTS junit.metricstest (id int PRIMARY KEY, val text);");
}
+ @AfterClass
+ public static void tearDown()
+ {
+ if (cluster != null)
+ cluster.close();
+ if (cassandra != null)
+ cassandra.stop();
+ }
+
@Test
public void testConnectionWithUseDisabled()
{
diff --git a/test/unit/org/apache/cassandra/metrics/ClientRequestMetricsTest.java b/test/unit/org/apache/cassandra/metrics/ClientRequestMetricsTest.java
index 2982bebec1..650bd95637 100644
--- a/test/unit/org/apache/cassandra/metrics/ClientRequestMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/ClientRequestMetricsTest.java
@@ -29,16 +29,15 @@ import com.datastax.driver.core.BoundStatement;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Session;
-import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.ServerTestUtils;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.schema.Schema;
import org.apache.cassandra.service.EmbeddedCassandraService;
-import static com.datastax.driver.core.Cluster.*;
+import static com.datastax.driver.core.Cluster.builder;
import static org.junit.Assert.assertEquals;
-public class ClientRequestMetricsTest extends SchemaLoader
+public class ClientRequestMetricsTest
{
private static Cluster cluster;
private static Session session;
@@ -54,13 +53,12 @@ public class ClientRequestMetricsTest extends SchemaLoader
private static final ClientRequestMetrics readMetrics = ClientRequestsMetricsHolder.readMetrics;
private static final ClientWriteRequestMetrics writeMetrics = ClientRequestsMetricsHolder.writeMetrics;
+ private static EmbeddedCassandraService cassandra;
+
@BeforeClass
public static void setup() throws ConfigurationException, IOException
{
- Schema.instance.clear();
-
- EmbeddedCassandraService cassandra = new EmbeddedCassandraService();
- cassandra.start();
+ cassandra = ServerTestUtils.startEmbeddedCassandraService();
cluster = builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
session = cluster.connect();
@@ -74,11 +72,14 @@ public class ClientRequestMetricsTest extends SchemaLoader
readPS = session.prepare("SELECT * FROM " + KEYSPACE + '.' + TABLE + " WHERE id=?;");
readRangePS = session.prepare("SELECT * FROM " + KEYSPACE + '.' + TABLE + " WHERE id=? AND ord>=? AND ord <= ?;");
}
-
+
@AfterClass
- public static void teardown()
+ public static void tearDown()
{
- cluster.close();
+ if (cluster != null)
+ cluster.close();
+ if (cassandra != null)
+ cassandra.stop();
}
@Test
diff --git a/test/unit/org/apache/cassandra/metrics/KeyspaceMetricsTest.java b/test/unit/org/apache/cassandra/metrics/KeyspaceMetricsTest.java
index e941a84b39..7c00da5819 100644
--- a/test/unit/org/apache/cassandra/metrics/KeyspaceMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/KeyspaceMetricsTest.java
@@ -18,40 +18,37 @@
package org.apache.cassandra.metrics;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
import java.io.IOException;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import org.apache.cassandra.SchemaLoader;
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.schema.Schema;
-import org.apache.cassandra.service.EmbeddedCassandraService;
-
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Session;
+import org.apache.cassandra.ServerTestUtils;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.service.EmbeddedCassandraService;
-public class KeyspaceMetricsTest extends SchemaLoader
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class KeyspaceMetricsTest
{
private static Session session;
+ private static Cluster cluster;
+ private static EmbeddedCassandraService cassandra;
@BeforeClass
public static void setup() throws ConfigurationException, IOException
{
- Schema.instance.clear();
-
- EmbeddedCassandraService cassandra = new EmbeddedCassandraService();
- cassandra.start();
+ cassandra = ServerTestUtils.startEmbeddedCassandraService();
- Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
+ cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
session = cluster.connect();
}
@@ -73,10 +70,13 @@ public class KeyspaceMetricsTest extends SchemaLoader
// no metrics after drop
assertEquals(metrics.get().collect(Collectors.joining(",")), 0, metrics.get().count());
}
-
+
@AfterClass
- public static void teardown()
+ public static void tearDown()
{
- session.close();
+ if (cluster != null)
+ cluster.close();
+ if (cassandra != null)
+ cassandra.stop();
}
}
diff --git a/test/unit/org/apache/cassandra/metrics/TableMetricsTest.java b/test/unit/org/apache/cassandra/metrics/TableMetricsTest.java
index 1e8175eb34..4c9de77207 100644
--- a/test/unit/org/apache/cassandra/metrics/TableMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/TableMetricsTest.java
@@ -31,17 +31,16 @@ import com.datastax.driver.core.BatchStatement;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Session;
-import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.ServerTestUtils;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.db.ColumnFamilyStore;
import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.schema.Schema;
import org.apache.cassandra.service.EmbeddedCassandraService;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-public class TableMetricsTest extends SchemaLoader
+public class TableMetricsTest
{
private static Session session;
@@ -49,15 +48,15 @@ public class TableMetricsTest extends SchemaLoader
private static final String TABLE = "tablemetricstest";
private static final String COUNTER_TABLE = "tablemetricscountertest";
+ private static EmbeddedCassandraService cassandra;
+ private static Cluster cluster;
+
@BeforeClass
public static void setup() throws ConfigurationException, IOException
{
- Schema.instance.clear();
-
- EmbeddedCassandraService cassandra = new EmbeddedCassandraService();
- cassandra.start();
+ cassandra = ServerTestUtils.startEmbeddedCassandraService();
- Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
+ cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
session = cluster.connect();
session.execute(String.format("CREATE KEYSPACE IF NOT EXISTS %s WITH replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };", KEYSPACE));
@@ -276,9 +275,13 @@ public class TableMetricsTest extends SchemaLoader
assertEquals(metrics.get().collect(Collectors.joining(",")), 0, metrics.get().count());
}
+
@AfterClass
- public static void teardown()
+ public static void tearDown()
{
- session.close();
+ if (cluster != null)
+ cluster.close();
+ if (cassandra != null)
+ cassandra.stop();
}
}
diff --git a/test/unit/org/apache/cassandra/schema/SchemaTest.java b/test/unit/org/apache/cassandra/schema/SchemaTest.java
index eb2cf044c3..4185536e68 100644
--- a/test/unit/org/apache/cassandra/schema/SchemaTest.java
+++ b/test/unit/org/apache/cassandra/schema/SchemaTest.java
@@ -25,37 +25,33 @@ import java.util.Collection;
import org.junit.BeforeClass;
import org.junit.Test;
-import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.ServerTestUtils;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.db.Keyspace;
import org.apache.cassandra.db.Mutation;
-import org.apache.cassandra.db.commitlog.CommitLog;
import org.apache.cassandra.gms.Gossiper;
import org.apache.cassandra.utils.FBUtilities;
-import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
public class SchemaTest
{
@BeforeClass
- public static void setupDatabaseDescriptor()
+ public static void setup()
{
DatabaseDescriptor.daemonInitialization();
+ ServerTestUtils.prepareServer();
+ Schema.instance.loadFromDisk();
}
@Test
public void testTransKsMigration() throws IOException
{
- CommitLog.instance.start();
- SchemaLoader.cleanupAndLeaveDirs();
- Schema.instance.loadFromDisk();
assertEquals(0, Schema.instance.getNonSystemKeyspaces().size());
Gossiper.instance.start((int) (System.currentTimeMillis() / 1000));
- Keyspace.setInitialized();
-
try
{
// add a few.
@@ -82,6 +78,33 @@ public class SchemaTest
}
}
+ @Test
+ public void testKeyspaceCreationWhenNotInitialized() {
+ Keyspace.unsetInitialized();
+ try
+ {
+ SchemaTestUtil.addOrUpdateKeyspace(KeyspaceMetadata.create("test", KeyspaceParams.simple(1)), true);
+ assertNotNull(Schema.instance.getKeyspaceMetadata("test"));
+ assertNull(Schema.instance.getKeyspaceInstance("test"));
+
+ SchemaTestUtil.dropKeyspaceIfExist("test", true);
+ assertNull(Schema.instance.getKeyspaceMetadata("test"));
+ assertNull(Schema.instance.getKeyspaceInstance("test"));
+ }
+ finally
+ {
+ Keyspace.setInitialized();
+ }
+
+ SchemaTestUtil.addOrUpdateKeyspace(KeyspaceMetadata.create("test", KeyspaceParams.simple(1)), true);
+ assertNotNull(Schema.instance.getKeyspaceMetadata("test"));
+ assertNotNull(Schema.instance.getKeyspaceInstance("test"));
+
+ SchemaTestUtil.dropKeyspaceIfExist("test", true);
+ assertNull(Schema.instance.getKeyspaceMetadata("test"));
+ assertNull(Schema.instance.getKeyspaceInstance("test"));
+ }
+
private void saveKeyspaces()
{
Collection<Mutation> mutations = Arrays.asList(SchemaKeyspace.makeCreateKeyspaceMutation(KeyspaceMetadata.create("ks0", KeyspaceParams.simple(3)), FBUtilities.timestampMicros()).build(),
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/ClientStatsTest.java b/test/unit/org/apache/cassandra/tools/nodetool/ClientStatsTest.java
index c8a1ae9d13..5975f66b03 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/ClientStatsTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/ClientStatsTest.java
@@ -18,95 +18,124 @@
package org.apache.cassandra.tools.nodetool;
+import java.net.InetAddress;
+
+import org.junit.After;
+import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
-
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.read.ListAppender;
-
+import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Session;
+import org.apache.cassandra.ServerTestUtils;
+import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.cql3.CQLTester;
-import org.apache.cassandra.service.CassandraDaemon;
+import org.apache.cassandra.service.EmbeddedCassandraService;
import org.apache.cassandra.service.StorageService;
import org.apache.cassandra.tools.ToolRunner;
-import static org.assertj.core.api.Assertions.assertThat;
import org.assertj.core.groups.Tuple;
-public class ClientStatsTest extends CQLTester
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ClientStatsTest
{
+ private static Cluster cluster;
+ private Session session;
+
+ private static EmbeddedCassandraService cassandra;
+
@BeforeClass
public static void setup() throws Throwable
{
- CassandraDaemon daemon = new CassandraDaemon();
- requireNetwork();
- startJMXServer();
- daemon.activate();
- daemon.startNativeTransport();
- StorageService.instance.registerDaemon(daemon);
+ // Since we run EmbeddedCassandraServer, we need to manually associate JMX address; otherwise it won't start
+ int jmxPort = CQLTester.getAutomaticallyAllocatedPort(InetAddress.getLoopbackAddress());
+ System.setProperty("cassandra.jmx.local.port", String.valueOf(jmxPort));
+
+ cassandra = ServerTestUtils.startEmbeddedCassandraService();
+ cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
}
@Before
public void config() throws Throwable
{
- ResultSet result = executeNet("select release_version from system.local");
+ session = cluster.connect();
+ ResultSet result = session.execute("select release_version from system.local");
}
-
+
+ @After
+ public void afterTest()
+ {
+ if (session != null)
+ session.close();
+ }
+
+ @AfterClass
+ public static void tearDown()
+ {
+ if (cluster != null)
+ cluster.close();
+ if (cassandra != null)
+ cassandra.stop();
+ }
+
@Test
public void testClientStatsHelp()
{
ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "clientstats");
tool.assertOnCleanExit();
-
- String help = "NAME\n" +
- " nodetool clientstats - Print information about connected clients\n" +
- "\n" +
- "SYNOPSIS\n" +
- " nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
- " [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
- " [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
- " [(-u <username> | --username <username>)] clientstats [--all]\n" +
+
+ String help = "NAME\n" +
+ " nodetool clientstats - Print information about connected clients\n" +
+ "\n" +
+ "SYNOPSIS\n" +
+ " nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+ " [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+ " [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+ " [(-u <username> | --username <username>)] clientstats [--all]\n" +
" [--by-protocol] [--clear-history] [--client-options]\n" +
- "\n" +
- "OPTIONS\n" +
- " --all\n" +
- " Lists all connections\n" +
- "\n" +
- " --by-protocol\n" +
- " Lists most recent client connections by protocol version\n" +
- "\n" +
- " --clear-history\n" +
- " Clear the history of connected clients\n" +
+ "\n" +
+ "OPTIONS\n" +
+ " --all\n" +
+ " Lists all connections\n" +
+ "\n" +
+ " --by-protocol\n" +
+ " Lists most recent client connections by protocol version\n" +
+ "\n" +
+ " --clear-history\n" +
+ " Clear the history of connected clients\n" +
"\n" +
" --client-options\n" +
" Lists all connections and the client options\n" +
- "\n" +
- " -h <host>, --host <host>\n" +
- " Node hostname or ip address\n" +
- "\n" +
- " -p <port>, --port <port>\n" +
- " Remote jmx agent port number\n" +
- "\n" +
- " -pp, --print-port\n" +
- " Operate in 4.0 mode with hosts disambiguated by port number\n" +
- "\n" +
- " -pw <password>, --password <password>\n" +
- " Remote jmx agent password\n" +
- "\n" +
- " -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
- " Path to the JMX password file\n" +
- "\n" +
- " -u <username>, --username <username>\n" +
- " Remote jmx agent username\n" +
- "\n" +
- "\n";
+ "\n" +
+ " -h <host>, --host <host>\n" +
+ " Node hostname or ip address\n" +
+ "\n" +
+ " -p <port>, --port <port>\n" +
+ " Remote jmx agent port number\n" +
+ "\n" +
+ " -pp, --print-port\n" +
+ " Operate in 4.0 mode with hosts disambiguated by port number\n" +
+ "\n" +
+ " -pw <password>, --password <password>\n" +
+ " Remote jmx agent password\n" +
+ "\n" +
+ " -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+ " Path to the JMX password file\n" +
+ "\n" +
+ " -u <username>, --username <username>\n" +
+ " Remote jmx agent username\n" +
+ "\n" +
+ "\n";
assertThat(tool.getStdout()).isEqualTo(help);
}
-
+
@Test
public void testClientStats()
{
@@ -117,7 +146,7 @@ public class ClientStatsTest extends CQLTester
assertThat(stdout).contains("User Connections");
assertThat(stdout).contains("anonymous 2");
}
-
+
@Test
public void testClientStatsByProtocol()
{
@@ -128,7 +157,7 @@ public class ClientStatsTest extends CQLTester
assertThat(stdout).contains("Protocol-Version IP-Address Last-Seen");
assertThat(stdout).containsPattern("[0-9]/v[0-9] +/127.0.0.1 [a-zA-Z]{3} [0-9]+, [0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}");
}
-
+
@Test
public void testClientStatsAll()
{
@@ -157,7 +186,7 @@ public class ClientStatsTest extends CQLTester
assertThat(stdout).contains("User Connections");
assertThat(stdout).contains("anonymous 2");
}
-
+
@Test
public void testClientStatsClearHistory()
{
@@ -166,13 +195,13 @@ public class ClientStatsTest extends CQLTester
ssLogger.addAppender(listAppender);
listAppender.start();
-
+
ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("clientstats", "--clear-history");
tool.assertOnCleanExit();
String stdout = tool.getStdout();
assertThat(stdout).contains("Clearing connection history");
assertThat(listAppender.list)
- .extracting(ILoggingEvent::getMessage, ILoggingEvent::getLevel)
- .contains(Tuple.tuple("Cleared connection history", Level.INFO));
+ .extracting(ILoggingEvent::getMessage, ILoggingEvent::getLevel)
+ .contains(Tuple.tuple("Cleared connection history", Level.INFO));
}
}
diff --git a/test/unit/org/apache/cassandra/transport/CQLUserAuditTest.java b/test/unit/org/apache/cassandra/transport/CQLUserAuditTest.java
index 1c4e41d774..120de2a336 100644
--- a/test/unit/org/apache/cassandra/transport/CQLUserAuditTest.java
+++ b/test/unit/org/apache/cassandra/transport/CQLUserAuditTest.java
@@ -38,13 +38,13 @@ import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.exceptions.AuthenticationException;
+import org.apache.cassandra.ServerTestUtils;
import org.apache.cassandra.audit.AuditEvent;
import org.apache.cassandra.audit.AuditLogEntryType;
import org.apache.cassandra.audit.AuditLogManager;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.config.OverrideConfigurationLoader;
import org.apache.cassandra.config.ParameterizedClass;
-import org.apache.cassandra.cql3.CQLTester;
import org.apache.cassandra.diag.DiagnosticEventService;
import org.apache.cassandra.locator.InetAddressAndPort;
import org.apache.cassandra.service.EmbeddedCassandraService;
@@ -69,11 +69,10 @@ public class CQLUserAuditTest
config.audit_logging_options.enabled = true;
config.audit_logging_options.logger = new ParameterizedClass("DiagnosticEventAuditLogger", null);
});
- CQLTester.prepareServer();
System.setProperty("cassandra.superuser_setup_delay_ms", "0");
- embedded = new EmbeddedCassandraService();
- embedded.start();
+
+ embedded = ServerTestUtils.startEmbeddedCassandraService();
executeAs(Arrays.asList("CREATE ROLE testuser WITH LOGIN = true AND SUPERUSER = false AND PASSWORD = 'foo'",
"CREATE ROLE testuser_nologin WITH LOGIN = false AND SUPERUSER = false AND PASSWORD = 'foo'",
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org
[cassandra] 01/02: Merge branch 'cassandra-4.1' into trunk
Posted by jl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jlewandowski pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit ab3b59ec42666d6fd3f92a26283e65b3d7f3aa4f
Merge: 5279d7f57e c1d89c32d2
Author: Jacek Lewandowski <le...@gmail.com>
AuthorDate: Fri Aug 12 13:33:45 2022 +0200
Merge branch 'cassandra-4.1' into trunk
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org