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;