You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sa...@apache.org on 2015/12/03 13:01:29 UTC
[06/10] cassandra git commit: Merge branch 'cassandra-2.2' into
cassandra-3.0
Merge branch 'cassandra-2.2' into cassandra-3.0
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/9784be5e
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/9784be5e
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/9784be5e
Branch: refs/heads/cassandra-3.0
Commit: 9784be5e076ce13426813493662378b52228dd57
Parents: d7068fd 15f03ab
Author: Sam Tunnicliffe <sa...@beobal.com>
Authored: Thu Dec 3 11:45:03 2015 +0000
Committer: Sam Tunnicliffe <sa...@beobal.com>
Committed: Thu Dec 3 11:45:50 2015 +0000
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../org/apache/cassandra/config/Schema.java | 41 +++++++++-----------
.../apache/cassandra/db/ColumnFamilyStore.java | 4 +-
src/java/org/apache/cassandra/db/Keyspace.java | 14 +++----
.../cassandra/service/StorageService.java | 19 +++------
5 files changed, 32 insertions(+), 47 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/9784be5e/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index a82dcfc,12accac..4dd1b97
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,22 -1,8 +1,23 @@@
-2.2.5
+3.0.1
+ * Fix NPE on stream read error (CASSANDRA-10771)
+ * Normalize cqlsh DESC output (CASSANDRA-10431)
+ * Rejects partition range deletions when columns are specified (CASSANDRA-10739)
+ * Fix error when saving cached key for old format sstable (CASSANDRA-10778)
+ * Invalidate prepared statements on DROP INDEX (CASSANDRA-10758)
+ * Fix SELECT statement with IN restrictions on partition key,
+ ORDER BY and LIMIT (CASSANDRA-10729)
+ * Improve stress performance over 1k threads (CASSANDRA-7217)
+ * Wait for migration responses to complete before bootstrapping (CASSANDRA-10731)
+ * Unable to create a function with argument of type Inet (CASSANDRA-10741)
+ * Fix backward incompatibiliy in CqlInputFormat (CASSANDRA-10717)
+ * Correctly preserve deletion info on updated rows when notifying indexers
+ of single-row deletions (CASSANDRA-10694)
+ * Notify indexers of partition delete during cleanup (CASSANDRA-10685)
+ * Keep the file open in trySkipCache (CASSANDRA-10669)
+ * Updated trigger example (CASSANDRA-10257)
+Merged from 2.2:
+ * Verify tables in pseudo-system keyspaces at startup (CASSANDRA-10761)
-
-
-2.2.4
+ * Fix IllegalArgumentException in DataOutputBuffer.reallocate for large buffers (CASSANDRA-10592)
* Show CQL help in cqlsh in web browser (CASSANDRA-7225)
* Serialize on disk the proper SSTable compression ratio (CASSANDRA-10775)
* Reject index queries while the index is building (CASSANDRA-8505)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/9784be5e/src/java/org/apache/cassandra/config/Schema.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/config/Schema.java
index 569c87d,110029e..cf3f569
--- a/src/java/org/apache/cassandra/config/Schema.java
+++ b/src/java/org/apache/cassandra/config/Schema.java
@@@ -605,19 -515,20 +605,17 @@@ public class Schem
public void addTable(CFMetaData cfm)
{
assert getCFMetaData(cfm.ksName, cfm.cfName) == null;
- KSMetaData ksm = getKSMetaData(cfm.ksName).cloneWithTableAdded(cfm);
-
- logger.info("Loading {}", cfm);
- update(cfm.ksName, ks ->
- {
- load(cfm);
-
- // make sure it's init-ed w/ the old definitions first,
- // since we're going to call initCf on the new one manually
- Keyspace.open(cfm.ksName);
-
- return ks.withSwapped(ks.tables.with(cfm));
- });
-
- Keyspace.open(cfm.ksName).initCf(cfm.cfId, cfm.cfName, true);
++ // Make sure the keyspace is initialized and initialize the table.
++ Keyspace.open(cfm.ksName).initCf(cfm, true);
++ // Update the keyspaces map with the updated metadata
++ update(cfm.ksName, ks -> ks.withSwapped(ks.tables.with(cfm)));
++ // Update the table ID <-> table name map (cfIdMap)
+ load(cfm);
+
- // make sure it's init-ed w/ the old definitions first,
- // 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);
MigrationManager.instance.notifyCreateColumnFamily(cfm);
}
@@@ -659,80 -566,37 +657,77 @@@
CommitLog.instance.forceRecycleAllSegments(Collections.singleton(cfm.cfId));
}
- public void addType(UserType ut)
+ public void addView(ViewDefinition view)
{
- KSMetaData ksm = getKSMetaData(ut.keyspace);
- assert ksm != null;
+ assert getCFMetaData(view.ksName, view.viewName) == null;
- update(view.ksName, ks ->
- {
- load(view);
-
- // make sure it's init-ed w/ the old definitions first,
- // since we're going to call initCf on the new one manually
- Keyspace.open(view.ksName);
- logger.info("Loading {}", ut);
++ Keyspace keyspace = Keyspace.open(view.ksName);
- return ks.withSwapped(ks.views.with(view));
- });
- ksm.userTypes.addType(ut);
++ // Make sure the keyspace is initialized and initialize the table.
++ keyspace.initCf(view.metadata, true);
++ // Update the keyspaces map with the updated metadata
++ update(view.ksName, ks -> ks.withSwapped(ks.views.with(view)));
++ // Update the table ID <-> table name map (cfIdMap)
++ load(view);
- Keyspace.open(view.ksName).initCf(view.metadata.cfId, view.viewName, true);
- Keyspace.open(view.ksName).viewManager.reload();
- MigrationManager.instance.notifyCreateUserType(ut);
++ keyspace.viewManager.reload();
+ MigrationManager.instance.notifyCreateView(view);
}
- public void updateType(UserType ut)
+ public void updateView(ViewDefinition view)
{
- KSMetaData ksm = getKSMetaData(ut.keyspace);
- assert ksm != null;
+ ViewDefinition current = getKSMetaData(view.ksName).views.get(view.viewName).get();
+ boolean changeAffectsStatements = current.metadata.apply(view.metadata);
+
+ Keyspace keyspace = Keyspace.open(current.ksName);
+ keyspace.getColumnFamilyStore(current.viewName).reload();
+ Keyspace.open(current.ksName).viewManager.update(current.viewName);
+ MigrationManager.instance.notifyUpdateView(current, changeAffectsStatements);
+ }
+
+ public void dropView(String ksName, String viewName)
+ {
+ KeyspaceMetadata oldKsm = getKSMetaData(ksName);
+ assert oldKsm != null;
+ ColumnFamilyStore cfs = Keyspace.open(ksName).getColumnFamilyStore(viewName);
+ assert cfs != null;
+
+ // make sure all the indexes are dropped, or else.
+ cfs.indexManager.markAllIndexesRemoved();
- logger.info("Updating {}", ut);
+ // reinitialize the keyspace.
+ ViewDefinition view = oldKsm.views.get(viewName).get();
+ KeyspaceMetadata newKsm = oldKsm.withSwapped(oldKsm.views.without(viewName));
- ksm.userTypes.addType(ut);
+ unload(view);
+ setKeyspaceMetadata(newKsm);
- MigrationManager.instance.notifyUpdateUserType(ut);
+ CompactionManager.instance.interruptCompactionFor(Collections.singleton(view.metadata), true);
+
+ if (DatabaseDescriptor.isAutoSnapshot())
+ cfs.snapshot(Keyspace.getTimestampedSnapshotName(cfs.name));
+ Keyspace.open(ksName).dropCf(view.metadata.cfId);
+ Keyspace.open(ksName).viewManager.reload();
+ MigrationManager.instance.notifyDropView(view);
+
+ CommitLog.instance.forceRecycleAllSegments(Collections.singleton(view.metadata.cfId));
}
- public void dropType(UserType ut)
+ public void addType(UserType ut)
{
- KSMetaData ksm = getKSMetaData(ut.keyspace);
- assert ksm != null;
+ update(ut.keyspace, ks -> ks.withSwapped(ks.types.with(ut)));
+ MigrationManager.instance.notifyCreateUserType(ut);
+ }
- ksm.userTypes.removeType(ut);
+ public void updateType(UserType ut)
+ {
+ update(ut.keyspace, ks -> ks.withSwapped(ks.types.without(ut.name).with(ut)));
+ MigrationManager.instance.notifyUpdateUserType(ut);
+ }
+ public void dropType(UserType ut)
+ {
+ update(ut.keyspace, ks -> ks.withSwapped(ks.types.without(ut.name)));
MigrationManager.instance.notifyDropUserType(ut);
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/9784be5e/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index 38c99ea,5325c8a..f0adf39
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@@ -532,9 -506,9 +532,9 @@@ public class ColumnFamilyStore implemen
}
- public static ColumnFamilyStore createColumnFamilyStore(Keyspace keyspace, String columnFamily, boolean loadSSTables)
+ public static ColumnFamilyStore createColumnFamilyStore(Keyspace keyspace, CFMetaData metadata, boolean loadSSTables)
{
- return createColumnFamilyStore(keyspace, columnFamily, Schema.instance.getCFMetaData(keyspace.getName(), columnFamily), loadSSTables);
- return createColumnFamilyStore(keyspace, metadata.cfName, StorageService.getPartitioner(), metadata, loadSSTables);
++ return createColumnFamilyStore(keyspace, metadata.cfName, metadata, loadSSTables);
}
public static synchronized ColumnFamilyStore createColumnFamilyStore(Keyspace keyspace,
http://git-wip-us.apache.org/repos/asf/cassandra/blob/9784be5e/src/java/org/apache/cassandra/db/Keyspace.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/Keyspace.java
index eb28b2c,225369c..7b4f79b
--- a/src/java/org/apache/cassandra/db/Keyspace.java
+++ b/src/java/org/apache/cassandra/db/Keyspace.java
@@@ -298,16 -264,14 +298,16 @@@ public class Keyspac
createReplicationStrategy(metadata);
this.metric = new KeyspaceMetrics(this);
- for (CFMetaData cfm : new ArrayList<>(metadata.cfMetaData().values()))
+ this.viewManager = new ViewManager(this);
+ for (CFMetaData cfm : metadata.tablesAndViews())
{
logger.trace("Initializing {}.{}", getName(), cfm.cfName);
- initCf(cfm.cfId, cfm.cfName, loadSSTables);
+ initCf(cfm, loadSSTables);
}
+ this.viewManager.reload();
}
- private Keyspace(KSMetaData metadata)
+ private Keyspace(KeyspaceMetadata metadata)
{
this.metadata = metadata;
createReplicationStrategy(metadata);
@@@ -376,7 -348,8 +374,7 @@@
{
// 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/9784be5e/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/service/StorageService.java
index 0b910f0,68e19c5..2332cea
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@@ -1038,19 -1026,7 +1038,7 @@@ public class StorageService extends Not
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)
+ private void maybeAddKeyspace(KeyspaceMetadata ksm)
{
try
{
@@@ -1075,18 -1051,21 +1063,21 @@@
// (#8162 being an example), so even if the table definition exists, we still need to force the "current"
// version of the schema, the one the node will be expecting.
- KSMetaData defined = Schema.instance.getKSMetaData(expected.name);
+ KeyspaceMetadata 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())
+ for (CFMetaData expectedTable : expected.tables)
{
- CFMetaData definedTable = defined.cfMetaData().get(expectedTable.cfName);
+ CFMetaData definedTable = defined.tables.get(expectedTable.cfName).orElse(null);
if (definedTable == null || !definedTable.equals(expectedTable))
MigrationManager.forceAnnounceNewColumnFamily(expectedTable);
}