X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FFrontendMetadata.java;h=abb97e59a43701df5f223e526bc8a3596e8c044f;hb=HEAD;hp=6a04674b6ca2919c32b63a28e1b699a037d73cc1;hpb=4bbbd57c8f96e864d4353c1bdbce0dc068a6a57b;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/FrontendMetadata.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/FrontendMetadata.java index 6a04674b6c..abb97e59a4 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/FrontendMetadata.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/FrontendMetadata.java @@ -7,31 +7,40 @@ */ package org.opendaylight.controller.cluster.datastore; +import static com.google.common.base.Verify.verify; +import static java.util.Objects.requireNonNull; + import com.google.common.collect.Collections2; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; import java.util.HashMap; import java.util.Map; -import javax.annotation.concurrent.NotThreadSafe; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier; import org.opendaylight.controller.cluster.access.concepts.FrontendIdentifier; import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier; import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; -import org.opendaylight.controller.cluster.datastore.persisted.FrontendClientMetadata; import org.opendaylight.controller.cluster.datastore.persisted.FrontendShardDataTreeSnapshotMetadata; +import org.opendaylight.controller.cluster.datastore.utils.ImmutableUnsignedLongSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Frontend state as observed by a shard follower. This class is responsible for maintaining metadata state * so that this can be used to seed {@link LeaderFrontendState} with proper state so that the frontend/backend - * conversation can continue where it left off. + * conversation can continue where it left off. This class is NOT thread-safe. * * @author Robert Varga */ -@NotThreadSafe final class FrontendMetadata extends ShardDataTreeMetadata { private static final Logger LOG = LoggerFactory.getLogger(FrontendMetadata.class); private final Map clients = new HashMap<>(); + private final String shardName; + + FrontendMetadata(final String shardName) { + this.shardName = requireNonNull(shardName); + } @Override Class getSupportedType() { @@ -40,15 +49,22 @@ final class FrontendMetadata extends ShardDataTreeMetadata toLeaderState(final @NonNull Shard shard) { + return new HashMap<>(Maps.transformValues(clients, meta -> meta.toLeaderState(shard))); + } + + void disableTracking(final ClientIdentifier clientId) { + final var frontendId = clientId.getFrontendId(); + final var client = clients.get(frontendId); + if (client == null) { + // When we have not seen the client before, we still need to disable tracking for him since this only gets + // triggered once. + LOG.debug("{}: disableTracking {} does not match any client, pre-disabling client.", shardName, clientId); + clients.put(frontendId, new FrontendClientMetadataBuilder.Disabled(shardName, clientId)); + return; + } + if (!clientId.equals(client.clientId())) { + LOG.debug("{}: disableTracking {} does not match client {}, ignoring", shardName, clientId, client); + return; + } + if (client instanceof FrontendClientMetadataBuilder.Disabled) { + LOG.debug("{}: client {} is has already disabled tracking", shardName, client); + return; + } + + verify(clients.replace(frontendId, client, new FrontendClientMetadataBuilder.Disabled(shardName, clientId))); + } + + ImmutableSet getClients() { + return clients.values().stream() + .map(FrontendClientMetadataBuilder::clientId) + .collect(ImmutableSet.toImmutableSet()); + } }