Updated Branches:
  refs/heads/trunk 5b6a2b11b -> 0525ae25f

log related to Murmur3Partitioner
patch by vijay; reviewed by Pavel Yaskevich for CASSANDRA-4282


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/0525ae25
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/0525ae25
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/0525ae25

Branch: refs/heads/trunk
Commit: 0525ae25f82ea132727b395da973b06fd1733011
Parents: 5b6a2b1
Author: Vijay Parthasarathy <[email protected]>
Authored: Wed Aug 29 18:02:57 2012 -0700
Committer: Vijay Parthasarathy <[email protected]>
Committed: Wed Aug 29 18:02:57 2012 -0700

----------------------------------------------------------------------
 .../cassandra/config/DatabaseDescriptor.java       |    7 +++++
 .../org/apache/cassandra/gms/GossipDigestSyn.java  |   18 ++++++++++++--
 .../cassandra/gms/GossipDigestSynVerbHandler.java  |    6 +++++
 src/java/org/apache/cassandra/gms/Gossiper.java    |    4 ++-
 .../apache/cassandra/io/sstable/SSTableReader.java |    9 +++++--
 test/data/serialization/1.2/gms.Gossip.bin         |  Bin 109 -> 158 bytes
 .../apache/cassandra/gms/SerializationsTest.java   |    2 +-
 7 files changed, 38 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/0525ae25/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java 
b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index 2e22e95..7533214 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -71,6 +71,7 @@ public class DatabaseDescriptor
 
     /* Hashing strategy Random or OPHF */
     private static IPartitioner<?> partitioner;
+    private static String paritionerName;
 
     private static Config.DiskAccessMode indexAccessMode;
 
@@ -224,6 +225,7 @@ public class DatabaseDescriptor
             {
                 throw new ConfigurationException("Invalid partitioner class " 
+ conf.partitioner);
             }
+            paritionerName = partitioner.getClass().getCanonicalName();
 
             /* phi convict threshold for FailureDetector */
             if (conf.phi_convict_threshold < 5 || conf.phi_convict_threshold > 
16)
@@ -642,6 +644,11 @@ public class DatabaseDescriptor
         return partitioner;
     }
 
+    public static String getPartitionerName()
+    {
+        return paritionerName;
+    }
+
     /* For tests ONLY, don't use otherwise or all hell will break loose */
     public static void setPartitioner(IPartitioner<?> newPartitioner)
     {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0525ae25/src/java/org/apache/cassandra/gms/GossipDigestSyn.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/gms/GossipDigestSyn.java 
b/src/java/org/apache/cassandra/gms/GossipDigestSyn.java
index 8ce2257..24979f1 100644
--- a/src/java/org/apache/cassandra/gms/GossipDigestSyn.java
+++ b/src/java/org/apache/cassandra/gms/GossipDigestSyn.java
@@ -23,6 +23,7 @@ import java.util.List;
 
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.net.MessagingService;
 
 /**
  * This is the first message that gets sent out as a start of the Gossip 
protocol in a
@@ -33,11 +34,13 @@ public class GossipDigestSyn
     public static final IVersionedSerializer<GossipDigestSyn> serializer = new 
GossipDigestSynSerializer();
 
     final String clusterId;
+    final String partioner;
     final List<GossipDigest> gDigests;
 
-    public GossipDigestSyn(String clusterId, List<GossipDigest> gDigests)
+    public GossipDigestSyn(String clusterId, String partioner, 
List<GossipDigest> gDigests)
     {
         this.clusterId = clusterId;
+        this.partioner = partioner;
         this.gDigests = gDigests;
     }
 
@@ -79,19 +82,28 @@ class GossipDigestSynSerializer implements 
IVersionedSerializer<GossipDigestSyn>
     public void serialize(GossipDigestSyn gDigestSynMessage, DataOutput dos, 
int version) throws IOException
     {
         dos.writeUTF(gDigestSynMessage.clusterId);
+        if (version >= MessagingService.VERSION_12)
+            dos.writeUTF(gDigestSynMessage.partioner);
         GossipDigestSerializationHelper.serialize(gDigestSynMessage.gDigests, 
dos, version);
     }
 
     public GossipDigestSyn deserialize(DataInput dis, int version) throws 
IOException
     {
         String clusterId = dis.readUTF();
+        String partioner = null;
+        if (version >= MessagingService.VERSION_12)
+            partioner = dis.readUTF();
         List<GossipDigest> gDigests = 
GossipDigestSerializationHelper.deserialize(dis, version);
-        return new GossipDigestSyn(clusterId, gDigests);
+        return new GossipDigestSyn(clusterId, partioner, gDigests);
     }
 
     public long serializedSize(GossipDigestSyn syn, int version)
     {
-        return TypeSizes.NATIVE.sizeof(syn.clusterId) + 
GossipDigestSerializationHelper.serializedSize(syn.gDigests, version);
+        long size = TypeSizes.NATIVE.sizeof(syn.clusterId);
+        if (version >= MessagingService.VERSION_12)
+            size += TypeSizes.NATIVE.sizeof(syn.partioner);
+        size += GossipDigestSerializationHelper.serializedSize(syn.gDigests, 
version);
+        return size;
     }
 }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0525ae25/src/java/org/apache/cassandra/gms/GossipDigestSynVerbHandler.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/gms/GossipDigestSynVerbHandler.java 
b/src/java/org/apache/cassandra/gms/GossipDigestSynVerbHandler.java
index 81dd4a5..741b769 100644
--- a/src/java/org/apache/cassandra/gms/GossipDigestSynVerbHandler.java
+++ b/src/java/org/apache/cassandra/gms/GossipDigestSynVerbHandler.java
@@ -53,6 +53,12 @@ public class GossipDigestSynVerbHandler implements 
IVerbHandler<GossipDigestSyn>
             return;
         }
 
+        if (gDigestMessage.partioner != null && 
!gDigestMessage.partioner.equals(DatabaseDescriptor.getPartitionerName()))
+        {
+            logger.warn("Partitioner mismatch from " + from + " " + 
gDigestMessage.partioner  + "!=" + DatabaseDescriptor.getPartitionerName());
+            return;
+        }
+
         List<GossipDigest> gDigestList = gDigestMessage.getGossipDigests();
         if (logger.isTraceEnabled())
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0525ae25/src/java/org/apache/cassandra/gms/Gossiper.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java 
b/src/java/org/apache/cassandra/gms/Gossiper.java
index 369715f..a771197 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -118,7 +118,9 @@ public class Gossiper implements 
IFailureDetectionEventListener, GossiperMBean
 
                 if ( gDigests.size() > 0 )
                 {
-                    GossipDigestSyn digestSynMessage = new 
GossipDigestSyn(DatabaseDescriptor.getClusterName(), gDigests);
+                    GossipDigestSyn digestSynMessage = new 
GossipDigestSyn(DatabaseDescriptor.getClusterName(),
+                                                                           
DatabaseDescriptor.getPartitionerName(),
+                                                                           
gDigests);
                     MessageOut<GossipDigestSyn> message = new 
MessageOut<GossipDigestSyn>(MessagingService.Verb.GOSSIP_DIGEST_SYN,
                                                                                
                         digestSynMessage,
                                                                                
                         GossipDigestSyn.serializer);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0525ae25/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java 
b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
index 0eb4b06..b1c5493 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
@@ -169,10 +169,13 @@ public class SSTableReader extends SSTable
         // Check if sstable is created using same partitioner.
         // Partitioner can be null, which indicates older version of sstable 
or no stats available.
         // In that case, we skip the check.
-        String partitionerName = partitioner.getClass().getCanonicalName();
+        String partitionerName = DatabaseDescriptor.getPartitionerName();
         if (sstableMetadata.partitioner != null && 
!partitionerName.equals(sstableMetadata.partitioner))
-            throw new RuntimeException(String.format("Cannot open %s because 
partitioner does not match %s",
-                                                     descriptor, 
partitionerName));
+        {
+            logger.warn("Changing paritioner on a existing cluster can cause 
data loose, Please verify your partitioner in cassandra.yaml");
+            logger.error(String.format("Cannot open %s because partitioner 
does not match %s != %s",descriptor, sstableMetadata.partitioner, 
partitionerName));
+            System.exit(1);
+        }
 
         SSTableReader sstable = new SSTableReader(descriptor,
                                                   components,

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0525ae25/test/data/serialization/1.2/gms.Gossip.bin
----------------------------------------------------------------------
diff --git a/test/data/serialization/1.2/gms.Gossip.bin 
b/test/data/serialization/1.2/gms.Gossip.bin
index 68b0c8f..af5ac57 100644
Binary files a/test/data/serialization/1.2/gms.Gossip.bin and 
b/test/data/serialization/1.2/gms.Gossip.bin differ

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0525ae25/test/unit/org/apache/cassandra/gms/SerializationsTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/gms/SerializationsTest.java 
b/test/unit/org/apache/cassandra/gms/SerializationsTest.java
index 4267d72..b14608f 100644
--- a/test/unit/org/apache/cassandra/gms/SerializationsTest.java
+++ b/test/unit/org/apache/cassandra/gms/SerializationsTest.java
@@ -74,7 +74,7 @@ public class SerializationsTest extends 
AbstractSerializationsTester
         states.put(InetAddress.getByName("127.0.0.2"), Statics.EndpointSt);
         GossipDigestAck ack = new GossipDigestAck(Statics.Digests, states);
         GossipDigestAck2 ack2 = new GossipDigestAck2(states);
-        GossipDigestSyn syn = new GossipDigestSyn("Not a real cluster name", 
Statics.Digests);
+        GossipDigestSyn syn = new GossipDigestSyn("Not a real cluster name", 
StorageService.getPartitioner().getClass().getCanonicalName(), Statics.Digests);
 
         DataOutputStream out = getOutput("gms.Gossip.bin");
         for (GossipDigest gd : Statics.Digests)

Reply via email to