BUG-5280: add SimpleDataStoreClientBehavior
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / databroker / actors / dds / SimpleShardBackendResolver.java
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
new file mode 100644 (file)
index 0000000..056a1ea
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.cluster.databroker.actors.dds;
+
+import com.google.common.base.Preconditions;
+import java.util.concurrent.CompletionStage;
+import javax.annotation.concurrent.ThreadSafe;
+import org.opendaylight.controller.cluster.access.client.BackendInfoResolver;
+import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier;
+import org.opendaylight.controller.cluster.datastore.utils.ActorContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * {@link BackendInfoResolver} implementation for static shard configuration based on ShardManager. Unlike the full
+ * {@link ModuleShardBackendResolver}, this resolver is used in situations where the client corresponds exactly to one
+ * backend shard, e.g. there is only one fixed cookie assigned and the operation path is not consulted at all.
+ *
+ * @author Robert Varga
+ */
+@ThreadSafe
+final class SimpleShardBackendResolver extends AbstractShardBackendResolver {
+    private static final Logger LOG = LoggerFactory.getLogger(SimpleShardBackendResolver.class);
+
+    private final String shardName;
+
+    private volatile ShardState state;
+
+    // FIXME: we really need just ActorContext.findPrimaryShardAsync()
+    SimpleShardBackendResolver(final ClientIdentifier clientId, final ActorContext actorContext,
+            final String shardName) {
+        super(clientId, actorContext);
+        this.shardName = Preconditions.checkNotNull(shardName);
+    }
+
+    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;
+                }
+            }
+        }
+
+        return local.getStage();
+    }
+
+    @Override
+    public CompletionStage<ShardBackendInfo> getBackendInfo(final Long cookie) {
+        return getBackendInfo(cookie.longValue());
+    }
+
+    @Override
+    public CompletionStage<? extends ShardBackendInfo> refreshBackendInfo(final Long cookie,
+            final ShardBackendInfo staleInfo) {
+
+        final ShardState existing = state;
+        if (existing != null) {
+            if (!staleInfo.equals(existing.getResult())) {
+                return existing.getStage();
+            }
+
+            synchronized (this) {
+                LOG.debug("Invalidating backend information {}", staleInfo);
+                flushCache(shardName);
+                LOG.trace("Invalidated cache %s", staleInfo);
+                state = null;
+            }
+        }
+
+        return getBackendInfo(cookie);
+    }
+}