BUG-8618: make sure we refresh backend info
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / databroker / actors / dds / SimpleShardBackendResolver.java
index 056a1ea7e226deb49a6ee12e916769bf7e6dbb0c..370484d9556f03d8eb677c20f321d9b5fdcb2458 100644 (file)
@@ -41,18 +41,33 @@ final class SimpleShardBackendResolver extends AbstractShardBackendResolver {
     private CompletionStage<ShardBackendInfo> getBackendInfo(final long cookie) {
         Preconditions.checkArgument(cookie == 0);
 
-        ShardState local = state;
-        if (local == null) {
-            synchronized (this) {
-                local = state;
-                if (local == null) {
-                    local = resolveBackendInfo(shardName, 0);
-                    state = local;
-                }
-            }
+        final ShardState existing = state;
+        if (existing != null) {
+            return existing.getStage();
         }
 
-        return local.getStage();
+        synchronized (this) {
+            final ShardState recheck = state;
+            if (recheck != null) {
+                return recheck.getStage();
+            }
+
+            final ShardState newState = resolveBackendInfo(shardName, 0);
+            state = newState;
+
+            final CompletionStage<ShardBackendInfo> stage = newState.getStage();
+            stage.whenComplete((info, failure) -> {
+                if (failure != null) {
+                    synchronized (SimpleShardBackendResolver.this) {
+                        if (state == newState) {
+                            state = null;
+                        }
+                    }
+                }
+            });
+
+            return stage;
+        }
     }
 
     @Override