You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2015/07/01 21:22:19 UTC
[1/4] cassandra git commit: Fix setting 'durable_writes' in ALTER
KEYSPACE
Repository: cassandra
Updated Branches:
refs/heads/trunk 9627f13ef -> 067141a23
Fix setting 'durable_writes' in ALTER KEYSPACE
patch by Carl Yeksigian; reviewed by Aleksey Yeschenko for
CASSANDRA-9560
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/3504a50b
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/3504a50b
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/3504a50b
Branch: refs/heads/trunk
Commit: 3504a50bb4bd93edeb2941dccd9444d53a85a1ed
Parents: 0bdf923
Author: Carl Yeksigian <ca...@apache.org>
Authored: Mon Jun 22 09:18:39 2015 -0400
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Wed Jul 1 21:47:07 2015 +0300
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../org/apache/cassandra/db/ColumnFamilyStore.java | 2 +-
src/java/org/apache/cassandra/db/DataTracker.java | 2 +-
src/java/org/apache/cassandra/db/DefsTables.java | 2 +-
src/java/org/apache/cassandra/db/Keyspace.java | 16 +++++++++++++---
src/java/org/apache/cassandra/db/RowMutation.java | 2 +-
.../unit/org/apache/cassandra/db/CommitLogTest.java | 2 +-
7 files changed, 19 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/3504a50b/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 2a69292..391874b 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
2.0.17
+ * Fix setting 'durable_writes' in ALTER KEYSPACE (CASSANDRA-9560)
* Avoid ballot clash in Paxos (CASSANDRA-9649)
* Improve trace messages for RR (CASSANDRA-9479)
* Fix suboptimal secondary index selection when restricted
http://git-wip-us.apache.org/repos/asf/cassandra/blob/3504a50b/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 4fc2f24..bf1e779 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -2075,7 +2075,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
// position in the System keyspace.
logger.debug("truncating {}", name);
- if (keyspace.metadata.durableWrites || DatabaseDescriptor.isAutoSnapshot())
+ if (keyspace.getMetadata().durableWrites || DatabaseDescriptor.isAutoSnapshot())
{
// flush the CF being truncated before forcing the new segment
forceBlockingFlush();
http://git-wip-us.apache.org/repos/asf/cassandra/blob/3504a50b/src/java/org/apache/cassandra/db/DataTracker.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/DataTracker.java b/src/java/org/apache/cassandra/db/DataTracker.java
index f6d2c75..e961b77 100644
--- a/src/java/org/apache/cassandra/db/DataTracker.java
+++ b/src/java/org/apache/cassandra/db/DataTracker.java
@@ -130,7 +130,7 @@ public class DataTracker
*/
public void renewMemtable()
{
- assert !cfstore.keyspace.metadata.durableWrites;
+ assert !cfstore.keyspace.getMetadata().durableWrites;
Memtable newMemtable = new Memtable(cfstore);
View currentView, newView;
http://git-wip-us.apache.org/repos/asf/cassandra/blob/3504a50b/src/java/org/apache/cassandra/db/DefsTables.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/DefsTables.java b/src/java/org/apache/cassandra/db/DefsTables.java
index 35eecc0..f35d6a5 100644
--- a/src/java/org/apache/cassandra/db/DefsTables.java
+++ b/src/java/org/apache/cassandra/db/DefsTables.java
@@ -333,7 +333,7 @@ public class DefsTables
if (!StorageService.instance.isClientMode())
{
- Keyspace.open(ksName).createReplicationStrategy(newKsm);
+ Keyspace.open(ksName).setMetadata(newKsm);
MigrationManager.instance.notifyUpdateKeyspace(newKsm);
}
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/3504a50b/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 38b7c2b..915ccca 100644
--- a/src/java/org/apache/cassandra/db/Keyspace.java
+++ b/src/java/org/apache/cassandra/db/Keyspace.java
@@ -70,10 +70,9 @@ public class Keyspace
DatabaseDescriptor.createAllDirectories();
}
- public final KSMetaData metadata;
-
/* ColumnFamilyStore per column family */
private final ConcurrentMap<UUID, ColumnFamilyStore> columnFamilyStores = new ConcurrentHashMap<UUID, ColumnFamilyStore>();
+ private volatile KSMetaData metadata;
private volatile AbstractReplicationStrategy replicationStrategy;
public static final Function<String,Keyspace> keyspaceTransformer = new Function<String, Keyspace>()
@@ -270,7 +269,7 @@ public class Keyspace
}
}
- public void createReplicationStrategy(KSMetaData ksm)
+ private void createReplicationStrategy(KSMetaData ksm)
{
replicationStrategy = AbstractReplicationStrategy.createReplicationStrategy(ksm.name,
ksm.strategyClass,
@@ -279,6 +278,17 @@ public class Keyspace
ksm.strategyOptions);
}
+ public void setMetadata(KSMetaData ksm)
+ {
+ this.metadata = ksm;
+ createReplicationStrategy(ksm);
+ }
+
+ public KSMetaData getMetadata()
+ {
+ return metadata;
+ }
+
// best invoked on the compaction mananger.
public void dropCf(UUID cfId)
{
http://git-wip-us.apache.org/repos/asf/cassandra/blob/3504a50b/src/java/org/apache/cassandra/db/RowMutation.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/RowMutation.java b/src/java/org/apache/cassandra/db/RowMutation.java
index 223225e..50bd014 100644
--- a/src/java/org/apache/cassandra/db/RowMutation.java
+++ b/src/java/org/apache/cassandra/db/RowMutation.java
@@ -208,7 +208,7 @@ public class RowMutation implements IMutation
public void apply()
{
Keyspace ks = Keyspace.open(keyspaceName);
- ks.apply(this, ks.metadata.durableWrites);
+ ks.apply(this, ks.getMetadata().durableWrites);
}
public void applyUnsafe()
http://git-wip-us.apache.org/repos/asf/cassandra/blob/3504a50b/test/unit/org/apache/cassandra/db/CommitLogTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/CommitLogTest.java b/test/unit/org/apache/cassandra/db/CommitLogTest.java
index 38c192d..289fbc9 100644
--- a/test/unit/org/apache/cassandra/db/CommitLogTest.java
+++ b/test/unit/org/apache/cassandra/db/CommitLogTest.java
@@ -294,7 +294,7 @@ public class CommitLogTest extends SchemaLoader
boolean prevAutoSnapshot = DatabaseDescriptor.isAutoSnapshot();
DatabaseDescriptor.setAutoSnapshot(false);
Keyspace notDurableKs = Keyspace.open("NoCommitlogSpace");
- Assert.assertFalse(notDurableKs.metadata.durableWrites);
+ Assert.assertFalse(notDurableKs.getMetadata().durableWrites);
ColumnFamilyStore cfs = notDurableKs.getColumnFamilyStore("Standard1");
RowMutation rm;
DecoratedKey dk = Util.dk("key1");
[4/4] cassandra git commit: Merge branch 'cassandra-2.2' into trunk
Posted by al...@apache.org.
Merge branch 'cassandra-2.2' into trunk
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/067141a2
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/067141a2
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/067141a2
Branch: refs/heads/trunk
Commit: 067141a2302084fe0402f305ddda1c6ae57ad083
Parents: 9627f13 cda407a
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Wed Jul 1 22:20:45 2015 +0300
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Wed Jul 1 22:20:45 2015 +0300
----------------------------------------------------------------------
CHANGES.txt | 5 +++--
src/java/org/apache/cassandra/config/Schema.java | 1 -
src/java/org/apache/cassandra/db/Keyspace.java | 3 ++-
3 files changed, 5 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/067141a2/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index ac23818,104f6ab..73e1ca8
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,17 -1,4 +1,17 @@@
+3.0
+ * Change hinted_handoff_enabled yaml setting, JMX (CASSANDRA-9035)
+ * Add algorithmic token allocation (CASSANDRA-7032)
+ * Add nodetool command to replay batchlog (CASSANDRA-9547)
+ * Make file buffer cache independent of paths being read (CASSANDRA-8897)
+ * Remove deprecated legacy Hadoop code (CASSANDRA-9353)
+ * Decommissioned nodes will not rejoin the cluster (CASSANDRA-8801)
+ * Change gossip stabilization to use endpoit size (CASSANDRA-9401)
+ * Change default garbage collector to G1 (CASSANDRA-7486)
+ * Populate TokenMetadata early during startup (CASSANDRA-9317)
+ * undeprecate cache recentHitRate (CASSANDRA-6591)
+
+
- 2.2
+ 2.2.0-rc2
* (cqlsh) Allow setting the initial connection timeout (CASSANDRA-9601)
* BulkLoader has --transport-factory option but does not use it (CASSANDRA-9675)
* Allow JMX over SSL directly from nodetool (CASSANDRA-9090)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/067141a2/src/java/org/apache/cassandra/config/Schema.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/config/Schema.java
index 2178f0e,548341e..4d3e6f3
--- a/src/java/org/apache/cassandra/config/Schema.java
+++ b/src/java/org/apache/cassandra/config/Schema.java
@@@ -447,11 -416,16 +447,10 @@@ public class Schem
MigrationManager.instance.notifyCreateKeyspace(ksm);
}
- public void updateKeyspace(String ksName)
+ public void updateKeyspace(String ksName, KeyspaceParams newParams)
{
- KSMetaData oldKsm = getKSMetaData(ksName);
- assert oldKsm != null;
- KSMetaData newKsm = LegacySchemaTables.createKeyspaceFromName(ksName).cloneWith(oldKsm.cfMetaData().values(), oldKsm.userTypes);
-
- setKeyspaceDefinition(newKsm);
- Keyspace.open(ksName).setMetadata(newKsm);
-
- MigrationManager.instance.notifyUpdateKeyspace(newKsm);
+ KeyspaceMetadata ksm = update(ksName, ks -> ks.withSwapped(newParams));
- Keyspace.open(ksName).createReplicationStrategy(ksm);
+ MigrationManager.instance.notifyUpdateKeyspace(ksm);
}
public void dropKeyspace(String ksName)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/067141a2/src/java/org/apache/cassandra/db/Keyspace.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/Keyspace.java
index af79ed8,548d2be..cc95b9f
--- a/src/java/org/apache/cassandra/db/Keyspace.java
+++ b/src/java/org/apache/cassandra/db/Keyspace.java
@@@ -167,16 -161,6 +167,17 @@@ public class Keyspac
}
}
+ public void setMetadata(KeyspaceMetadata metadata)
+ {
+ this.metadata = metadata;
++ createReplicationStrategy(metadata);
+ }
+
+ public KeyspaceMetadata getMetadata()
+ {
+ return metadata;
+ }
+
public Collection<ColumnFamilyStore> getColumnFamilyStores()
{
return Collections.unmodifiableCollection(columnFamilyStores.values());
@@@ -303,13 -287,24 +304,13 @@@
return new Keyspace(metadata);
}
- public void createReplicationStrategy(KeyspaceMetadata ksm)
- private void createReplicationStrategy(KSMetaData ksm)
++ private void createReplicationStrategy(KeyspaceMetadata ksm)
{
replicationStrategy = AbstractReplicationStrategy.createReplicationStrategy(ksm.name,
- ksm.strategyClass,
+ ksm.params.replication.klass,
StorageService.instance.getTokenMetadata(),
DatabaseDescriptor.getEndpointSnitch(),
- ksm.strategyOptions);
- }
-
- public void setMetadata(KSMetaData ksm)
- {
- this.metadata = ksm;
- createReplicationStrategy(ksm);
- }
-
- public KSMetaData getMetadata()
- {
- return metadata;
+ ksm.params.replication.options);
}
// best invoked on the compaction mananger.
[2/4] cassandra git commit: Merge branch 'cassandra-2.0' into
cassandra-2.1
Posted by al...@apache.org.
Merge branch 'cassandra-2.0' into cassandra-2.1
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/31aa2a23
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/31aa2a23
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/31aa2a23
Branch: refs/heads/trunk
Commit: 31aa2a23c3cf7a45c6563d75b0a958d9e492c681
Parents: c65d81b 3504a50
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Wed Jul 1 22:02:19 2015 +0300
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Wed Jul 1 22:02:19 2015 +0300
----------------------------------------------------------------------
CHANGES.txt | 7 ++++---
.../org/apache/cassandra/db/ColumnFamilyStore.java | 2 +-
src/java/org/apache/cassandra/db/DefsTables.java | 2 +-
src/java/org/apache/cassandra/db/Keyspace.java | 15 +++++++++++++--
src/java/org/apache/cassandra/db/Mutation.java | 2 +-
test/unit/org/apache/cassandra/db/CommitLogTest.java | 2 +-
6 files changed, 21 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/31aa2a23/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 052ced1,391874b..5c55b9e
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,13 -1,6 +1,14 @@@
-2.0.17
+2.1.8
+ * Update internal python driver for cqlsh (CASSANDRA-9064)
- * Avoids ballot clash in Paxos (CASSANDRA-9649)
+ * Fix IndexOutOfBoundsException when inserting tuple with too many
+ elements using the string literal notation (CASSANDRA-9559)
+ * Allow JMX over SSL directly from nodetool (CASSANDRA-9090)
+ * Fix incorrect result for IN queries where column not found (CASSANDRA-9540)
+ * Enable describe on indices (CASSANDRA-7814)
+ * ColumnFamilyStore.selectAndReference may block during compaction (CASSANDRA-9637)
- Merged from 2.0
++Merged from 2.0:
+ * Fix setting 'durable_writes' in ALTER KEYSPACE (CASSANDRA-9560)
+ * Avoid ballot clash in Paxos (CASSANDRA-9649)
* Improve trace messages for RR (CASSANDRA-9479)
* Fix suboptimal secondary index selection when restricted
clustering column is also indexed (CASSANDRA-9631)
@@@ -15,12 -8,10 +16,12 @@@
* Fix error message when attempting to create an index on a column
in a COMPACT STORAGE table with clustering columns (CASSANDRA-9527)
* 'WITH WITH' in alter keyspace statements causes NPE (CASSANDRA-9565)
- * Display min timestamp in sstablemetadata viewer (CASSANDRA-6767)
-2.0.16:
+2.1.7
+ * Fix bug in cardinality check when compacting (CASSANDRA-9580)
+ * Fix memory leak in Ref due to ConcurrentLinkedQueue.remove() behaviour (CASSANDRA-9549)
- Merged from 2.0
++Merged from 2.0:
* Expose some internals of SelectStatement for inspection (CASSANDRA-9532)
* ArrivalWindow should use primitives (CASSANDRA-9496)
* Periodically submit background compaction tasks (CASSANDRA-9592)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/31aa2a23/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/31aa2a23/src/java/org/apache/cassandra/db/DefsTables.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/31aa2a23/src/java/org/apache/cassandra/db/Keyspace.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/Keyspace.java
index cec1beb,915ccca..4f59c40
--- a/src/java/org/apache/cassandra/db/Keyspace.java
+++ b/src/java/org/apache/cassandra/db/Keyspace.java
@@@ -71,11 -70,9 +71,11 @@@ public class Keyspac
DatabaseDescriptor.createAllDirectories();
}
- public final KSMetaData metadata;
+ public final OpOrder writeOrder = new OpOrder();
+
/* ColumnFamilyStore per column family */
private final ConcurrentMap<UUID, ColumnFamilyStore> columnFamilyStores = new ConcurrentHashMap<UUID, ColumnFamilyStore>();
+ private volatile KSMetaData metadata;
private volatile AbstractReplicationStrategy replicationStrategy;
public static final Function<String,Keyspace> keyspaceTransformer = new Function<String, Keyspace>()
http://git-wip-us.apache.org/repos/asf/cassandra/blob/31aa2a23/src/java/org/apache/cassandra/db/Mutation.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/Mutation.java
index a6d23cb,0000000..0424f5a
mode 100644,000000..100644
--- a/src/java/org/apache/cassandra/db/Mutation.java
+++ b/src/java/org/apache/cassandra/db/Mutation.java
@@@ -1,351 -1,0 +1,351 @@@
+/*
+ * 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.db;
+
+import java.io.DataInput;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.*;
+
+import org.apache.commons.lang3.StringUtils;
+
+import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.Schema;
+import org.apache.cassandra.db.composites.CellName;
+import org.apache.cassandra.db.composites.Composite;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.net.MessageOut;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+// TODO convert this to a Builder pattern instead of encouraging M.add directly,
+// which is less-efficient since we have to keep a mutable HashMap around
+public class Mutation implements IMutation
+{
+ public static final MutationSerializer serializer = new MutationSerializer();
+ private static final Logger logger = LoggerFactory.getLogger(Mutation.class);
+
+ public static final String FORWARD_TO = "FWD_TO";
+ public static final String FORWARD_FROM = "FWD_FRM";
+
+ // todo this is redundant
+ // when we remove it, also restore SerializationsTest.testMutationRead to not regenerate new Mutations each test
+ private final String keyspaceName;
+
+ private final ByteBuffer key;
+ // map of column family id to mutations for that column family.
+ private final Map<UUID, ColumnFamily> modifications;
+
+ public Mutation(String keyspaceName, ByteBuffer key)
+ {
+ this(keyspaceName, key, new HashMap<UUID, ColumnFamily>());
+ }
+
+ public Mutation(String keyspaceName, ByteBuffer key, ColumnFamily cf)
+ {
+ this(keyspaceName, key, Collections.singletonMap(cf.id(), cf));
+ }
+
+ public Mutation(String keyspaceName, Row row)
+ {
+ this(keyspaceName, row.key.getKey(), row.cf);
+ }
+
+ protected Mutation(String keyspaceName, ByteBuffer key, Map<UUID, ColumnFamily> modifications)
+ {
+ this.keyspaceName = keyspaceName;
+ this.key = key;
+ this.modifications = modifications;
+ }
+
+ public Mutation(ByteBuffer key, ColumnFamily cf)
+ {
+ this(cf.metadata().ksName, key, cf);
+ }
+
+ public Mutation copy()
+ {
+ Mutation copy = new Mutation(keyspaceName, key, new HashMap<>(modifications));
+ return copy;
+ }
+
+ public String getKeyspaceName()
+ {
+ return keyspaceName;
+ }
+
+ public Collection<UUID> getColumnFamilyIds()
+ {
+ return modifications.keySet();
+ }
+
+ public ByteBuffer key()
+ {
+ return key;
+ }
+
+ public Collection<ColumnFamily> getColumnFamilies()
+ {
+ return modifications.values();
+ }
+
+ public ColumnFamily getColumnFamily(UUID cfId)
+ {
+ return modifications.get(cfId);
+ }
+
+ /*
+ * Specify a column family name and the corresponding column
+ * family object.
+ * param @ cf - column family name
+ * param @ columnFamily - the column family.
+ */
+ public void add(ColumnFamily columnFamily)
+ {
+ assert columnFamily != null;
+ ColumnFamily prev = modifications.put(columnFamily.id(), columnFamily);
+ if (prev != null)
+ // developer error
+ throw new IllegalArgumentException("ColumnFamily " + columnFamily + " already has modifications in this mutation: " + prev);
+ }
+
+ /**
+ * @return the ColumnFamily in this Mutation corresponding to @param cfName, creating an empty one if necessary.
+ */
+ public ColumnFamily addOrGet(String cfName)
+ {
+ return addOrGet(Schema.instance.getCFMetaData(keyspaceName, cfName));
+ }
+
+ public ColumnFamily addOrGet(CFMetaData cfm)
+ {
+ ColumnFamily cf = modifications.get(cfm.cfId);
+ if (cf == null)
+ {
+ cf = ArrayBackedSortedColumns.factory.create(cfm);
+ modifications.put(cfm.cfId, cf);
+ }
+ return cf;
+ }
+
+ public boolean isEmpty()
+ {
+ return modifications.isEmpty();
+ }
+
+ public void add(String cfName, CellName name, ByteBuffer value, long timestamp, int timeToLive)
+ {
+ addOrGet(cfName).addColumn(name, value, timestamp, timeToLive);
+ }
+
+ public void addCounter(String cfName, CellName name, long value)
+ {
+ addOrGet(cfName).addCounter(name, value);
+ }
+
+ public void add(String cfName, CellName name, ByteBuffer value, long timestamp)
+ {
+ add(cfName, name, value, timestamp, 0);
+ }
+
+ public void delete(String cfName, long timestamp)
+ {
+ int localDeleteTime = (int) (System.currentTimeMillis() / 1000);
+ addOrGet(cfName).delete(new DeletionInfo(timestamp, localDeleteTime));
+ }
+
+ public void delete(String cfName, CellName name, long timestamp)
+ {
+ int localDeleteTime = (int) (System.currentTimeMillis() / 1000);
+ addOrGet(cfName).addTombstone(name, localDeleteTime, timestamp);
+ }
+
+ public void deleteRange(String cfName, Composite start, Composite end, long timestamp)
+ {
+ int localDeleteTime = (int) (System.currentTimeMillis() / 1000);
+ addOrGet(cfName).addAtom(new RangeTombstone(start, end, timestamp, localDeleteTime));
+ }
+
+ public void addAll(IMutation m)
+ {
+ if (!(m instanceof Mutation))
+ throw new IllegalArgumentException();
+
+ Mutation mutation = (Mutation)m;
+ if (!keyspaceName.equals(mutation.keyspaceName) || !key.equals(mutation.key))
+ throw new IllegalArgumentException();
+
+ for (Map.Entry<UUID, ColumnFamily> entry : mutation.modifications.entrySet())
+ {
+ // It's slighty faster to assume the key wasn't present and fix if
+ // not in the case where it wasn't there indeed.
+ ColumnFamily cf = modifications.put(entry.getKey(), entry.getValue());
+ if (cf != null)
+ entry.getValue().addAll(cf);
+ }
+ }
+
+ /*
+ * This is equivalent to calling commit. Applies the changes to
+ * to the keyspace that is obtained by calling Keyspace.open().
+ */
+ public void apply()
+ {
+ Keyspace ks = Keyspace.open(keyspaceName);
- ks.apply(this, ks.metadata.durableWrites);
++ ks.apply(this, ks.getMetadata().durableWrites);
+ }
+
+ public void applyUnsafe()
+ {
+ Keyspace.open(keyspaceName).apply(this, false);
+ }
+
+ public MessageOut<Mutation> createMessage()
+ {
+ return createMessage(MessagingService.Verb.MUTATION);
+ }
+
+ public MessageOut<Mutation> createMessage(MessagingService.Verb verb)
+ {
+ return new MessageOut<>(verb, this, serializer);
+ }
+
+ public long getTimeout()
+ {
+ return DatabaseDescriptor.getWriteRpcTimeout();
+ }
+
+ public String toString()
+ {
+ return toString(false);
+ }
+
+ public String toString(boolean shallow)
+ {
+ StringBuilder buff = new StringBuilder("Mutation(");
+ buff.append("keyspace='").append(keyspaceName).append('\'');
+ buff.append(", key='").append(ByteBufferUtil.bytesToHex(key)).append('\'');
+ buff.append(", modifications=[");
+ if (shallow)
+ {
+ List<String> cfnames = new ArrayList<String>(modifications.size());
+ for (UUID cfid : modifications.keySet())
+ {
+ CFMetaData cfm = Schema.instance.getCFMetaData(cfid);
+ cfnames.add(cfm == null ? "-dropped-" : cfm.cfName);
+ }
+ buff.append(StringUtils.join(cfnames, ", "));
+ }
+ else
+ buff.append(StringUtils.join(modifications.values(), ", "));
+ return buff.append("])").toString();
+ }
+
+ public Mutation without(UUID cfId)
+ {
+ Mutation mutation = new Mutation(keyspaceName, key);
+ for (Map.Entry<UUID, ColumnFamily> entry : modifications.entrySet())
+ if (!entry.getKey().equals(cfId))
+ mutation.add(entry.getValue());
+ return mutation;
+ }
+
+ public static class MutationSerializer implements IVersionedSerializer<Mutation>
+ {
+ public void serialize(Mutation mutation, DataOutputPlus out, int version) throws IOException
+ {
+ if (version < MessagingService.VERSION_20)
+ out.writeUTF(mutation.getKeyspaceName());
+
+ ByteBufferUtil.writeWithShortLength(mutation.key(), out);
+
+ /* serialize the modifications in the mutation */
+ int size = mutation.modifications.size();
+ out.writeInt(size);
+ assert size > 0;
+ for (Map.Entry<UUID, ColumnFamily> entry : mutation.modifications.entrySet())
+ ColumnFamily.serializer.serialize(entry.getValue(), out, version);
+ }
+
+ public Mutation deserialize(DataInput in, int version, ColumnSerializer.Flag flag) throws IOException
+ {
+ String keyspaceName = null; // will always be set from cf.metadata but javac isn't smart enough to see that
+ if (version < MessagingService.VERSION_20)
+ keyspaceName = in.readUTF();
+
+ ByteBuffer key = ByteBufferUtil.readWithShortLength(in);
+ int size = in.readInt();
+ assert size > 0;
+
+ Map<UUID, ColumnFamily> modifications;
+ if (size == 1)
+ {
+ ColumnFamily cf = deserializeOneCf(in, version, flag);
+ modifications = Collections.singletonMap(cf.id(), cf);
+ keyspaceName = cf.metadata().ksName;
+ }
+ else
+ {
+ modifications = new HashMap<UUID, ColumnFamily>();
+ for (int i = 0; i < size; ++i)
+ {
+ ColumnFamily cf = deserializeOneCf(in, version, flag);
+ modifications.put(cf.id(), cf);
+ keyspaceName = cf.metadata().ksName;
+ }
+ }
+
+ return new Mutation(keyspaceName, key, modifications);
+ }
+
+ private ColumnFamily deserializeOneCf(DataInput in, int version, ColumnSerializer.Flag flag) throws IOException
+ {
+ ColumnFamily cf = ColumnFamily.serializer.deserialize(in, ArrayBackedSortedColumns.factory, flag, version);
+ // We don't allow Mutation with null column family, so we should never get null back.
+ assert cf != null;
+ return cf;
+ }
+
+ public Mutation deserialize(DataInput in, int version) throws IOException
+ {
+ return deserialize(in, version, ColumnSerializer.Flag.FROM_REMOTE);
+ }
+
+ public long serializedSize(Mutation mutation, int version)
+ {
+ TypeSizes sizes = TypeSizes.NATIVE;
+ int size = 0;
+
+ if (version < MessagingService.VERSION_20)
+ size += sizes.sizeof(mutation.getKeyspaceName());
+
+ int keySize = mutation.key().remaining();
+ size += sizes.sizeof((short) keySize) + keySize;
+
+ size += sizes.sizeof(mutation.modifications.size());
+ for (Map.Entry<UUID,ColumnFamily> entry : mutation.modifications.entrySet())
+ size += ColumnFamily.serializer.serializedSize(entry.getValue(), TypeSizes.NATIVE, version);
+
+ return size;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/31aa2a23/test/unit/org/apache/cassandra/db/CommitLogTest.java
----------------------------------------------------------------------
diff --cc test/unit/org/apache/cassandra/db/CommitLogTest.java
index ab594f8,289fbc9..9a8a1dc
--- a/test/unit/org/apache/cassandra/db/CommitLogTest.java
+++ b/test/unit/org/apache/cassandra/db/CommitLogTest.java
@@@ -351,10 -294,9 +351,10 @@@ public class CommitLogTest extends Sche
boolean prevAutoSnapshot = DatabaseDescriptor.isAutoSnapshot();
DatabaseDescriptor.setAutoSnapshot(false);
Keyspace notDurableKs = Keyspace.open("NoCommitlogSpace");
- Assert.assertFalse(notDurableKs.metadata.durableWrites);
+ Assert.assertFalse(notDurableKs.getMetadata().durableWrites);
ColumnFamilyStore cfs = notDurableKs.getColumnFamilyStore("Standard1");
- RowMutation rm;
+ CellNameType type = notDurableKs.getColumnFamilyStore("Standard1").getComparator();
+ Mutation rm;
DecoratedKey dk = Util.dk("key1");
// add data
[3/4] cassandra git commit: Merge branch 'cassandra-2.1' into
cassandra-2.2
Posted by al...@apache.org.
Merge branch 'cassandra-2.1' into cassandra-2.2
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/cda407ae
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/cda407ae
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/cda407ae
Branch: refs/heads/trunk
Commit: cda407ae049aa4a21a8d7f0c28bf57d6466a1e00
Parents: fbe96b3 31aa2a2
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Wed Jul 1 22:16:26 2015 +0300
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Wed Jul 1 22:16:26 2015 +0300
----------------------------------------------------------------------
CHANGES.txt | 5 +++--
src/java/org/apache/cassandra/config/Schema.java | 2 +-
.../org/apache/cassandra/db/ColumnFamilyStore.java | 2 +-
src/java/org/apache/cassandra/db/Keyspace.java | 15 +++++++++++++--
src/java/org/apache/cassandra/db/Mutation.java | 2 +-
test/unit/org/apache/cassandra/db/CommitLogTest.java | 2 +-
6 files changed, 20 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/cda407ae/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 0abf6db,5c55b9e..104f6ab
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,34 -1,14 +1,35 @@@
-2.1.8
+2.2.0-rc2
+ * (cqlsh) Allow setting the initial connection timeout (CASSANDRA-9601)
+ * BulkLoader has --transport-factory option but does not use it (CASSANDRA-9675)
+ * Allow JMX over SSL directly from nodetool (CASSANDRA-9090)
+ * Update cqlsh for UDFs (CASSANDRA-7556)
+ * Change Windows kernel default timer resolution (CASSANDRA-9634)
+ * Deprected sstable2json and json2sstable (CASSANDRA-9618)
+ * Allow native functions in user-defined aggregates (CASSANDRA-9542)
+ * Don't repair system_distributed by default (CASSANDRA-9621)
+ * Fix mixing min, max, and count aggregates for blob type (CASSANRA-9622)
+ * Rename class for DATE type in Java driver (CASSANDRA-9563)
+ * Duplicate compilation of UDFs on coordinator (CASSANDRA-9475)
+ * Fix connection leak in CqlRecordWriter (CASSANDRA-9576)
+ * Mlockall before opening system sstables & remove boot_without_jna option (CASSANDRA-9573)
+ * Add functions to convert timeuuid to date or time, deprecate dateOf and unixTimestampOf (CASSANDRA-9229)
+ * Make sure we cancel non-compacting sstables from LifecycleTransaction (CASSANDRA-9566)
+ * Fix deprecated repair JMX API (CASSANDRA-9570)
+ * Add logback metrics (CASSANDRA-9378)
+ * Update and refactor ant test/test-compression to run the tests in parallel (CASSANDRA-9583)
+Merged from 2.1:
* Update internal python driver for cqlsh (CASSANDRA-9064)
- * Avoids ballot clash in Paxos (CASSANDRA-9649)
* Fix IndexOutOfBoundsException when inserting tuple with too many
elements using the string literal notation (CASSANDRA-9559)
- * Allow JMX over SSL directly from nodetool (CASSANDRA-9090)
- * Fix incorrect result for IN queries where column not found (CASSANDRA-9540)
* Enable describe on indices (CASSANDRA-7814)
+ * Fix incorrect result for IN queries where column not found (CASSANDRA-9540)
* ColumnFamilyStore.selectAndReference may block during compaction (CASSANDRA-9637)
+ * Fix bug in cardinality check when compacting (CASSANDRA-9580)
+ * Fix memory leak in Ref due to ConcurrentLinkedQueue.remove() behaviour (CASSANDRA-9549)
+ * Make rebuild only run one at a time (CASSANDRA-9119)
- Merged from 2.0
+ Merged from 2.0:
+ * Fix setting 'durable_writes' in ALTER KEYSPACE (CASSANDRA-9560)
- * Avoid ballot clash in Paxos (CASSANDRA-9649)
++ * Avoids ballot clash in Paxos (CASSANDRA-9649)
* Improve trace messages for RR (CASSANDRA-9479)
* Fix suboptimal secondary index selection when restricted
clustering column is also indexed (CASSANDRA-9631)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/cda407ae/src/java/org/apache/cassandra/config/Schema.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/config/Schema.java
index 2678cb3,8e9802f..548341e
--- a/src/java/org/apache/cassandra/config/Schema.java
+++ b/src/java/org/apache/cassandra/config/Schema.java
@@@ -407,202 -416,20 +407,202 @@@ public class Schem
updateVersionAndAnnounce();
}
- public static boolean invalidSchemaRow(Row row)
+ public void addKeyspace(KSMetaData ksm)
{
- return row.cf == null || (row.cf.isMarkedForDelete() && !row.cf.hasColumns());
+ assert getKSMetaData(ksm.name) == null;
+ load(ksm);
+
+ Keyspace.open(ksm.name);
+ MigrationManager.instance.notifyCreateKeyspace(ksm);
}
- public static boolean ignoredSchemaRow(Row row)
+ public void updateKeyspace(String ksName)
{
- try
- {
- return systemKeyspaceNames.contains(ByteBufferUtil.string(row.key.getKey()));
- }
- catch (CharacterCodingException e)
+ KSMetaData oldKsm = getKSMetaData(ksName);
+ assert oldKsm != null;
+ KSMetaData newKsm = LegacySchemaTables.createKeyspaceFromName(ksName).cloneWith(oldKsm.cfMetaData().values(), oldKsm.userTypes);
+
+ setKeyspaceDefinition(newKsm);
++ Keyspace.open(ksName).setMetadata(newKsm);
+
- Keyspace.open(ksName).createReplicationStrategy(newKsm);
+ MigrationManager.instance.notifyUpdateKeyspace(newKsm);
+ }
+
+ public void dropKeyspace(String ksName)
+ {
+ KSMetaData ksm = Schema.instance.getKSMetaData(ksName);
+ String snapshotName = Keyspace.getTimestampedSnapshotName(ksName);
+
+ CompactionManager.instance.interruptCompactionFor(ksm.cfMetaData().values(), true);
+
+ Keyspace keyspace = Keyspace.open(ksm.name);
+
+ // remove all cfs from the keyspace instance.
+ List<UUID> droppedCfs = new ArrayList<>();
+ for (CFMetaData cfm : ksm.cfMetaData().values())
{
- throw new RuntimeException(e);
+ ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfm.cfName);
+
+ purge(cfm);
+
+ if (DatabaseDescriptor.isAutoSnapshot())
+ cfs.snapshot(snapshotName);
+ Keyspace.open(ksm.name).dropCf(cfm.cfId);
+
+ droppedCfs.add(cfm.cfId);
}
+
+ // remove the keyspace from the static instances.
+ Keyspace.clear(ksm.name);
+ clearKeyspaceDefinition(ksm);
+
+ keyspace.writeOrder.awaitNewBarrier();
+
+ // force a new segment in the CL
+ CommitLog.instance.forceRecycleAllSegments(droppedCfs);
+
+ MigrationManager.instance.notifyDropKeyspace(ksm);
+ }
+
+ public void addTable(CFMetaData cfm)
+ {
+ assert getCFMetaData(cfm.ksName, cfm.cfName) == null;
+ KSMetaData ksm = getKSMetaData(cfm.ksName).cloneWithTableAdded(cfm);
+
+ logger.info("Loading {}", cfm);
+
+ 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);
+
+ setKeyspaceDefinition(ksm);
+ Keyspace.open(ksm.name).initCf(cfm.cfId, cfm.cfName, true);
+ MigrationManager.instance.notifyCreateColumnFamily(cfm);
+ }
+
+ public void updateTable(String ksName, String tableName)
+ {
+ CFMetaData cfm = getCFMetaData(ksName, tableName);
+ assert cfm != null;
+ boolean columnsDidChange = cfm.reload();
+
+ Keyspace keyspace = Keyspace.open(cfm.ksName);
+ keyspace.getColumnFamilyStore(cfm.cfName).reload();
+ MigrationManager.instance.notifyUpdateColumnFamily(cfm, columnsDidChange);
+ }
+
+ public void dropTable(String ksName, String tableName)
+ {
+ KSMetaData ksm = getKSMetaData(ksName);
+ assert ksm != null;
+ ColumnFamilyStore cfs = Keyspace.open(ksName).getColumnFamilyStore(tableName);
+ assert cfs != null;
+
+ // reinitialize the keyspace.
+ CFMetaData cfm = ksm.cfMetaData().get(tableName);
+
+ purge(cfm);
+ setKeyspaceDefinition(ksm.cloneWithTableRemoved(cfm));
+
+ CompactionManager.instance.interruptCompactionFor(Arrays.asList(cfm), true);
+
+ if (DatabaseDescriptor.isAutoSnapshot())
+ cfs.snapshot(Keyspace.getTimestampedSnapshotName(cfs.name));
+ Keyspace.open(ksm.name).dropCf(cfm.cfId);
+ MigrationManager.instance.notifyDropColumnFamily(cfm);
+
+ CommitLog.instance.forceRecycleAllSegments(Collections.singleton(cfm.cfId));
+ }
+
+ public void addType(UserType ut)
+ {
+ KSMetaData ksm = getKSMetaData(ut.keyspace);
+ assert ksm != null;
+
+ logger.info("Loading {}", ut);
+
+ ksm.userTypes.addType(ut);
+
+ MigrationManager.instance.notifyCreateUserType(ut);
+ }
+
+ public void updateType(UserType ut)
+ {
+ KSMetaData ksm = getKSMetaData(ut.keyspace);
+ assert ksm != null;
+
+ logger.info("Updating {}", ut);
+
+ ksm.userTypes.addType(ut);
+
+ MigrationManager.instance.notifyUpdateUserType(ut);
+ }
+
+ public void dropType(UserType ut)
+ {
+ KSMetaData ksm = getKSMetaData(ut.keyspace);
+ assert ksm != null;
+
+ ksm.userTypes.removeType(ut);
+
+ MigrationManager.instance.notifyDropUserType(ut);
+ }
+
+ public void addFunction(UDFunction udf)
+ {
+ logger.info("Loading {}", udf);
+
+ Functions.addOrReplaceFunction(udf);
+
+ MigrationManager.instance.notifyCreateFunction(udf);
+ }
+
+ public void updateFunction(UDFunction udf)
+ {
+ logger.info("Updating {}", udf);
+
+ Functions.addOrReplaceFunction(udf);
+
+ MigrationManager.instance.notifyUpdateFunction(udf);
+ }
+
+ public void dropFunction(UDFunction udf)
+ {
+ logger.info("Drop {}", udf);
+
+ // TODO: this is kind of broken as this remove all overloads of the function name
+ Functions.removeFunction(udf.name(), udf.argTypes());
+
+ MigrationManager.instance.notifyDropFunction(udf);
+ }
+
+ public void addAggregate(UDAggregate udf)
+ {
+ logger.info("Loading {}", udf);
+
+ Functions.addOrReplaceFunction(udf);
+
+ MigrationManager.instance.notifyCreateAggregate(udf);
+ }
+
+ public void updateAggregate(UDAggregate udf)
+ {
+ logger.info("Updating {}", udf);
+
+ Functions.addOrReplaceFunction(udf);
+
+ MigrationManager.instance.notifyUpdateAggregate(udf);
+ }
+
+ public void dropAggregate(UDAggregate udf)
+ {
+ logger.info("Drop {}", udf);
+
+ // TODO: this is kind of broken as this remove all overloads of the function name
+ Functions.removeFunction(udf.name(), udf.argTypes());
+
+ MigrationManager.instance.notifyDropAggregate(udf);
}
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/cda407ae/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/cda407ae/src/java/org/apache/cassandra/db/Keyspace.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/Keyspace.java
index 1d86784,4f59c40..548d2be
--- a/src/java/org/apache/cassandra/db/Keyspace.java
+++ b/src/java/org/apache/cassandra/db/Keyspace.java
@@@ -69,8 -74,8 +69,8 @@@ public class Keyspac
public final OpOrder writeOrder = new OpOrder();
/* ColumnFamilyStore per column family */
- private final ConcurrentMap<UUID, ColumnFamilyStore> columnFamilyStores = new ConcurrentHashMap<UUID, ColumnFamilyStore>();
+ private final ConcurrentMap<UUID, ColumnFamilyStore> columnFamilyStores = new ConcurrentHashMap<>();
+ private volatile KSMetaData metadata;
private volatile AbstractReplicationStrategy replicationStrategy;
public static final Function<String,Keyspace> keyspaceTransformer = new Function<String, Keyspace>()
@@@ -275,19 -280,7 +275,19 @@@
}
}
+ private Keyspace(KSMetaData metadata)
+ {
+ this.metadata = metadata;
+ createReplicationStrategy(metadata);
+ this.metric = new KeyspaceMetrics(this);
+ }
+
+ public static Keyspace mockKS(KSMetaData metadata)
+ {
+ return new Keyspace(metadata);
+ }
+
- public void createReplicationStrategy(KSMetaData ksm)
+ private void createReplicationStrategy(KSMetaData ksm)
{
replicationStrategy = AbstractReplicationStrategy.createReplicationStrategy(ksm.name,
ksm.strategyClass,
http://git-wip-us.apache.org/repos/asf/cassandra/blob/cda407ae/src/java/org/apache/cassandra/db/Mutation.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/cda407ae/test/unit/org/apache/cassandra/db/CommitLogTest.java
----------------------------------------------------------------------
diff --cc test/unit/org/apache/cassandra/db/CommitLogTest.java
index 1ab678f,9a8a1dc..c53d371
--- a/test/unit/org/apache/cassandra/db/CommitLogTest.java
+++ b/test/unit/org/apache/cassandra/db/CommitLogTest.java
@@@ -340,13 -345,13 +340,13 @@@ public class CommitLogTes
}
@Test
- public void testTruncateWithoutSnapshotNonDurable() throws ExecutionException, InterruptedException
+ public void testTruncateWithoutSnapshotNonDurable() throws IOException
{
- CommitLog.instance.resetUnsafe();
+ CommitLog.instance.resetUnsafe(true);
boolean prevAutoSnapshot = DatabaseDescriptor.isAutoSnapshot();
DatabaseDescriptor.setAutoSnapshot(false);
- Keyspace notDurableKs = Keyspace.open("NoCommitlogSpace");
+ Keyspace notDurableKs = Keyspace.open(KEYSPACE2);
- Assert.assertFalse(notDurableKs.metadata.durableWrites);
+ Assert.assertFalse(notDurableKs.getMetadata().durableWrites);
ColumnFamilyStore cfs = notDurableKs.getColumnFamilyStore("Standard1");
CellNameType type = notDurableKs.getColumnFamilyStore("Standard1").getComparator();
Mutation rm;