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;
+    }
 }