Author: jbellis
Date: Wed Jan  5 22:30:05 2011
New Revision: 1055668

URL: http://svn.apache.org/viewvc?rev=1055668&view=rev
Log:
revert r1053443

Modified:
    
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/ReadResponseResolver.java

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/ReadResponseResolver.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/ReadResponseResolver.java?rev=1055668&r1=1055667&r2=1055668&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/ReadResponseResolver.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/ReadResponseResolver.java
 Wed Jan  5 22:30:05 2011
@@ -90,7 +90,7 @@ public class ReadResponseResolver implem
                List<ColumnFamily> versions = new ArrayList<ColumnFamily>();
                List<InetAddress> endpoints = new ArrayList<InetAddress>();
 
-        // validate digests against each other; throw immediately on mismatch.
+        // case 1: validate digests against each other; throw immediately on 
mismatch.
         // also, collects data results into versions/endpoints lists.
         //
         // results are cleared as we process them, to avoid unnecessary 
duplication of work
@@ -100,13 +100,20 @@ public class ReadResponseResolver implem
         {
             ReadResponse result = entry.getValue();
             Message message = entry.getKey();
-            ByteBuffer resultDigest = result.isDigestQuery() ? result.digest() 
: ColumnFamily.digest(result.row().cf);
-            if (digest == null)
-                digest = resultDigest;
-            else if (!digest.equals(resultDigest))
-                throw new DigestMismatchException(key, digest, resultDigest);
-
-            if (!result.isDigestQuery())
+            if (result.isDigestQuery())
+            {
+                if (digest == null)
+                {
+                    digest = result.digest();
+                }
+                else
+                {
+                    ByteBuffer digest2 = result.digest();
+                    if (!digest.equals(digest2))
+                        throw new DigestMismatchException(key, digest, 
digest2);
+                }
+            }
+            else
             {
                 versions.add(result.row().cf);
                 endpoints.add(message.getFrom());
@@ -115,8 +122,23 @@ public class ReadResponseResolver implem
             results.remove(message);
         }
 
-        if (logger_.isDebugEnabled())
-            logger_.debug("digests verified");
+               // If there was a digest query compare it with all the data 
digests
+               // If there is a mismatch then throw an exception so that read 
repair can happen.
+        //
+        // It's important to note that we do not compare the digests of 
multiple data responses --
+        // if we are in that situation we know there was a previous mismatch 
and now we're doing a repair,
+        // so our job is now case 2: figure out what the most recent version 
is and update everyone to that version.
+        if (digest != null)
+        {
+            for (ColumnFamily cf : versions)
+            {
+                ByteBuffer digest2 = ColumnFamily.digest(cf);
+                if (!digest.equals(digest2))
+                    throw new DigestMismatchException(key, digest, digest2);
+            }
+            if (logger_.isDebugEnabled())
+                logger_.debug("digests verified");
+        }
 
         ColumnFamily resolved;
         if (versions.size() > 1)


Reply via email to