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=4ffa27c60dcdb771767d836490d2af333b2c5f9f;hb=27b168d3ca3807123b4877f1ad0662b2610f393d;hp=8a0ce605dfd18bb7bcd205c8cdebce9b6691f356;hpb=2634ed7138a343f051ff6452ccc7edd3abfc0c3a;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 8a0ce605df..4ffa27c60d 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 @@ -7,13 +7,10 @@ */ package org.opendaylight.controller.cluster.datastore; +import com.google.common.base.MoreObjects; 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; -import com.google.common.collect.TreeRangeSet; -import com.google.common.primitives.UnsignedLong; import java.util.HashMap; import java.util.Map; import javax.annotation.Nonnull; @@ -23,6 +20,7 @@ import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifie import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.persisted.FrontendClientMetadata; import org.opendaylight.controller.cluster.datastore.persisted.FrontendHistoryMetadata; +import org.opendaylight.controller.cluster.datastore.utils.UnsignedLongRangeSet; import org.opendaylight.yangtools.concepts.Builder; import org.opendaylight.yangtools.concepts.Identifiable; import org.slf4j.Logger; @@ -33,27 +31,46 @@ final class FrontendClientMetadataBuilder implements Builder currentHistories = new HashMap<>(); - private final RangeSet purgedHistories; + private final UnsignedLongRangeSet purgedHistories; private final ClientIdentifier identifier; + private final String shardName; - FrontendClientMetadataBuilder(final ClientIdentifier identifier) { + FrontendClientMetadataBuilder(final String shardName, final ClientIdentifier identifier) { + this.shardName = Preconditions.checkNotNull(shardName); this.identifier = Preconditions.checkNotNull(identifier); - purgedHistories = TreeRangeSet.create(); + purgedHistories = UnsignedLongRangeSet.create(); + + // History for stand-alone transactions is always present + final LocalHistoryIdentifier standaloneId = standaloneHistoryId(); + currentHistories.put(standaloneId, new FrontendHistoryMetadataBuilder(standaloneId)); } - FrontendClientMetadataBuilder(final FrontendClientMetadata meta) { + FrontendClientMetadataBuilder(final String shardName, final FrontendClientMetadata meta) { + this.shardName = Preconditions.checkNotNull(shardName); this.identifier = Preconditions.checkNotNull(meta.getIdentifier()); - purgedHistories = TreeRangeSet.create(meta.getPurgedHistories()); + purgedHistories = UnsignedLongRangeSet.create(meta.getPurgedHistories()); for (FrontendHistoryMetadata h : meta.getCurrentHistories()) { final FrontendHistoryMetadataBuilder b = new FrontendHistoryMetadataBuilder(identifier, h); currentHistories.put(b.getIdentifier(), b); } + + // Sanity check and recovery + final LocalHistoryIdentifier standaloneId = standaloneHistoryId(); + if (!currentHistories.containsKey(standaloneId)) { + LOG.warn("{}: Client {} recovered histories {} do not contain stand-alone history, attempting recovery", + shardName, identifier, currentHistories); + currentHistories.put(standaloneId, new FrontendHistoryMetadataBuilder(standaloneId)); + } + } + + private LocalHistoryIdentifier standaloneHistoryId() { + return new LocalHistoryIdentifier(identifier, 0); } @Override public FrontendClientMetadata build() { - return new FrontendClientMetadata(identifier, purgedHistories, + return new FrontendClientMetadata(identifier, purgedHistories.toImmutable(), Collections2.transform(currentHistories.values(), FrontendHistoryMetadataBuilder::build)); } @@ -67,9 +84,9 @@ final class FrontendClientMetadataBuilder implements Builder