Repository: cassandra
Updated Branches:
  refs/heads/trunk 3234c0704 -> af3748909


Improve handling of IR prepare failures

Patch by Blake Eggleston; Reviewed by Marcus Eriksson for CASSANDRA-13672


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/af374890
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/af374890
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/af374890

Branch: refs/heads/trunk
Commit: af37489092ca90bca336538adad02fb5ba859945
Parents: 3234c07
Author: Blake Eggleston <bdeggles...@gmail.com>
Authored: Wed Jul 5 13:28:04 2017 -0700
Committer: Blake Eggleston <bdeggles...@gmail.com>
Committed: Thu Jul 6 10:35:53 2017 -0700

----------------------------------------------------------------------
 CHANGES.txt                                        |  1 +
 .../repair/consistent/CoordinatorSession.java      |  4 ++++
 .../cassandra/repair/consistent/LocalSessions.java | 17 +++++++++++++++--
 .../repair/consistent/PendingAntiCompaction.java   |  4 +++-
 .../repair/consistent/LocalSessionTest.java        |  2 +-
 5 files changed, 24 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/af374890/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 6cd8bc5..9584f63 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 4.0
+ * Improve handling of IR prepare failures (CASSANDRA-13672)
  * Send IR coordinator messages synchronously (CASSANDRA-13673)
  * Flush system.repair table before IR finalize promise (CASSANDRA-13660)
  * Fix column filter creation for wildcard queries (CASSANDRA-13650)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af374890/src/java/org/apache/cassandra/repair/consistent/CoordinatorSession.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/repair/consistent/CoordinatorSession.java 
b/src/java/org/apache/cassandra/repair/consistent/CoordinatorSession.java
index 830ed2c..d0ec7fd 100644
--- a/src/java/org/apache/cassandra/repair/consistent/CoordinatorSession.java
+++ b/src/java/org/apache/cassandra/repair/consistent/CoordinatorSession.java
@@ -240,6 +240,10 @@ public class CoordinatorSession extends ConsistentSession
             }
         }
         setAll(State.FAILED);
+
+        String exceptionMsg = String.format("Incremental repair session %s has 
failed", sessionID);
+        finalizeProposeFuture.setException(new RuntimeException(exceptionMsg));
+        prepareFuture.setException(new RuntimeException(exceptionMsg));
     }
 
     private static String formatDuration(long then, long now)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af374890/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java 
b/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java
index 61df2b0..a25f65c 100644
--- a/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java
+++ b/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java
@@ -568,8 +568,21 @@ public class LocalSessions
 
             public void onFailure(Throwable t)
             {
-                logger.error(String.format("Prepare phase for incremental 
repair session %s failed", sessionID), t);
-                failSession(sessionID);
+                logger.error("Prepare phase for incremental repair session {} 
failed", sessionID, t);
+                if (t instanceof 
PendingAntiCompaction.SSTableAcquisitionException)
+                {
+                    logger.warn("Prepare phase for incremental repair session 
{} was unable to " +
+                                "acquire exclusive access to the neccesary 
sstables. " +
+                                "This is usually caused by running multiple 
incremental repairs on nodes that share token ranges",
+                                sessionID);
+
+                }
+                else
+                {
+                    logger.error("Prepare phase for incremental repair session 
{} failed", sessionID, t);
+                }
+                sendMessage(coordinator, new 
PrepareConsistentResponse(sessionID, getBroadcastAddress(), false));
+                failSession(sessionID, false);
                 executor.shutdown();
             }
         });

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af374890/src/java/org/apache/cassandra/repair/consistent/PendingAntiCompaction.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/repair/consistent/PendingAntiCompaction.java 
b/src/java/org/apache/cassandra/repair/consistent/PendingAntiCompaction.java
index f183d14..e37fb19 100644
--- a/src/java/org/apache/cassandra/repair/consistent/PendingAntiCompaction.java
+++ b/src/java/org/apache/cassandra/repair/consistent/PendingAntiCompaction.java
@@ -76,6 +76,8 @@ public class PendingAntiCompaction
         }
     }
 
+    static class SSTableAcquisitionException extends RuntimeException {}
+
     static class AcquisitionCallable implements Callable<AcquireResult>
     {
         private final ColumnFamilyStore cfs;
@@ -150,7 +152,7 @@ public class PendingAntiCompaction
                         result.abort();
                     }
                 }
-                return Futures.immediateFailedFuture(new 
RuntimeException("unable to acquire sstables"));
+                return Futures.immediateFailedFuture(new 
SSTableAcquisitionException());
             }
             else
             {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/af374890/test/unit/org/apache/cassandra/repair/consistent/LocalSessionTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/repair/consistent/LocalSessionTest.java 
b/test/unit/org/apache/cassandra/repair/consistent/LocalSessionTest.java
index 3b48051..c59462e 100644
--- a/test/unit/org/apache/cassandra/repair/consistent/LocalSessionTest.java
+++ b/test/unit/org/apache/cassandra/repair/consistent/LocalSessionTest.java
@@ -303,7 +303,7 @@ public class LocalSessionTest extends AbstractRepairTest
         Assert.assertEquals(session, sessions.loadUnsafe(sessionID));
 
         // ...and we should have sent a success message back to the coordinator
-        assertMessagesSent(sessions, COORDINATOR, new FailSession(sessionID));
+        assertMessagesSent(sessions, COORDINATOR, new 
PrepareConsistentResponse(sessionID, PARTICIPANT1, false));
 
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to