Provide a JMX call to sync schema with local storage patch by Aleksey Yeschenko; reviewed by Sylvain Lebresne for CASSANDRA-13954
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/d8a18f98 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/d8a18f98 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/d8a18f98 Branch: refs/heads/cassandra-3.11 Commit: d8a18f988f08de8504a45704632eff7f9494d82b Parents: a04d627 Author: Aleksey Yeschenko <alek...@yeschenko.com> Authored: Mon Oct 16 12:45:47 2017 +0100 Committer: Aleksey Yeschenko <alek...@yeschenko.com> Committed: Mon Oct 16 19:34:44 2017 +0100 ---------------------------------------------------------------------- CHANGES.txt | 2 ++ .../org/apache/cassandra/config/Schema.java | 12 ++++++++ .../apache/cassandra/schema/SchemaKeyspace.java | 18 ++++++++++- .../cassandra/service/StorageService.java | 6 ++++ .../cassandra/service/StorageServiceMBean.java | 2 ++ .../org/apache/cassandra/tools/NodeProbe.java | 5 +++ .../org/apache/cassandra/tools/NodeTool.java | 1 + .../tools/nodetool/ReloadLocalSchema.java | 32 ++++++++++++++++++++ 8 files changed, 77 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/d8a18f98/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 6977be7..db3f502 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,7 +1,9 @@ 3.0.16 + * Provide a JMX call to sync schema with local storage (CASSANDRA-13954) * Mishandling of cells for removed/dropped columns when reading legacy files (CASSANDRA-13939) * Deserialise sstable metadata in nodetool verify (CASSANDRA-13922) + 3.0.15 * Improve TRUNCATE performance (CASSANDRA-13909) * Implement short read protection on partition boundaries (CASSANDRA-13595) http://git-wip-us.apache.org/repos/asf/cassandra/blob/d8a18f98/src/java/org/apache/cassandra/config/Schema.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/config/Schema.java b/src/java/org/apache/cassandra/config/Schema.java index ee1f137..cc24e1e 100644 --- a/src/java/org/apache/cassandra/config/Schema.java +++ b/src/java/org/apache/cassandra/config/Schema.java @@ -368,6 +368,18 @@ public class Schema return ImmutableList.copyOf(Sets.difference(getNonSystemKeyspacesSet(), REPLICATED_SYSTEM_KEYSPACE_NAMES)); } + public Keyspaces getReplicatedKeyspaces() + { + Keyspaces.Builder builder = Keyspaces.builder(); + + keyspaces.values() + .stream() + .filter(k -> !Schema.isSystemKeyspace(k.name)) + .forEach(builder::add); + + return builder.build(); + } + /** * Get metadata about keyspace inner ColumnFamilies * http://git-wip-us.apache.org/repos/asf/cassandra/blob/d8a18f98/src/java/org/apache/cassandra/schema/SchemaKeyspace.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/schema/SchemaKeyspace.java b/src/java/org/apache/cassandra/schema/SchemaKeyspace.java index 06450f1..b6bf415 100644 --- a/src/java/org/apache/cassandra/schema/SchemaKeyspace.java +++ b/src/java/org/apache/cassandra/schema/SchemaKeyspace.java @@ -1291,6 +1291,18 @@ public final class SchemaKeyspace * Merging schema */ + /* + * Reload schema from local disk. Useful if a user made changes to schema tables by hand, or has suspicion that + * in-memory representation got out of sync somehow with what's on disk. + */ + public static synchronized void reloadSchemaAndAnnounceVersion() + { + Keyspaces before = Schema.instance.getReplicatedKeyspaces(); + Keyspaces after = fetchNonSystemKeyspaces(); + mergeSchema(before, after); + Schema.instance.updateVersionAndAnnounce(); + } + /** * Merge remote schema in form of mutations with local and mutate ks/cf metadata objects * (which also involves fs operations on add/drop ks/cf) @@ -1324,7 +1336,11 @@ public final class SchemaKeyspace // fetch the new state of schema from schema tables (not applied to Schema.instance yet) Keyspaces after = fetchKeyspacesOnly(affectedKeyspaces); - // deal with the diff + mergeSchema(before, after); + } + + private static synchronized void mergeSchema(Keyspaces before, Keyspaces after) + { MapDifference<String, KeyspaceMetadata> keyspacesDiff = before.diff(after); // dropped keyspaces http://git-wip-us.apache.org/repos/asf/cassandra/blob/d8a18f98/src/java/org/apache/cassandra/service/StorageService.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 52f28d4..743ed24 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -77,6 +77,7 @@ import org.apache.cassandra.net.*; import org.apache.cassandra.repair.*; import org.apache.cassandra.repair.messages.RepairOption; import org.apache.cassandra.schema.KeyspaceMetadata; +import org.apache.cassandra.schema.SchemaKeyspace; import org.apache.cassandra.service.paxos.CommitVerbHandler; import org.apache.cassandra.service.paxos.PrepareVerbHandler; import org.apache.cassandra.service.paxos.ProposeVerbHandler; @@ -4617,6 +4618,11 @@ public class StorageService extends NotificationBroadcasterSupport implements IE MigrationManager.resetLocalSchema(); } + public void reloadLocalSchema() + { + SchemaKeyspace.reloadSchemaAndAnnounceVersion(); + } + public void setTraceProbability(double probability) { this.traceProbability = probability; http://git-wip-us.apache.org/repos/asf/cassandra/blob/d8a18f98/src/java/org/apache/cassandra/service/StorageServiceMBean.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StorageServiceMBean.java b/src/java/org/apache/cassandra/service/StorageServiceMBean.java index f6e4209..7344ca8 100644 --- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java +++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java @@ -549,6 +549,8 @@ public interface StorageServiceMBean extends NotificationEmitter public void resetLocalSchema() throws IOException; + public void reloadLocalSchema(); + /** * Enables/Disables tracing for the whole system. Only thrift requests can start tracing currently. * http://git-wip-us.apache.org/repos/asf/cassandra/blob/d8a18f98/src/java/org/apache/cassandra/tools/NodeProbe.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java index 5ffdf3b..172b505 100644 --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@ -1086,6 +1086,11 @@ public class NodeProbe implements AutoCloseable ssProxy.resetLocalSchema(); } + public void reloadLocalSchema() + { + ssProxy.reloadLocalSchema(); + } + public boolean isFailed() { return failed; http://git-wip-us.apache.org/repos/asf/cassandra/blob/d8a18f98/src/java/org/apache/cassandra/tools/NodeTool.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java b/src/java/org/apache/cassandra/tools/NodeTool.java index 6d060f4..203662d 100644 --- a/src/java/org/apache/cassandra/tools/NodeTool.java +++ b/src/java/org/apache/cassandra/tools/NodeTool.java @@ -123,6 +123,7 @@ public class NodeTool EnableBackup.class, DisableBackup.class, ResetLocalSchema.class, + ReloadLocalSchema.class, ReloadTriggers.class, SetCacheKeysToSave.class, DisableThrift.class, http://git-wip-us.apache.org/repos/asf/cassandra/blob/d8a18f98/src/java/org/apache/cassandra/tools/nodetool/ReloadLocalSchema.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/nodetool/ReloadLocalSchema.java b/src/java/org/apache/cassandra/tools/nodetool/ReloadLocalSchema.java new file mode 100644 index 0000000..78fbf2d --- /dev/null +++ b/src/java/org/apache/cassandra/tools/nodetool/ReloadLocalSchema.java @@ -0,0 +1,32 @@ +/* + * 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.tools.nodetool; + +import io.airlift.command.Command; +import org.apache.cassandra.tools.NodeProbe; +import org.apache.cassandra.tools.NodeTool.NodeToolCmd; + +@Command(name = "reloadlocalschema", description = "Reload local node schema from system tables") +public class ReloadLocalSchema extends NodeToolCmd +{ + @Override + public void execute(NodeProbe probe) + { + probe.reloadLocalSchema(); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org