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 2009/05/07 18:03:32 UTC
svn commit: r772690 - in /incubator/cassandra/trunk:
src/java/org/apache/cassandra/db/ src/java/org/apache/cassandra/utils/
test/unit/org/apache/cassandra/db/
Author: jbellis
Date: Thu May 7 16:03:32 2009
New Revision: 772690
URL: http://svn.apache.org/viewvc?rev=772690&view=rev
Log:
fix CF.digest NPE. patch by jbellis; reviewed by Eric Evans for CASSANDRA-149
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ReadVerbHandler.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Row.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java
incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java?rev=772690&r1=772689&r2=772690&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java Thu May 7 16:03:32 2009
@@ -32,6 +32,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.ArrayUtils;
import org.apache.log4j.Logger;
import org.apache.cassandra.config.DatabaseDescriptor;
@@ -399,10 +400,10 @@
public byte[] digest()
{
Set<IColumn> columns = columns_.getSortedColumns();
- byte[] xorHash = null;
- for(IColumn column : columns)
+ byte[] xorHash = ArrayUtils.EMPTY_BYTE_ARRAY;
+ for(IColumn column : columns)
{
- if(xorHash == null)
+ if(xorHash.length == 0)
{
xorHash = column.digest();
}
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java?rev=772690&r1=772689&r2=772690&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java Thu May 7 16:03:32 2009
@@ -27,6 +27,7 @@
import org.apache.cassandra.net.Message;
import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.service.StorageService;
+import org.apache.commons.lang.ArrayUtils;
/*
@@ -60,11 +61,12 @@
private String table_;
private Row row_;
- private byte[] digest_ = new byte[0];
+ private byte[] digest_ = ArrayUtils.EMPTY_BYTE_ARRAY;
private boolean isDigestQuery_ = false;
public ReadResponse(String table, byte[] digest )
{
+ assert digest != null;
table_ = table;
digest_= digest;
}
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ReadVerbHandler.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ReadVerbHandler.java?rev=772690&r1=772689&r2=772690&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ReadVerbHandler.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ReadVerbHandler.java Thu May 7 16:03:32 2009
@@ -77,7 +77,7 @@
Row row = null;
row = readCommand.getRow(table);
ReadResponse readResponse = null;
- if(readCommand.isDigestQuery())
+ if (readCommand.isDigestQuery())
{
readResponse = new ReadResponse(table.getTableName(), row.digest());
}
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Row.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Row.java?rev=772690&r1=772689&r2=772690&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Row.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Row.java Thu May 7 16:03:32 2009
@@ -178,12 +178,10 @@
}
else
{
- byte[] tmpHash = columnFamilies_.get(cFamily).digest();
- xorHash = FBUtilities.xor(xorHash, tmpHash);
+ xorHash = FBUtilities.xor(xorHash, columnFamilies_.get(cFamily).digest());
}
}
- logger_.info("DIGEST TIME: " + (System.currentTimeMillis() - start)
- + " ms.");
+ logger_.info("DIGEST TIME: " + (System.currentTimeMillis() - start) + " ms.");
return xorHash;
}
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java?rev=772690&r1=772689&r2=772690&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java Thu May 7 16:03:32 2009
@@ -331,8 +331,10 @@
public static byte[] xor(byte[] b1, byte[] b2)
{
- byte[] bLess = null;
- byte[] bMore = null;
+ assert b1 != null;
+ assert b2 != null;
+ byte[] bLess;
+ byte[] bMore;
if(b1.length > b2.length)
{
Modified: incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java?rev=772690&r1=772689&r2=772690&view=diff
==============================================================================
--- incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java (original)
+++ incubator/cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyTest.java Thu May 7 16:03:32 2009
@@ -15,7 +15,8 @@
// TODO test SuperColumns
@Test
- public void testSingleColumn() throws IOException {
+ public void testSingleColumn() throws IOException
+ {
Random random = new Random();
byte[] bytes = new byte[1024];
random.nextBytes(bytes);
@@ -35,11 +36,12 @@
}
@Test
- public void testManyColumns() throws IOException {
+ public void testManyColumns() throws IOException
+ {
ColumnFamily cf;
- TreeMap<String, byte[]> map = new TreeMap<String,byte[]>();
- for ( int i = 100; i < 1000; ++i )
+ TreeMap<String, byte[]> map = new TreeMap<String, byte[]>();
+ for (int i = 100; i < 1000; ++i)
{
map.put(Integer.toString(i), ("Avinash Lakshman is a good man: " + i).getBytes());
}
@@ -47,7 +49,7 @@
// write
cf = new ColumnFamily("Standard1", "Standard");
DataOutputBuffer bufOut = new DataOutputBuffer();
- for (String cName: map.navigableKeySet())
+ for (String cName : map.navigableKeySet())
{
cf.addColumn(cName, map.get(cName), 314);
}
@@ -57,60 +59,70 @@
DataInputBuffer bufIn = new DataInputBuffer();
bufIn.reset(bufOut.getData(), bufOut.getLength());
cf = ColumnFamily.serializer().deserialize(bufIn);
- for (String cName: map.navigableKeySet())
+ for (String cName : map.navigableKeySet())
{
assert Arrays.equals(cf.getColumn(cName).value(), map.get(cName));
}
assert new HashSet<String>(cf.getColumns().keySet()).equals(map.keySet());
}
-
+
+ @Test
+ public void testGetColumnCount()
+ {
+ ColumnFamily cf = new ColumnFamily("Standard1", "Standard");
+ byte val[] = "sample value".getBytes();
+
+ cf.addColumn("col1", val, 1);
+ cf.addColumn("col2", val, 2);
+ cf.addColumn("col1", val, 3);
+
+ assert 2 == cf.getColumnCount();
+ assert 2 == cf.getAllColumns().size();
+ }
+
@Test
- public void testGetColumnCount() {
- ColumnFamily cf = new ColumnFamily("Standard1", "Standard");
- byte val[] = "sample value".getBytes();
-
- cf.addColumn("col1", val, 1);
- cf.addColumn("col2", val, 2);
- cf.addColumn("col1", val, 3);
-
- assert 2 == cf.getColumnCount();
- assert 2 == cf.getAllColumns().size();
- }
-
- @Test
- public void testTimestamp() {
- ColumnFamily cf = new ColumnFamily("Standard1", "Standard");
- byte val1[] = "sample 1".getBytes();
+ public void testTimestamp()
+ {
+ ColumnFamily cf = new ColumnFamily("Standard1", "Standard");
+ byte val1[] = "sample 1".getBytes();
byte val2[] = "sample 2".getBytes();
byte val3[] = "sample 3".getBytes();
- cf.addColumn("col1", val1, 2);
+ cf.addColumn("col1", val1, 2);
cf.addColumn("col1", val2, 2); // same timestamp, new value
cf.addColumn("col1", val3, 1); // older timestamp -- should be ignored
assert Arrays.equals(val2, cf.getColumn("col1").value());
}
-
+
@Test
- public void testMergeAndAdd(){
- ColumnFamily cf_new = new ColumnFamily("Standard1", "Standard");
- ColumnFamily cf_old = new ColumnFamily("Standard1", "Standard");
- ColumnFamily cf_result = new ColumnFamily("Standard1", "Standard");
- byte val[] = "sample value".getBytes();
- byte val2[] = "x value ".getBytes();
-
- cf_new.addColumn("col1", val, 3);
- cf_new.addColumn("col2", val, 4);
-
- cf_old.addColumn("col2", val2, 1);
- cf_old.addColumn("col3", val2, 2);
-
- cf_result.addColumns(cf_new);
- cf_result.addColumns(cf_old);
-
- assert 3 == cf_result.getColumnCount() : "Count is " + cf_new.getColumnCount();
- //addcolumns will only add if timestamp >= old timestamp
+ public void testMergeAndAdd()
+ {
+ ColumnFamily cf_new = new ColumnFamily("Standard1", "Standard");
+ ColumnFamily cf_old = new ColumnFamily("Standard1", "Standard");
+ ColumnFamily cf_result = new ColumnFamily("Standard1", "Standard");
+ byte val[] = "sample value".getBytes();
+ byte val2[] = "x value ".getBytes();
+
+ cf_new.addColumn("col1", val, 3);
+ cf_new.addColumn("col2", val, 4);
+
+ cf_old.addColumn("col2", val2, 1);
+ cf_old.addColumn("col3", val2, 2);
+
+ cf_result.addColumns(cf_new);
+ cf_result.addColumns(cf_old);
+
+ assert 3 == cf_result.getColumnCount() : "Count is " + cf_new.getColumnCount();
+ //addcolumns will only add if timestamp >= old timestamp
assert Arrays.equals(val, cf_result.getColumn("col2").value());
}
+
+ @Test
+ public void testEmptyDigest()
+ {
+ ColumnFamily cf = new ColumnFamily("Standard1", "Standard");
+ assert cf.digest().length == 0;
+ }
}