Return-Path: X-Original-To: apmail-cassandra-commits-archive@www.apache.org Delivered-To: apmail-cassandra-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id EC88B182E0 for ; Thu, 3 Dec 2015 12:01:25 +0000 (UTC) Received: (qmail 50270 invoked by uid 500); 3 Dec 2015 12:01:25 -0000 Delivered-To: apmail-cassandra-commits-archive@cassandra.apache.org Received: (qmail 50151 invoked by uid 500); 3 Dec 2015 12:01:25 -0000 Mailing-List: contact commits-help@cassandra.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cassandra.apache.org Delivered-To: mailing list commits@cassandra.apache.org Received: (qmail 50089 invoked by uid 99); 3 Dec 2015 12:01:25 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 03 Dec 2015 12:01:25 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id EFFFCE67FD; Thu, 3 Dec 2015 12:01:24 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: samt@apache.org To: commits@cassandra.apache.org Date: Thu, 03 Dec 2015 12:01:26 -0000 Message-Id: In-Reply-To: <0ce20869543f4722b74193041bc83a26@git.apache.org> References: <0ce20869543f4722b74193041bc83a26@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [03/10] cassandra git commit: Always verify expected tables in pseudo-system keyspaces at startup Always verify expected tables in pseudo-system keyspaces at startup Patch by Sam Tunnicliffe; reviewed by Sylvain Lebresne for CASSANDRA-10761 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/15f03ab4 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/15f03ab4 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/15f03ab4 Branch: refs/heads/cassandra-3.1 Commit: 15f03ab446854cf4d2999c3785d145c89bc3a3e4 Parents: e491f05 Author: Sam Tunnicliffe Authored: Wed Nov 25 16:45:02 2015 +0000 Committer: Sam Tunnicliffe Committed: Thu Dec 3 11:44:25 2015 +0000 ---------------------------------------------------------------------- CHANGES.txt | 4 ++++ src/java/org/apache/cassandra/config/Schema.java | 4 +++- .../apache/cassandra/db/ColumnFamilyStore.java | 4 ++-- src/java/org/apache/cassandra/db/Keyspace.java | 12 ++++++------ .../apache/cassandra/service/StorageService.java | 19 +++++-------------- 5 files changed, 20 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/15f03ab4/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 787d145..12accac 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,7 @@ +2.2.5 + * Verify tables in pseudo-system keyspaces at startup (CASSANDRA-10761) + + 2.2.4 * Show CQL help in cqlsh in web browser (CASSANDRA-7225) * Serialize on disk the proper SSTable compression ratio (CASSANDRA-10775) http://git-wip-us.apache.org/repos/asf/cassandra/blob/15f03ab4/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 00c9358..110029e 100644 --- a/src/java/org/apache/cassandra/config/Schema.java +++ b/src/java/org/apache/cassandra/config/Schema.java @@ -525,8 +525,10 @@ public class Schema // since we're going to call initCf on the new one manually Keyspace.open(cfm.ksName); + // init the new CF before switching the KSM to the new one + // to avoid races as in CASSANDRA-10761 + Keyspace.open(cfm.ksName).initCf(cfm, true); setKeyspaceDefinition(ksm); - Keyspace.open(ksm.name).initCf(cfm.cfId, cfm.cfName, true); MigrationManager.instance.notifyCreateColumnFamily(cfm); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/15f03ab4/src/java/org/apache/cassandra/db/ColumnFamilyStore.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index 8fefae2..5325c8a 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -506,9 +506,9 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean } - public static ColumnFamilyStore createColumnFamilyStore(Keyspace keyspace, String columnFamily, boolean loadSSTables) + public static ColumnFamilyStore createColumnFamilyStore(Keyspace keyspace, CFMetaData metadata, boolean loadSSTables) { - return createColumnFamilyStore(keyspace, columnFamily, StorageService.getPartitioner(), Schema.instance.getCFMetaData(keyspace.getName(), columnFamily), loadSSTables); + return createColumnFamilyStore(keyspace, metadata.cfName, StorageService.getPartitioner(), metadata, loadSSTables); } public static synchronized ColumnFamilyStore createColumnFamilyStore(Keyspace keyspace, http://git-wip-us.apache.org/repos/asf/cassandra/blob/15f03ab4/src/java/org/apache/cassandra/db/Keyspace.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/Keyspace.java b/src/java/org/apache/cassandra/db/Keyspace.java index 92a0950..225369c 100644 --- a/src/java/org/apache/cassandra/db/Keyspace.java +++ b/src/java/org/apache/cassandra/db/Keyspace.java @@ -267,7 +267,7 @@ public class Keyspace for (CFMetaData cfm : new ArrayList<>(metadata.cfMetaData().values())) { logger.trace("Initializing {}.{}", getName(), cfm.cfName); - initCf(cfm.cfId, cfm.cfName, loadSSTables); + initCf(cfm, loadSSTables); } } @@ -330,25 +330,25 @@ public class Keyspace /** * adds a cf to internal structures, ends up creating disk files). */ - public void initCf(UUID cfId, String cfName, boolean loadSSTables) + public void initCf(CFMetaData metadata, boolean loadSSTables) { - ColumnFamilyStore cfs = columnFamilyStores.get(cfId); + ColumnFamilyStore cfs = columnFamilyStores.get(metadata.cfId); if (cfs == null) { // CFS being created for the first time, either on server startup or new CF being added. // We don't worry about races here; startup is safe, and adding multiple idential CFs // simultaneously is a "don't do that" scenario. - ColumnFamilyStore oldCfs = columnFamilyStores.putIfAbsent(cfId, ColumnFamilyStore.createColumnFamilyStore(this, cfName, loadSSTables)); + ColumnFamilyStore oldCfs = columnFamilyStores.putIfAbsent(metadata.cfId, ColumnFamilyStore.createColumnFamilyStore(this, metadata, loadSSTables)); // CFS mbean instantiation will error out before we hit this, but in case that changes... if (oldCfs != null) - throw new IllegalStateException("added multiple mappings for cf id " + cfId); + throw new IllegalStateException("added multiple mappings for cf id " + metadata.cfId); } else { // re-initializing an existing CF. This will happen if you cleared the schema // on this node and it's getting repopulated from the rest of the cluster. - assert cfs.name.equals(cfName); + assert cfs.name.equals(metadata.cfName); cfs.metadata.reload(); cfs.reload(); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/15f03ab4/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 fec3750..68e19c5 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -1026,18 +1026,6 @@ public class StorageService extends NotificationBroadcasterSupport implements IE MigrationManager.instance.register(new AuthMigrationListener()); } - private void maybeAddTable(CFMetaData cfm) - { - try - { - MigrationManager.announceNewColumnFamily(cfm); - } - catch (AlreadyExistsException e) - { - logger.debug("Attempted to create new table {}, but it already exists", cfm.cfName); - } - } - private void maybeAddKeyspace(KSMetaData ksm) { try @@ -1064,14 +1052,17 @@ public class StorageService extends NotificationBroadcasterSupport implements IE // version of the schema, the one the node will be expecting. KSMetaData defined = Schema.instance.getKSMetaData(expected.name); + // If the keyspace doesn't exist, create it if (defined == null) { - // The keyspace doesn't exist, create it maybeAddKeyspace(expected); - return; + defined = Schema.instance.getKSMetaData(expected.name); } // While the keyspace exists, it might miss table or have outdated one + // There is also the potential for a race, as schema migrations add the bare + // keyspace into Schema.instance before adding its tables, so double check that + // all the expected tables are present for (CFMetaData expectedTable : expected.cfMetaData().values()) { CFMetaData definedTable = defined.cfMetaData().get(expectedTable.cfName);