From 4b32e910ddc1d405180b95dbdb53c03899341bfc Mon Sep 17 00:00:00 2001 From: DongWang Date: Wed, 8 Jan 2020 15:08:29 +0800 Subject: [PATCH] [CASSANDRA-15437] Decommission fails with "Unable to stream hints since no live endpoints seen" even if no hints need to be sent. --- .../apache/cassandra/hints/HintsService.java | 6 ++++- .../cassandra/service/StorageService.java | 22 +++++++++++++------ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/java/org/apache/cassandra/hints/HintsService.java b/src/java/org/apache/cassandra/hints/HintsService.java index 1fd2d1a632ff..f78027db171b 100644 --- a/src/java/org/apache/cassandra/hints/HintsService.java +++ b/src/java/org/apache/cassandra/hints/HintsService.java @@ -393,4 +393,8 @@ public boolean isShutDown() { return isShutDown; } -} + + public boolean hasHints() + { + return catalog.hasFiles(); + }} diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 13cca3d38a86..45691b040694 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -4224,7 +4224,6 @@ private void unbootstrap(Runnable onFinish) throws ExecutionException, Interrupt // Start with BatchLog replay, which may create hints but no writes since this is no longer a valid endpoint. Future batchlogReplay = BatchlogManager.instance.startBatchlogReplay(); - Future streamSuccess = streamRanges(rangesToStream); // Wait for batch log to complete before streaming hints. logger.debug("waiting for batch log processing."); @@ -4232,13 +4231,22 @@ private void unbootstrap(Runnable onFinish) throws ExecutionException, Interrupt setMode(Mode.LEAVING, "streaming hints to other nodes", true); - Future hintsSuccess = streamHints(); + if(HintsService.instance.hasHints()) + { + Future streamSuccess = streamRanges(rangesToStream); + Future hintsSuccess = streamHints(); - // wait for the transfer runnables to signal the latch. - logger.debug("waiting for stream acks."); - streamSuccess.get(); - hintsSuccess.get(); - logger.debug("stream acks all received."); + // wait for the transfer runnables to signal the latch. + logger.debug("waiting for stream acks."); + streamSuccess.get(); + hintsSuccess.get(); + logger.debug("stream acks all received."); + } + else + { + logger.debug("no hints on the node."); + } + leaveRing(); onFinish.run(); }