Use byte to serialize MT hash length

patch by Bharatendra Boddu; reviewed by yukim for CASSANDRA-9792


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

Branch: refs/heads/trunk
Commit: 90e0013126e4875d696891c67d1b22fdb2b8ba7a
Parents: bd7d119
Author: Bharatendra Boddu <[email protected]>
Authored: Wed Aug 5 15:30:00 2015 -0500
Committer: Yuki Morishita <[email protected]>
Committed: Wed Aug 5 15:41:30 2015 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../org/apache/cassandra/utils/MerkleTree.java  | 56 +++++++++++++-------
 2 files changed, 39 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/90e00131/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index e1f1757..2a5be78 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -2,6 +2,7 @@
  * Disable scripted UDFs by default (CASSANDRA-9889)
  * Add transparent data encryption core classes (CASSANDRA-9945)
  * Bytecode inspection for Java-UDFs (CASSANDRA-9890)
+ * Use byte to serialize MT hash length (CASSANDRA-9792)
 Merged from 2.2:
  * Log warning when using an aggregate without partition key (CASSANDRA-9737)
 Merged from 2.1:

http://git-wip-us.apache.org/repos/asf/cassandra/blob/90e00131/src/java/org/apache/cassandra/utils/MerkleTree.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/MerkleTree.java 
b/src/java/org/apache/cassandra/utils/MerkleTree.java
index 3840622..b4a782d 100644
--- a/src/java/org/apache/cassandra/utils/MerkleTree.java
+++ b/src/java/org/apache/cassandra/utils/MerkleTree.java
@@ -35,6 +35,7 @@ import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.net.MessagingService;
 
 /**
  * A MerkleTree implemented as a binary tree.
@@ -817,12 +818,15 @@ public class MerkleTree implements Serializable
         {
             public void serialize(Inner inner, DataOutputPlus out, int 
version) throws IOException
             {
-                if (inner.hash == null)
-                    out.writeInt(-1);
-                else
+                if (version < MessagingService.VERSION_30)
                 {
-                    out.writeInt(inner.hash.length);
-                    out.write(inner.hash);
+                    if (inner.hash == null)
+                        out.writeInt(-1);
+                    else
+                    {
+                        out.writeInt(inner.hash.length);
+                        out.write(inner.hash);
+                    }
                 }
                 Token.serializer.serialize(inner.token, out, version);
                 Hashable.serializer.serialize(inner.lchild, out, version);
@@ -831,10 +835,13 @@ public class MerkleTree implements Serializable
 
             public Inner deserialize(DataInput in, IPartitioner p, int 
version) throws IOException
             {
-                int hashLen = in.readInt();
-                byte[] hash = hashLen >= 0 ? new byte[hashLen] : null;
-                if (hash != null)
-                    in.readFully(hash);
+                if (version < MessagingService.VERSION_30)
+                {
+                    int hashLen = in.readInt();
+                    byte[] hash = hashLen >= 0 ? new byte[hashLen] : null;
+                    if (hash != null)
+                        in.readFully(hash);
+                }
                 Token token = Token.serializer.deserialize(in, p, version);
                 Hashable lchild = Hashable.serializer.deserialize(in, p, 
version);
                 Hashable rchild = Hashable.serializer.deserialize(in, p, 
version);
@@ -843,9 +850,13 @@ public class MerkleTree implements Serializable
 
             public long serializedSize(Inner inner, int version)
             {
-                int size = inner.hash == null
-                ? TypeSizes.sizeof(-1)
-                        : TypeSizes.sizeof(inner.hash().length) + 
inner.hash().length;
+                long size = 0;
+                if (version < MessagingService.VERSION_30)
+                {
+                    size += inner.hash == null
+                                       ? TypeSizes.sizeof(-1)
+                                       : TypeSizes.sizeof(inner.hash().length) 
+ inner.hash().length;
+                }
 
                 size += Token.serializer.serializedSize(inner.token, version)
                 + Hashable.serializer.serializedSize(inner.lchild, version)
@@ -900,18 +911,24 @@ public class MerkleTree implements Serializable
             {
                 if (leaf.hash == null)
                 {
-                    out.writeInt(-1);
+                    if (version < MessagingService.VERSION_30)
+                        out.writeInt(-1);
+                    else
+                        out.writeByte(-1);
                 }
                 else
                 {
-                    out.writeInt(leaf.hash.length);
+                    if (version < MessagingService.VERSION_30)
+                        out.writeInt(leaf.hash.length);
+                    else
+                        out.writeByte(leaf.hash.length);
                     out.write(leaf.hash);
                 }
             }
 
             public Leaf deserialize(DataInput in, IPartitioner p, int version) 
throws IOException
             {
-                int hashLen = in.readInt();
+                int hashLen = version < MessagingService.VERSION_30 ? 
in.readInt() : in.readByte();
                 byte[] hash = hashLen < 0 ? null : new byte[hashLen];
                 if (hash != null)
                     in.readFully(hash);
@@ -920,9 +937,12 @@ public class MerkleTree implements Serializable
 
             public long serializedSize(Leaf leaf, int version)
             {
-                return leaf.hash == null
-                     ? TypeSizes.sizeof(-1)
-                     : TypeSizes.sizeof(leaf.hash().length) + 
leaf.hash().length;
+                long size = version < MessagingService.VERSION_30 ? 
TypeSizes.sizeof(1) : 1;
+                if (leaf.hash != null)
+                {
+                    size += leaf.hash().length;
+                }
+                return size;
             }
         }
     }

Reply via email to