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%2FFrontendClientMetadataBuilder.java;h=8a0ce605dfd18bb7bcd205c8cdebce9b6691f356;hb=583f30d1c7a8199b401c9393745c62fe27b5ced8;hp=15e4304a4693942532c54abfea818f8c4af90e56;hpb=02f198022910a0c90c93808aa0af55b2f4405781;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/FrontendClientMetadataBuilder.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/FrontendClientMetadataBuilder.java index 15e4304a46..8a0ce605df 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/FrontendClientMetadataBuilder.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/FrontendClientMetadataBuilder.java @@ -8,6 +8,7 @@ package org.opendaylight.controller.cluster.datastore; import com.google.common.base.Preconditions; +import com.google.common.base.Verify; import com.google.common.collect.Collections2; import com.google.common.collect.Range; import com.google.common.collect.RangeSet; @@ -15,6 +16,8 @@ import com.google.common.collect.TreeRangeSet; import com.google.common.primitives.UnsignedLong; import java.util.HashMap; import java.util.Map; +import javax.annotation.Nonnull; +import javax.annotation.concurrent.NotThreadSafe; import org.opendaylight.controller.cluster.access.concepts.ClientIdentifier; import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier; import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; @@ -22,8 +25,13 @@ import org.opendaylight.controller.cluster.datastore.persisted.FrontendClientMet import org.opendaylight.controller.cluster.datastore.persisted.FrontendHistoryMetadata; import org.opendaylight.yangtools.concepts.Builder; import org.opendaylight.yangtools.concepts.Identifiable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +@NotThreadSafe final class FrontendClientMetadataBuilder implements Builder, Identifiable { + private static final Logger LOG = LoggerFactory.getLogger(FrontendClientMetadataBuilder.class); + private final Map currentHistories = new HashMap<>(); private final RangeSet purgedHistories; private final ClientIdentifier identifier; @@ -54,21 +62,101 @@ final class FrontendClientMetadataBuilder implements Builder histories = new HashMap<>(); + for (FrontendHistoryMetadataBuilder e : currentHistories.values()) { + if (e.getIdentifier().getHistoryId() != 0) { + final AbstractFrontendHistory state = e.toLeaderState(shard); + Verify.verify(state instanceof LocalFrontendHistory); + histories.put(e.getIdentifier(), (LocalFrontendHistory) state); + } + } + + final AbstractFrontendHistory singleHistory; + final FrontendHistoryMetadataBuilder singleHistoryMeta = currentHistories.get( + new LocalHistoryIdentifier(identifier, 0)); + if (singleHistoryMeta == null) { + final ShardDataTree tree = shard.getDataStore(); + singleHistory = StandaloneFrontendHistory.create(shard.persistenceId(), getIdentifier(), tree); + } else { + singleHistory = singleHistoryMeta.toLeaderState(shard); + } + + return new LeaderFrontendState(shard.persistenceId(), getIdentifier(), shard.getDataStore(), + TreeRangeSet.create(purgedHistories), singleHistory, histories); } - private FrontendHistoryMetadataBuilder ensureHistory(final LocalHistoryIdentifier historyId) { - return currentHistories.computeIfAbsent(historyId, FrontendHistoryMetadataBuilder::new); + private FrontendHistoryMetadataBuilder getHistory(final TransactionIdentifier txId) { + return currentHistories.get(txId.getHistoryId()); } }