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)
