You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2015/08/13 17:37:00 UTC
cassandra git commit: add calculation for arrayOffset() and
position(),
or asserts that the offset is 0 reviewed by Stefania for CASSANDRA-9241
Repository: cassandra
Updated Branches:
refs/heads/trunk 767798956 -> 1db386e46
add calculation for arrayOffset() and position(), or asserts that the offset is 0
reviewed by Stefania for CASSANDRA-9241
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/1db386e4
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/1db386e4
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/1db386e4
Branch: refs/heads/trunk
Commit: 1db386e46e451250b2375060f92093f670091c02
Parents: 7677989
Author: Ariel Weisberg <ar...@weisberg.ws>
Authored: Wed May 6 16:50:47 2015 -0400
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Thu Aug 13 10:35:59 2015 -0500
----------------------------------------------------------------------
.../org/apache/cassandra/db/ColumnFamilyStore.java | 10 ++++++----
.../org/apache/cassandra/db/RangeTombstoneList.java | 1 -
src/java/org/apache/cassandra/gms/TokenSerializer.java | 8 ++++----
.../cassandra/io/util/DataIntegrityMetadata.java | 1 +
.../org/apache/cassandra/io/util/DataOutputBuffer.java | 1 +
.../apache/cassandra/serializers/TypeSerializer.java | 6 ++++++
.../org/apache/cassandra/utils/ByteBufferUtil.java | 9 ++++++++-
src/java/org/apache/cassandra/utils/Hex.java | 13 +++++++++----
8 files changed, 35 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1db386e4/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 797e2c7..7e1a18f 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -1476,12 +1476,14 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
TabularDataSupport result = new TabularDataSupport(COUNTER_TYPE);
for (Counter<ByteBuffer> counter : samplerResults.topK)
{
- byte[] key = counter.getItem().array();
+ //Not duplicating the buffer for safety because AbstractSerializer and ByteBufferUtil.bytesToHex
+ //don't modify position or limit
+ ByteBuffer key = counter.getItem();
result.put(new CompositeDataSupport(COUNTER_COMPOSITE_TYPE, COUNTER_NAMES, new Object[] {
- Hex.bytesToHex(key), // raw
+ ByteBufferUtil.bytesToHex(key), // raw
counter.getCount(), // count
counter.getError(), // error
- metadata.getKeyValidator().getString(ByteBuffer.wrap(key)) })); // string
+ metadata.getKeyValidator().getString(key) })); // string
}
return new CompositeDataSupport(SAMPLING_RESULT, SAMPLER_NAMES, new Object[]{
samplerResults.cardinality, result});
@@ -1561,7 +1563,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
{
if (!manifestFile.getParentFile().exists())
manifestFile.getParentFile().mkdirs();
-
+
try (PrintStream out = new PrintStream(manifestFile))
{
final JSONObject manifestJSON = new JSONObject();
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1db386e4/src/java/org/apache/cassandra/db/RangeTombstoneList.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/RangeTombstoneList.java b/src/java/org/apache/cassandra/db/RangeTombstoneList.java
index c92a296..841e6de 100644
--- a/src/java/org/apache/cassandra/db/RangeTombstoneList.java
+++ b/src/java/org/apache/cassandra/db/RangeTombstoneList.java
@@ -459,7 +459,6 @@ public class RangeTombstoneList implements Iterable<RangeTombstone>, IMeasurable
{
if (idx < 0 || idx < finish)
return endOfData();
-
// We want to make sure the range are stricly included within the queried slice as this
// make it easier to combine things when iterator over successive slices. This means that
// for the first and last range we might have to "cut" the range returned.
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1db386e4/src/java/org/apache/cassandra/gms/TokenSerializer.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/gms/TokenSerializer.java b/src/java/org/apache/cassandra/gms/TokenSerializer.java
index 1404258..da4ee7d 100644
--- a/src/java/org/apache/cassandra/gms/TokenSerializer.java
+++ b/src/java/org/apache/cassandra/gms/TokenSerializer.java
@@ -19,7 +19,7 @@ package org.apache.cassandra.gms;
import org.apache.cassandra.dht.IPartitioner;
import org.apache.cassandra.dht.Token;
-
+import org.apache.cassandra.utils.ByteBufferUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -37,9 +37,9 @@ public class TokenSerializer
{
for (Token token : tokens)
{
- byte[] bintoken = partitioner.getTokenFactory().toByteArray(token).array();
- out.writeInt(bintoken.length);
- out.write(bintoken);
+ ByteBuffer tokenBuffer = partitioner.getTokenFactory().toByteArray(token);
+ assert tokenBuffer.arrayOffset() == 0;
+ ByteBufferUtil.writeWithLength(tokenBuffer.array(), out);
}
out.writeInt(0);
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1db386e4/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java b/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java
index 70cd860..ab750c8 100644
--- a/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java
+++ b/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java
@@ -198,6 +198,7 @@ public class DataIntegrityMetadata
{
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
byteBuffer.putInt(incrementalChecksumValue);
+ assert byteBuffer.arrayOffset() == 0;
fullChecksum.update(byteBuffer.array(), 0, byteBuffer.array().length);
}
incrementalChecksum.reset();
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1db386e4/src/java/org/apache/cassandra/io/util/DataOutputBuffer.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/util/DataOutputBuffer.java b/src/java/org/apache/cassandra/io/util/DataOutputBuffer.java
index d9a290e..af85c58 100644
--- a/src/java/org/apache/cassandra/io/util/DataOutputBuffer.java
+++ b/src/java/org/apache/cassandra/io/util/DataOutputBuffer.java
@@ -106,6 +106,7 @@ public class DataOutputBuffer extends BufferedDataOutputStreamPlus
public byte[] getData()
{
+ assert buffer.arrayOffset() == 0;
return buffer.array();
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1db386e4/src/java/org/apache/cassandra/serializers/TypeSerializer.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/serializers/TypeSerializer.java b/src/java/org/apache/cassandra/serializers/TypeSerializer.java
index cddef08..9501397 100644
--- a/src/java/org/apache/cassandra/serializers/TypeSerializer.java
+++ b/src/java/org/apache/cassandra/serializers/TypeSerializer.java
@@ -23,11 +23,17 @@ import java.nio.ByteBuffer;
public interface TypeSerializer<T>
{
public ByteBuffer serialize(T value);
+
+ /*
+ * Does not modify the position or limit of the buffer even temporarily.
+ */
public T deserialize(ByteBuffer bytes);
/*
* Validate that the byte array is a valid sequence for the type this represents.
* This guarantees deserialize() can be called without errors.
+ *
+ * Does not modify the position or limit of the buffer even temporarily
*/
public void validate(ByteBuffer bytes) throws MarshalException;
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1db386e4/src/java/org/apache/cassandra/utils/ByteBufferUtil.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/ByteBufferUtil.java b/src/java/org/apache/cassandra/utils/ByteBufferUtil.java
index abc2a37..505522f 100644
--- a/src/java/org/apache/cassandra/utils/ByteBufferUtil.java
+++ b/src/java/org/apache/cassandra/utils/ByteBufferUtil.java
@@ -162,7 +162,6 @@ public class ByteBufferUtil
public static byte[] getArray(ByteBuffer buffer)
{
int length = buffer.remaining();
-
if (buffer.hasArray())
{
int boff = buffer.arrayOffset() + buffer.position();
@@ -511,8 +510,16 @@ public class ByteBufferUtil
};
}
+ /*
+ * Does not modify position or limit of buffer even temporarily
+ * so this is safe even without duplication.
+ */
public static String bytesToHex(ByteBuffer bytes)
{
+ if (bytes.hasArray()) {
+ return Hex.bytesToHex(bytes.array(), bytes.arrayOffset() + bytes.position(), bytes.remaining());
+ }
+
final int offset = bytes.position();
final int size = bytes.remaining();
final char[] c = new char[size * 2];
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1db386e4/src/java/org/apache/cassandra/utils/Hex.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/Hex.java b/src/java/org/apache/cassandra/utils/Hex.java
index 0883c34..c4b4586 100644
--- a/src/java/org/apache/cassandra/utils/Hex.java
+++ b/src/java/org/apache/cassandra/utils/Hex.java
@@ -70,10 +70,15 @@ public class Hex
public static String bytesToHex(byte... bytes)
{
- char[] c = new char[bytes.length * 2];
- for (int i = 0; i < bytes.length; i++)
+ return bytesToHex(bytes, 0, bytes.length);
+ }
+
+ public static String bytesToHex(byte bytes[], int offset, int length)
+ {
+ char[] c = new char[length * 2];
+ for (int i = 0; i < length; i++)
{
- int bint = bytes[i];
+ int bint = bytes[i + offset];
c[i * 2] = byteToChar[(bint & 0xf0) >> 4];
c[1 + i * 2] = byteToChar[bint & 0x0f];
}
@@ -96,7 +101,7 @@ public class Hex
try
{
s = stringConstructor.newInstance(0, c.length, c);
- }
+ }
catch (InvocationTargetException ite) {
// The underlying constructor failed. Unwrapping the exception.
Throwable cause = ite.getCause();