CEP-15 (C*) When a host replacement happens don't loose the peer mapping right away (#60)


patch by David Capwell; reviewed by Blake Eggleston for CASSANDRA-18764
diff --git a/accord-core/src/main/java/accord/api/ConfigurationService.java b/accord-core/src/main/java/accord/api/ConfigurationService.java
index 4e6943f..6ad9f20 100644
--- a/accord-core/src/main/java/accord/api/ConfigurationService.java
+++ b/accord-core/src/main/java/accord/api/ConfigurationService.java
@@ -173,7 +173,7 @@
      * On invocation the system is not necessarily ready to process the epoch, and the BootstrapReady parameter
      * provides indications of when the bootstrap has completed various phases of setup.
      */
-    void acknowledgeEpoch(EpochReady ready);
+    void acknowledgeEpoch(EpochReady ready, boolean startSync);
 
     void reportEpochClosed(Ranges ranges, long epoch);
 
diff --git a/accord-core/src/main/java/accord/impl/AbstractConfigurationService.java b/accord-core/src/main/java/accord/impl/AbstractConfigurationService.java
index 7132f8d..d8ebab8 100644
--- a/accord-core/src/main/java/accord/impl/AbstractConfigurationService.java
+++ b/accord-core/src/main/java/accord/impl/AbstractConfigurationService.java
@@ -233,10 +233,10 @@
         fetchTopologyInternal(epoch);
     }
 
-    protected abstract void localSyncComplete(Topology topology);
+    protected abstract void localSyncComplete(Topology topology, boolean startSync);
 
     @Override
-    public void acknowledgeEpoch(EpochReady ready)
+    public void acknowledgeEpoch(EpochReady ready, boolean startSync)
     {
         ready.metadata.addCallback(() -> {
             synchronized (AbstractConfigurationService.this)
@@ -247,7 +247,7 @@
         ready.coordination.addCallback(() ->  {
             synchronized (AbstractConfigurationService.this)
             {
-                localSyncComplete(epochs.getOrCreate(ready.epoch).topology);
+                localSyncComplete(epochs.getOrCreate(ready.epoch).topology, startSync);
             }
         });
     }
diff --git a/accord-core/src/main/java/accord/local/Node.java b/accord-core/src/main/java/accord/local/Node.java
index 48bf5f5..7cf84df 100644
--- a/accord-core/src/main/java/accord/local/Node.java
+++ b/accord-core/src/main/java/accord/local/Node.java
@@ -209,7 +209,7 @@
             return AsyncResults.success(null);
         EpochReady ready = onTopologyUpdateInternal(topology, startSync);
         ready.coordination.addCallback(() -> this.topology.onEpochSyncComplete(id, topology.epoch()));
-        configService.acknowledgeEpoch(ready);
+        configService.acknowledgeEpoch(ready, startSync);
         return ready.coordination;
     }
 
diff --git a/accord-core/src/main/java/accord/utils/async/AsyncResults.java b/accord-core/src/main/java/accord/utils/async/AsyncResults.java
index 98e5ccf..dfa7fe0 100644
--- a/accord-core/src/main/java/accord/utils/async/AsyncResults.java
+++ b/accord-core/src/main/java/accord/utils/async/AsyncResults.java
@@ -201,6 +201,12 @@
                 throw new IllegalStateException("Result succeeded");
             return result.failure;
         }
+
+        @Override
+        public String toString()
+        {
+            return getClass().getSimpleName() + "{status=" + (isDone() ? isSuccess() ? "success" : "failure" : "pending") + "}";
+        }
     }
 
     static class Chain<V> extends AbstractResult<V>
diff --git a/accord-core/src/test/java/accord/burn/BurnTestConfigurationService.java b/accord-core/src/test/java/accord/burn/BurnTestConfigurationService.java
index b872a17..4c9ce6c 100644
--- a/accord-core/src/test/java/accord/burn/BurnTestConfigurationService.java
+++ b/accord-core/src/test/java/accord/burn/BurnTestConfigurationService.java
@@ -158,7 +158,7 @@
     }
 
     @Override
-    protected void localSyncComplete(Topology topology)
+    protected void localSyncComplete(Topology topology, boolean startSync)
     {
         topologyUpdates.syncComplete(lookup.apply(localId), topology.nodes(), topology.epoch());
     }
diff --git a/accord-core/src/test/java/accord/impl/AbstractConfigurationServiceTest.java b/accord-core/src/test/java/accord/impl/AbstractConfigurationServiceTest.java
index b17fa3b..f4829f0 100644
--- a/accord-core/src/test/java/accord/impl/AbstractConfigurationServiceTest.java
+++ b/accord-core/src/test/java/accord/impl/AbstractConfigurationServiceTest.java
@@ -66,7 +66,7 @@
             if (topologies.put(topology.epoch(), topology) != null)
                 Assertions.fail("Received topology twice for epoch " + topology.epoch());
             if (ackTopologies)
-                parent.acknowledgeEpoch(EpochReady.done(topology.epoch()));
+                parent.acknowledgeEpoch(EpochReady.done(topology.epoch()), true);
             return AsyncResults.success(null);
         }
 
@@ -149,7 +149,7 @@
         }
 
         @Override
-        protected void localSyncComplete(Topology topology)
+        protected void localSyncComplete(Topology topology, boolean startSync)
         {
             if (!syncStarted.add(topology.epoch()))
                 Assertions.fail("Sync started multiple times for " + topology.epoch());
@@ -158,7 +158,7 @@
         @Override
         protected void topologyUpdatePostListenerNotify(Topology topology)
         {
-            acknowledgeEpoch(EpochReady.done(topology.epoch()));
+            acknowledgeEpoch(EpochReady.done(topology.epoch()), true);
         }
 
         @Override
diff --git a/accord-core/src/test/java/accord/impl/mock/MockConfigurationService.java b/accord-core/src/test/java/accord/impl/mock/MockConfigurationService.java
index e7a0b3c..fbcd107 100644
--- a/accord-core/src/test/java/accord/impl/mock/MockConfigurationService.java
+++ b/accord-core/src/test/java/accord/impl/mock/MockConfigurationService.java
@@ -83,7 +83,7 @@
     }
 
     @Override
-    public synchronized void acknowledgeEpoch(EpochReady epoch)
+    public synchronized void acknowledgeEpoch(EpochReady epoch, boolean startSync)
     {
         Assertions.assertFalse(acks.containsKey(epoch.epoch));
         acks.put(epoch.epoch, epoch);
diff --git a/accord-maelstrom/src/main/java/accord/maelstrom/SimpleConfigService.java b/accord-maelstrom/src/main/java/accord/maelstrom/SimpleConfigService.java
index f307a49..368b88b 100644
--- a/accord-maelstrom/src/main/java/accord/maelstrom/SimpleConfigService.java
+++ b/accord-maelstrom/src/main/java/accord/maelstrom/SimpleConfigService.java
@@ -56,7 +56,7 @@
     }
 
     @Override
-    public void acknowledgeEpoch(EpochReady ready)
+    public void acknowledgeEpoch(EpochReady ready, boolean startSync)
     {
     }