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 2011/01/05 23:30:05 UTC
svn commit: r1055668 -
/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/ReadResponseResolver.java
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)