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%2Fpersisted%2FFrontendHistoryMetadata.java;h=5429fd19122f01ec574cd27fe7c5f7a30cfacae1;hb=2634ed7138a343f051ff6452ccc7edd3abfc0c3a;hp=2a52eccb94e84c1035590004b9a051a3b57c15d2;hpb=edd61d79da614388134b0e0a618010c91e9c91bd;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/FrontendHistoryMetadata.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/FrontendHistoryMetadata.java index 2a52eccb94..5429fd1912 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/FrontendHistoryMetadata.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/FrontendHistoryMetadata.java @@ -8,24 +8,37 @@ package org.opendaylight.controller.cluster.datastore.persisted; import com.google.common.base.MoreObjects; +import com.google.common.base.Verify; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableRangeSet; +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.io.DataInput; import java.io.DataOutput; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import org.opendaylight.yangtools.concepts.WritableObject; import org.opendaylight.yangtools.concepts.WritableObjects; public final class FrontendHistoryMetadata implements WritableObject { + private final RangeSet purgedTransactions; + private final Map closedTransactions; private final long historyId; private final long cookie; - private final long nextTransaction; private final boolean closed; - public FrontendHistoryMetadata(final long historyId, final long cookie, final long nextTransaction, - final boolean closed) { + public FrontendHistoryMetadata(final long historyId, final long cookie, final boolean closed, + final Map closedTransactions, final RangeSet purgedTransactions) { this.historyId = historyId; this.cookie = cookie; - this.nextTransaction = nextTransaction; this.closed = closed; + this.closedTransactions = ImmutableMap.copyOf(closedTransactions); + this.purgedTransactions = ImmutableRangeSet.copyOf(purgedTransactions); } public long getHistoryId() { @@ -36,34 +49,70 @@ public final class FrontendHistoryMetadata implements WritableObject { return cookie; } - public long getNextTransaction() { - return nextTransaction; - } - public boolean isClosed() { return closed; } + public Map getClosedTransactions() { + return closedTransactions; + } + + public RangeSet getPurgedTransactions() { + return purgedTransactions; + } + @Override public void writeTo(final DataOutput out) throws IOException { WritableObjects.writeLongs(out, historyId, cookie); - WritableObjects.writeLong(out, nextTransaction); out.writeBoolean(closed); + + final Set> purgedRanges = purgedTransactions.asRanges(); + WritableObjects.writeLongs(out, closedTransactions.size(), purgedRanges.size()); + for (Entry e : closedTransactions.entrySet()) { + WritableObjects.writeLong(out, e.getKey().longValue()); + out.writeBoolean(e.getValue().booleanValue()); + } + for (Range r : purgedRanges) { + WritableObjects.writeLongs(out, r.lowerEndpoint().longValue(), r.upperEndpoint().longValue()); + } } public static FrontendHistoryMetadata readFrom(final DataInput in) throws IOException { - final byte header = WritableObjects.readLongHeader(in); + byte header = WritableObjects.readLongHeader(in); final long historyId = WritableObjects.readFirstLong(in, header); final long cookie = WritableObjects.readSecondLong(in, header); - final long nextTransaction = WritableObjects.readLong(in); final boolean closed = in.readBoolean(); - return new FrontendHistoryMetadata(historyId, cookie, nextTransaction, closed); + header = WritableObjects.readLongHeader(in); + long ls = WritableObjects.readFirstLong(in, header); + Verify.verify(ls >= 0 && ls <= Integer.MAX_VALUE); + final int csize = (int) ls; + + ls = WritableObjects.readSecondLong(in, header); + Verify.verify(ls >= 0 && ls <= Integer.MAX_VALUE); + final int psize = (int) ls; + + final Map closedTransactions = new HashMap<>(csize); + for (int i = 0; i < csize; ++i) { + final UnsignedLong key = UnsignedLong.fromLongBits(WritableObjects.readLong(in)); + final Boolean value = Boolean.valueOf(in.readBoolean()); + closedTransactions.put(key, value); + } + final RangeSet purgedTransactions = TreeRangeSet.create(); + for (int i = 0; i < psize; ++i) { + final byte h = WritableObjects.readLongHeader(in); + final UnsignedLong l = UnsignedLong.fromLongBits(WritableObjects.readFirstLong(in, h)); + final UnsignedLong u = UnsignedLong.fromLongBits(WritableObjects.readSecondLong(in, h)); + purgedTransactions.add(Range.closed(l, u)); + } + + return new FrontendHistoryMetadata(historyId, cookie, closed, closedTransactions, purgedTransactions); } @Override public String toString() { return MoreObjects.toStringHelper(FrontendHistoryMetadata.class).add("historiId", historyId) - .add("cookie", cookie).add("nextTransaction", nextTransaction).add("closed", closed).toString(); + .add("cookie", cookie).add("closed", closed).add("closedTransactions", closedTransactions) + .add("purgedTransactions", purgedTransactions).toString(); } }