From 15a0f2b20771bfe21c7539c709cdb30032e652ab Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Wed, 20 Apr 2011 18:14:54 +0000 Subject: [PATCH] fixes for verifying destinationavailability under hinted conditions patch by Narendra Sharma and jbellis for CASSANDRA-2514 git-svn-id: https://svn.apache.org/repos/asf/cassandra/branches/cassandra-0.7@1095473 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES.txt | 2 ++ .../service/DatacenterSyncWriteResponseHandler.java | 10 ++++++---- .../service/DatacenterWriteResponseHandler.java | 4 ++-- .../apache/cassandra/service/WriteResponseHandler.java | 1 + 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 2f34a1589f..ecd61467d1 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -34,6 +34,8 @@ * fix backslash substitutions in CLI (CASSANDRA-2492) * count a row deletion as one operation towards memtable threshold (CASSANDRA-2519) + * fixes for verifying destination availability under hinted conditions + so UE can be thrown intead of timing out (CASSANDRA-2514) 0.7.4 diff --git a/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java b/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java index 9e422585e4..c0387463d6 100644 --- a/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java +++ b/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java @@ -102,10 +102,12 @@ public class DatacenterSyncWriteResponseHandler extends AbstractWriteResponseHan dcEndpoints.put(dc, new AtomicInteger()); for (InetAddress destination : hintedEndpoints.keySet()) { - assert writeEndpoints.contains(destination); - // figure out the destination dc - String destinationDC = snitch.getDatacenter(destination); - dcEndpoints.get(destinationDC).incrementAndGet(); + if (writeEndpoints.contains(destination)) + { + // figure out the destination dc + String destinationDC = snitch.getDatacenter(destination); + dcEndpoints.get(destinationDC).incrementAndGet(); + } } // Throw exception if any of the DC doesn't have livenodes to accept write. diff --git a/src/java/org/apache/cassandra/service/DatacenterWriteResponseHandler.java b/src/java/org/apache/cassandra/service/DatacenterWriteResponseHandler.java index d9ac37fad5..990c59d4f9 100644 --- a/src/java/org/apache/cassandra/service/DatacenterWriteResponseHandler.java +++ b/src/java/org/apache/cassandra/service/DatacenterWriteResponseHandler.java @@ -84,9 +84,9 @@ public class DatacenterWriteResponseHandler extends WriteResponseHandler public void assureSufficientLiveNodes() throws UnavailableException { int liveNodes = 0; - for (InetAddress destination : writeEndpoints) + for (InetAddress destination : hintedEndpoints.keySet()) { - if (localdc.equals(snitch.getDatacenter(destination))) + if (localdc.equals(snitch.getDatacenter(destination)) && writeEndpoints.contains(destination)) liveNodes++; } diff --git a/src/java/org/apache/cassandra/service/WriteResponseHandler.java b/src/java/org/apache/cassandra/service/WriteResponseHandler.java index cf8be4cbe5..ff6fb34969 100644 --- a/src/java/org/apache/cassandra/service/WriteResponseHandler.java +++ b/src/java/org/apache/cassandra/service/WriteResponseHandler.java @@ -100,6 +100,7 @@ public class WriteResponseHandler extends AbstractWriteResponseHandler // ensure there are blockFor distinct living nodes (hints are ok). if (hintedEndpoints.keySet().size() < responses.get()) throw new UnavailableException(); + return; } // count destinations that are part of the desired target set