X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatabroker%2Factors%2Fdds%2FSimpleShardBackendResolver.java;h=9741a6bda49b1880caf44f112ee3dc6b72cd0851;hp=056a1ea7e226deb49a6ee12e916769bf7e6dbb0c;hb=634dfac8eead60f443bf75e749c70d1f2bb29198;hpb=32b322afd58f120a78208c939a01422aa224d0cf diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/SimpleShardBackendResolver.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/SimpleShardBackendResolver.java index 056a1ea7e2..9741a6bda4 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/SimpleShardBackendResolver.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/SimpleShardBackendResolver.java @@ -41,18 +41,33 @@ final class SimpleShardBackendResolver extends AbstractShardBackendResolver { private CompletionStage 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 stage = newState.getStage(); + stage.whenComplete((info, failure) -> { + if (failure != null) { + synchronized (SimpleShardBackendResolver.this) { + if (state == newState) { + state = null; + } + } + } + }); + + return stage; + } } @Override @@ -73,7 +88,7 @@ final class SimpleShardBackendResolver extends AbstractShardBackendResolver { synchronized (this) { LOG.debug("Invalidating backend information {}", staleInfo); flushCache(shardName); - LOG.trace("Invalidated cache %s", staleInfo); + LOG.trace("Invalidated cache {}", staleInfo); state = null; } }