Trace details of the replication events cancelled When a destination is stopped, show in the replication_log the number of pending and in-flight events cancelled. The whole pending and in-flight cancellation is done through a stateLock critical region, so that the state of the destination object doesn't change in the middle of the operation. Change-Id: Ife2642bd4d1fd0ade627ace01b95bde6a9748d66
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java b/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java index fadc3b0..f2a1902 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java
@@ -225,24 +225,35 @@ public int shutdown() { int cnt = 0; if (pool != null) { - repLog.warn("Cancelling replication events"); + synchronized (stateLock) { + int numPending = pending.size(); + int numInFlight = inFlight.size(); - foreachPushOp( - pending, - push -> { - push.cancel(); - return null; - }); - pending.clear(); - foreachPushOp( - inFlight, - push -> { - push.setCanceledWhileRunning(); - return null; - }); - inFlight.clear(); - cnt = pool.shutdownNow().size(); - pool = null; + if (numPending > 0 || numInFlight > 0) { + repLog.warn( + "Cancelling replication events (pending={}, inFlight={}) for destination {}", + numPending, + numInFlight, + getRemoteConfigName()); + + foreachPushOp( + pending, + push -> { + push.cancel(); + return null; + }); + pending.clear(); + foreachPushOp( + inFlight, + push -> { + push.setCanceledWhileRunning(); + return null; + }); + inFlight.clear(); + } + cnt = pool.shutdownNow().size(); + pool = null; + } } return cnt; }