This is an automated email from the ASF dual-hosted git repository.
samt pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push:
new 880fa6587b Include column drop timestamp in ALTER TABLE transformation
880fa6587b is described below
commit 880fa6587b54db5b5d6cd64f5d935fd15da9a904
Author: Sam Tunnicliffe <[email protected]>
AuthorDate: Fri Oct 27 13:03:56 2023 +0100
Include column drop timestamp in ALTER TABLE transformation
Patch by Sam Tunnicliffe and Marcus Eriksson; reviewed by Sam
Tunnicliffe and Marcus Eriksson for CASSANDRA-18961
Co-authored-by: Marcus Eriksson <[email protected]>
Co-authored-by: Sam Tunnicliffe <[email protected]>
---
CHANGES.txt | 1 +
.../statements/schema/AlterSchemaStatement.java | 17 +++-
.../statements/schema/AlterTableStatement.java | 9 +-
.../cassandra/io/sstable/CQLSSTableWriter.java | 2 +-
src/java/org/apache/cassandra/schema/Schema.java | 2 +-
.../cassandra/tcm/membership/NodeVersion.java | 2 +-
.../cassandra/tcm/serialization/Version.java | 4 +
.../cassandra/tcm/transformations/AlterSchema.java | 35 +++++---
.../cassandra/distributed/test/DropColumnTest.java | 98 ++++++++++++++++++++++
.../distributed/test/log/CMSTestBase.java | 11 +--
.../test/log/ClusterMetadataTestHelper.java | 7 +-
.../SchemaChangeDuringRangeMovementTest.java | 4 +-
.../org/apache/cassandra/schema/SchemaTest.java | 6 +-
13 files changed, 163 insertions(+), 35 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index 75dd48aa02..49eb15619f 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
5.1
+ * Include column drop timestamp in alter table transformation
(CASSANDRA-18961)
* Make JMX SSL configurable in cassandra.yaml (CASSANDRA-18508)
* Fix cqlsh CAPTURE command to save query results without trace details when
TRACING is ON (CASSANDRA-19105)
* Optionally prevent tombstone purging during repair (CASSANDRA-20071)
diff --git
a/src/java/org/apache/cassandra/cql3/statements/schema/AlterSchemaStatement.java
b/src/java/org/apache/cassandra/cql3/statements/schema/AlterSchemaStatement.java
index a3be1d0e06..590a55a3f9 100644
---
a/src/java/org/apache/cassandra/cql3/statements/schema/AlterSchemaStatement.java
+++
b/src/java/org/apache/cassandra/cql3/statements/schema/AlterSchemaStatement.java
@@ -17,6 +17,7 @@
*/
package org.apache.cassandra.cql3.statements.schema;
+import java.util.Optional;
import java.util.Set;
import com.google.common.collect.ImmutableSet;
@@ -46,6 +47,8 @@ abstract public class AlterSchemaStatement implements
CQLStatement.SingleKeyspac
// TODO: not sure if this is going to stay the same, or will be replaced
by more efficient serialization/sanitation means
// or just `toString` for every statement
private String cql;
+ public static final long NO_EXECUTION_TIMESTAMP = -1;
+ private long executionTimestamp = NO_EXECUTION_TIMESTAMP;
protected AlterSchemaStatement(String keyspaceName)
{
@@ -57,6 +60,11 @@ abstract public class AlterSchemaStatement implements
CQLStatement.SingleKeyspac
this.cql = cql;
}
+ public void setExecutionTimestamp(long executionTimestamp)
+ {
+ this.executionTimestamp = executionTimestamp;
+ }
+
@Override
public String cql()
{
@@ -103,6 +111,12 @@ abstract public class AlterSchemaStatement implements
CQLStatement.SingleKeyspac
return keyspaceName;
}
+ @Override
+ public Optional<Long> fixedTimestampMicros()
+ {
+ return executionTimestamp == NO_EXECUTION_TIMESTAMP ? Optional.empty()
: Optional.of(executionTimestamp);
+ }
+
public ResultMessage executeLocally(QueryState state, QueryOptions options)
{
return execute(state);
@@ -147,6 +161,7 @@ abstract public class AlterSchemaStatement implements
CQLStatement.SingleKeyspac
throw ire("Virtual keyspace '%s' is not user-modifiable",
keyspaceName);
validateKeyspaceName();
+ setExecutionTimestamp(state.getTimestamp());
// Perform a 'dry-run' attempt to apply the transformation locally
before submitting to the CMS. This can save a
// round trip to the CMS for things syntax errors, but also fail fast
for things like configuration errors.
// Such failures may be dependent on the specific node's config (for
things like guardrails/memtable
@@ -158,7 +173,6 @@ abstract public class AlterSchemaStatement implements
CQLStatement.SingleKeyspac
// cluster, as config can be heterogenous falling back to safe
defaults may occur on some nodes.
ClusterMetadata metadata = ClusterMetadata.current();
apply(metadata);
-
ClusterMetadata result = Schema.instance.submit(this);
KeyspacesDiff diff = Keyspaces.diff(metadata.schema.getKeyspaces(),
result.schema.getKeyspaces());
@@ -225,6 +239,7 @@ abstract public class AlterSchemaStatement implements
CQLStatement.SingleKeyspac
return "AlterSchemaStatement{" +
"keyspaceName='" + keyspaceName + '\'' +
", cql='" + cql() + '\'' +
+ ", executionTimestamp="+executionTimestamp +
'}';
}
}
diff --git
a/src/java/org/apache/cassandra/cql3/statements/schema/AlterTableStatement.java
b/src/java/org/apache/cassandra/cql3/statements/schema/AlterTableStatement.java
index 3a5b9ae8fb..4302919ca9 100644
---
a/src/java/org/apache/cassandra/cql3/statements/schema/AlterTableStatement.java
+++
b/src/java/org/apache/cassandra/cql3/statements/schema/AlterTableStatement.java
@@ -474,7 +474,14 @@ public abstract class AlterTableStatement extends
AlterSchemaStatement
*/
private long getTimestamp()
{
- return timestamp == null ? ClientState.getTimestamp() : timestamp;
+ // Prior to Metadata serialization V5, the execution timestamp was
not included in AlterSchema
+ // serializations. Instead, the current time (from
ClientState::getTimestamp) was used, making
+ // DROP COLUMN non-idempotent and causing potenial data loss as
described in CASSANDRA-18961.
+ // This was fixed before release by serialization V5, but we
include a dangerous backwards
+ // compatibility option here or so that we can still apply pre-V5
serialized transformations
+ // (which would only exist in clusters running pre-release
versions of Cassandra). Once all peers
+ // are running a V5 compatible version, ClientState::getTimestamp
will never be used.
+ return timestamp == null ?
fixedTimestampMicros().orElseGet(ClientState::getTimestamp) : timestamp;
}
}
diff --git a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
index 8bb882071e..dbe91cee10 100644
--- a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
@@ -801,7 +801,7 @@ public class CQLSSTableWriter implements Closeable
private void commitKeyspaceMetadata(KeyspaceMetadata keyspaceMetadata)
{
SchemaTransformation schemaTransformation = metadata ->
metadata.schema.getKeyspaces().withAddedOrUpdated(keyspaceMetadata);
- ClusterMetadataService.instance().commit(new
AlterSchema(schemaTransformation, Schema.instance));
+ ClusterMetadataService.instance().commit(new
AlterSchema(schemaTransformation));
}
/**
diff --git a/src/java/org/apache/cassandra/schema/Schema.java
b/src/java/org/apache/cassandra/schema/Schema.java
index 147d24a804..afb987a7a0 100644
--- a/src/java/org/apache/cassandra/schema/Schema.java
+++ b/src/java/org/apache/cassandra/schema/Schema.java
@@ -289,7 +289,7 @@ public final class Schema implements SchemaProvider
// result of this execution can be either a complete failure/timeout,
or a success, but together with a log of
// operations that have to be applied before we can do anything
return ClusterMetadataService.instance()
- .commit(new AlterSchema(transformation,
this),
+ .commit(new AlterSchema(transformation),
(metadata) -> metadata,
(code, reason) -> {
switch (code)
diff --git a/src/java/org/apache/cassandra/tcm/membership/NodeVersion.java
b/src/java/org/apache/cassandra/tcm/membership/NodeVersion.java
index 9ce9f46021..88d5296352 100644
--- a/src/java/org/apache/cassandra/tcm/membership/NodeVersion.java
+++ b/src/java/org/apache/cassandra/tcm/membership/NodeVersion.java
@@ -34,7 +34,7 @@ import static
org.apache.cassandra.db.TypeSizes.sizeofUnsignedVInt;
public class NodeVersion implements Comparable<NodeVersion>
{
public static final Serializer serializer = new Serializer();
- public static final Version CURRENT_METADATA_VERSION = Version.V4;
+ public static final Version CURRENT_METADATA_VERSION = Version.V5;
public static final NodeVersion CURRENT = new NodeVersion(new
CassandraVersion(FBUtilities.getReleaseVersionString()),
CURRENT_METADATA_VERSION);
private static final CassandraVersion SINCE_VERSION =
CassandraVersion.CASSANDRA_5_0;
diff --git a/src/java/org/apache/cassandra/tcm/serialization/Version.java
b/src/java/org/apache/cassandra/tcm/serialization/Version.java
index 7c6177dcf6..ed601009f6 100644
--- a/src/java/org/apache/cassandra/tcm/serialization/Version.java
+++ b/src/java/org/apache/cassandra/tcm/serialization/Version.java
@@ -46,6 +46,10 @@ public enum Version
* - Serialize allowAutoSnapshot and incrementalBackups when serializing
TableParams
*/
V4(4),
+ /**
+ * - AlterSchema includes execution timestamp
+ */
+ V5(5),
UNKNOWN(Integer.MAX_VALUE);
diff --git a/src/java/org/apache/cassandra/tcm/transformations/AlterSchema.java
b/src/java/org/apache/cassandra/tcm/transformations/AlterSchema.java
index 3751934224..93692f55ba 100644
--- a/src/java/org/apache/cassandra/tcm/transformations/AlterSchema.java
+++ b/src/java/org/apache/cassandra/tcm/transformations/AlterSchema.java
@@ -28,6 +28,8 @@ import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.cql3.statements.schema.AlterSchemaStatement;
import org.apache.cassandra.exceptions.AlreadyExistsException;
import org.apache.cassandra.exceptions.ConfigurationException;
import org.apache.cassandra.exceptions.InvalidRequestException;
@@ -38,8 +40,6 @@ import org.apache.cassandra.schema.DistributedSchema;
import org.apache.cassandra.schema.KeyspaceMetadata;
import org.apache.cassandra.schema.Keyspaces;
import org.apache.cassandra.schema.ReplicationParams;
-import org.apache.cassandra.schema.Schema;
-import org.apache.cassandra.schema.SchemaProvider;
import org.apache.cassandra.schema.SchemaTransformation;
import org.apache.cassandra.schema.TableMetadata;
import org.apache.cassandra.schema.Tables;
@@ -53,7 +53,9 @@ import org.apache.cassandra.tcm.sequences.LockedRanges;
import org.apache.cassandra.tcm.serialization.AsymmetricMetadataSerializer;
import org.apache.cassandra.tcm.serialization.Version;
import org.apache.cassandra.utils.JVMStabilityInspector;
+import org.apache.cassandra.utils.vint.VIntCoding;
+import static
org.apache.cassandra.cql3.statements.schema.AlterSchemaStatement.NO_EXECUTION_TIMESTAMP;
import static org.apache.cassandra.exceptions.ExceptionCode.ALREADY_EXISTS;
import static org.apache.cassandra.exceptions.ExceptionCode.CONFIG_ERROR;
import static org.apache.cassandra.exceptions.ExceptionCode.INVALID;
@@ -65,14 +67,11 @@ public class AlterSchema implements Transformation
private static final Logger logger =
LoggerFactory.getLogger(AlterSchema.class);
public static final Serializer serializer = new Serializer();
- public final SchemaTransformation schemaTransformation;
- protected final SchemaProvider schemaProvider;
+ private final SchemaTransformation schemaTransformation;
- public AlterSchema(SchemaTransformation schemaTransformation,
- SchemaProvider schemaProvider)
+ public AlterSchema(SchemaTransformation schemaTransformation)
{
this.schemaTransformation = schemaTransformation;
- this.schemaProvider = schemaProvider;
}
@Override
@@ -95,7 +94,6 @@ public class AlterSchema implements Transformation
// log. In this case, there is a connected client and associated
ClientState, so to avoid duplicate warnings
// pause capture and resume after in applying the schema change.
schemaTransformation.enterExecution();
-
// Guard against an invalid SchemaTransformation supplying a
TableMetadata with a future epoch
newKeyspaces = schemaTransformation.apply(prev);
newKeyspaces.forEach(ksm -> {
@@ -253,20 +251,33 @@ public class AlterSchema implements Transformation
public void serialize(Transformation t, DataOutputPlus out, Version
version) throws IOException
{
SchemaTransformation.serializer.serialize(((AlterSchema)
t).schemaTransformation, out, version);
+ if (version.isAtLeast(Version.V5))
+ {
+ long fixedTimestamp =
((AlterSchema)t).schemaTransformation.fixedTimestampMicros().orElse(NO_EXECUTION_TIMESTAMP);
+ out.writeVInt(fixedTimestamp);
+ }
}
@Override
public AlterSchema deserialize(DataInputPlus in, Version version)
throws IOException
{
- return new
AlterSchema(SchemaTransformation.serializer.deserialize(in, version),
- Schema.instance);
-
+ SchemaTransformation transformation =
SchemaTransformation.serializer.deserialize(in, version);
+ if (version.isAtLeast(Version.V5))
+ {
+ long timestamp = in.readVInt();
+ if (transformation instanceof AlterSchemaStatement)
+ ((AlterSchemaStatement)
transformation).setExecutionTimestamp(timestamp);
+ }
+ return new AlterSchema(transformation);
}
@Override
public long serializedSize(Transformation t, Version version)
{
- return
SchemaTransformation.serializer.serializedSize(((AlterSchema)
t).schemaTransformation, version);
+ long size =
SchemaTransformation.serializer.serializedSize(((AlterSchema)
t).schemaTransformation, version);
+ if (version.isAtLeast(Version.V5))
+ size +=
VIntCoding.computeVIntSize(((AlterSchema)t).schemaTransformation.fixedTimestampMicros().orElse(NO_EXECUTION_TIMESTAMP));
+ return size;
}
}
diff --git
a/test/distributed/org/apache/cassandra/distributed/test/DropColumnTest.java
b/test/distributed/org/apache/cassandra/distributed/test/DropColumnTest.java
new file mode 100644
index 0000000000..e3b85a8c86
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/DropColumnTest.java
@@ -0,0 +1,98 @@
+/*
+ * 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.cassandra.distributed.test;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+
+import com.google.common.util.concurrent.Uninterruptibles;
+import org.junit.Test;
+
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.schema.DroppedColumn;
+
+import static org.junit.Assert.assertEquals;
+
+public class DropColumnTest extends TestBaseImpl
+{
+ @Test
+ public void dropTest() throws IOException, ExecutionException,
InterruptedException
+ {
+ try (Cluster cluster = init(Cluster.build(2).start()))
+ {
+ cluster.schemaChange(withKeyspace("create table %s.tbl (id int
primary key, a int, b int, c int)"));
+ cluster.filters().allVerbs().messagesMatching((i, i1, iMessage) ->
{
+ Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
+ return false;
+ }).drop();
+ cluster.schemaChange(withKeyspace("alter table %s.tbl drop b"));
+ cluster.filters().reset();
+
+ long dropTimeNode1 = getDropTime(cluster.get(1));
+ long dropTimeNode2 = getDropTime(cluster.get(2));
+
+ assertEquals(dropTimeNode1, dropTimeNode2);
+
+ cluster.get(2).shutdown().get();
+ cluster.get(2).startup();
+
+ assertEquals(dropTimeNode1, getDropTime(cluster.get(2)));
+ }
+ }
+
+ @Test
+ public void dropUsingTimestampTest() throws IOException,
ExecutionException, InterruptedException
+ {
+ try (Cluster cluster = init(Cluster.build(2).start()))
+ {
+ cluster.schemaChange(withKeyspace("create table %s.tbl (id int
primary key, a int, b int, c int)"));
+ cluster.filters().allVerbs().messagesMatching((i, i1, iMessage) ->
{
+ Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
+ return false;
+ }).drop();
+ cluster.schemaChange(withKeyspace("alter table %s.tbl drop b using
timestamp 99999"));
+ cluster.filters().reset();
+
+ long dropTimeNode1 = getDropTime(cluster.get(1));
+ long dropTimeNode2 = getDropTime(cluster.get(2));
+
+ assertEquals(dropTimeNode1, dropTimeNode2);
+ assertEquals(99999, dropTimeNode1);
+
+ cluster.get(2).shutdown().get();
+ cluster.get(2).startup();
+
+ assertEquals(dropTimeNode1, getDropTime(cluster.get(2)));
+ }
+ }
+
+ private long getDropTime(IInvokableInstance instance)
+ {
+ return instance.callOnInstance(() -> {
+ Map<ByteBuffer, DroppedColumn> droppedColumns =
Keyspace.open(KEYSPACE).getColumnFamilyStore("tbl").metadata().droppedColumns;
+ assertEquals(1, droppedColumns.size());
+ return droppedColumns.values().iterator().next().droppedTime;
+ });
+ }
+}
diff --git
a/test/distributed/org/apache/cassandra/distributed/test/log/CMSTestBase.java
b/test/distributed/org/apache/cassandra/distributed/test/log/CMSTestBase.java
index e254798915..ffc7f96bba 100644
---
a/test/distributed/org/apache/cassandra/distributed/test/log/CMSTestBase.java
+++
b/test/distributed/org/apache/cassandra/distributed/test/log/CMSTestBase.java
@@ -33,7 +33,6 @@ import org.apache.cassandra.locator.ReplicaCollection;
import org.apache.cassandra.schema.DistributedSchema;
import org.apache.cassandra.schema.KeyspaceMetadata;
import org.apache.cassandra.schema.Keyspaces;
-import org.apache.cassandra.schema.SchemaProvider;
import org.apache.cassandra.tcm.ClusterMetadata;
import org.apache.cassandra.tcm.ClusterMetadataService;
import org.apache.cassandra.tcm.Commit;
@@ -45,7 +44,6 @@ import
org.apache.cassandra.tcm.ownership.UniformRangePlacement;
import org.apache.cassandra.tcm.transformations.AlterSchema;
import org.apache.cassandra.tcm.transformations.cms.Initialize;
import org.apache.cassandra.utils.FBUtilities;
-import org.mockito.Mockito;
public class CMSTestBase
{
@@ -87,19 +85,12 @@ public class CMSTestBase
public final Murmur3Partitioner partitioner;
public final LocalLog log;
public final ClusterMetadataService service;
- public final SchemaProvider schemaProvider;
public final TokenPlacementModel.ReplicationFactor rf;
public CMSSut(IIsolatedExecutor.SerializableFunction<LocalLog,
Processor> processorFactory, boolean addListeners,
TokenPlacementModel.ReplicationFactor rf)
- {
- this(processorFactory, addListeners,
Mockito.mock(SchemaProvider.class), rf);
- }
-
- public CMSSut(IIsolatedExecutor.SerializableFunction<LocalLog,
Processor> processorFactory, boolean addListeners, SchemaProvider
schemaProvider, TokenPlacementModel.ReplicationFactor rf)
{
partitioner = Murmur3Partitioner.instance;
this.rf = rf;
- this.schemaProvider = schemaProvider;
ClusterMetadata initial = new ClusterMetadata(partitioner);
log = LocalLog.logSpec()
.sync()
@@ -129,7 +120,7 @@ public class CMSTestBase
});
service.commit(new AlterSchema((cm) -> {
return
cm.schema.getKeyspaces().with(Keyspaces.of(KeyspaceMetadata.create("test",
rf.asKeyspaceParams())));
- }, schemaProvider));
+ }));
}
public void close()
diff --git
a/test/distributed/org/apache/cassandra/distributed/test/log/ClusterMetadataTestHelper.java
b/test/distributed/org/apache/cassandra/distributed/test/log/ClusterMetadataTestHelper.java
index d06d79afd1..b27952d284 100644
---
a/test/distributed/org/apache/cassandra/distributed/test/log/ClusterMetadataTestHelper.java
+++
b/test/distributed/org/apache/cassandra/distributed/test/log/ClusterMetadataTestHelper.java
@@ -52,7 +52,6 @@ import org.apache.cassandra.schema.KeyspaceMetadata;
import org.apache.cassandra.schema.KeyspaceParams;
import org.apache.cassandra.schema.Keyspaces;
import org.apache.cassandra.schema.ReplicationParams;
-import org.apache.cassandra.schema.Schema;
import org.apache.cassandra.schema.SchemaTransformation;
import org.apache.cassandra.service.ClientState;
import org.apache.cassandra.tcm.AtomicLongBackedProcessor;
@@ -203,7 +202,7 @@ public class ClusterMetadataTestHelper
CreateKeyspaceStatement createKeyspaceStatement = new
CreateKeyspaceStatement(name, attributes, false);
try
{
- commit(new AlterSchema(createKeyspaceStatement, Schema.instance));
+ commit(new AlterSchema(createKeyspaceStatement));
}
catch (Throwable e)
{
@@ -216,7 +215,7 @@ public class ClusterMetadataTestHelper
CreateKeyspaceStatement createKeyspaceStatement =
(CreateKeyspaceStatement)
QueryProcessor.parseStatement(statement).prepare(ClientState.forInternalCalls());
try
{
- commit(new AlterSchema(createKeyspaceStatement, Schema.instance));
+ commit(new AlterSchema(createKeyspaceStatement));
}
catch (Throwable e)
{
@@ -839,7 +838,7 @@ public class ClusterMetadataTestHelper
try
{
SchemaTransformation transformation = (cm) ->
cm.schema.getKeyspaces().withAddedOrUpdated(keyspace);
- commit(new AlterSchema(transformation, Schema.instance));
+ commit(new AlterSchema(transformation));
}
catch (Exception e)
{
diff --git
a/test/unit/org/apache/cassandra/schema/SchemaChangeDuringRangeMovementTest.java
b/test/unit/org/apache/cassandra/schema/SchemaChangeDuringRangeMovementTest.java
index 7c7eb8fb22..e6cdb1be82 100644
---
a/test/unit/org/apache/cassandra/schema/SchemaChangeDuringRangeMovementTest.java
+++
b/test/unit/org/apache/cassandra/schema/SchemaChangeDuringRangeMovementTest.java
@@ -157,14 +157,14 @@ public class SchemaChangeDuringRangeMovementTest extends
CQLTester
"WITH REPLICATION =
{'class':'SimpleStrategy','replication_factor':9}", RF9_KS4));
SchemaTransformation dropAllowed = (metadata_) ->
metadata_.schema.getKeyspaces().without(RF9_KS4).without(RF9_KS3);
- metadata = ClusterMetadataService.instance().commit(new
AlterSchema(dropAllowed, Schema.instance));
+ metadata = ClusterMetadataService.instance().commit(new
AlterSchema(dropAllowed));
assertFalse(metadata.schema.getKeyspaces().containsKeyspace(RF9_KS4));
assertFalse(metadata.schema.getKeyspaces().containsKeyspace(RF9_KS3));
try
{
SchemaTransformation dropRejected = (metadata_) ->
metadata_.schema.getKeyspaces().without(RF9_KS2).without(RF9_KS1);
- ClusterMetadataService.instance().commit(new
AlterSchema(dropRejected, Schema.instance));
+ ClusterMetadataService.instance().commit(new
AlterSchema(dropRejected));
fail("Expected exception");
}
catch (IllegalStateException e)
diff --git a/test/unit/org/apache/cassandra/schema/SchemaTest.java
b/test/unit/org/apache/cassandra/schema/SchemaTest.java
index d8f176cccd..fcf3c6997b 100644
--- a/test/unit/org/apache/cassandra/schema/SchemaTest.java
+++ b/test/unit/org/apache/cassandra/schema/SchemaTest.java
@@ -209,7 +209,9 @@ public class SchemaTest
private static AlterSchemaStatement cql(String keyspace, String cql)
{
- return (AlterSchemaStatement)
QueryProcessor.parseStatement(String.format(cql, keyspace))
-
.prepare(ClientState.forInternalCalls());
+ AlterSchemaStatement statement = (AlterSchemaStatement)
QueryProcessor.parseStatement(String.format(cql, keyspace))
+
.prepare(ClientState.forInternalCalls());
+ statement.setExecutionTimestamp(System.currentTimeMillis() * 1000);
+ return statement;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]