Use UnsignedLongSet instead of RangeSet in metadata
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / persisted / FrontendHistoryMetadata.java
index 2a52eccb94e84c1035590004b9a051a3b57c15d2..7e27f86f456f4d72c171c36b5c70731fbdb1efad 100644 (file)
@@ -7,25 +7,37 @@
  */
 package org.opendaylight.controller.cluster.datastore.persisted;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.base.MoreObjects;
+import com.google.common.base.Verify;
+import com.google.common.collect.ImmutableMap;
+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 org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.controller.cluster.datastore.utils.ImmutableUnsignedLongSet;
 import org.opendaylight.yangtools.concepts.WritableObject;
 import org.opendaylight.yangtools.concepts.WritableObjects;
 
 public final class FrontendHistoryMetadata implements WritableObject {
+    private final @NonNull ImmutableUnsignedLongSet purgedTransactions;
+    private final @NonNull ImmutableMap<UnsignedLong, Boolean> 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<UnsignedLong, Boolean> closedTransactions, final ImmutableUnsignedLongSet purgedTransactions) {
         this.historyId = historyId;
         this.cookie = cookie;
-        this.nextTransaction = nextTransaction;
         this.closed = closed;
+        this.closedTransactions = ImmutableMap.copyOf(closedTransactions);
+        this.purgedTransactions = requireNonNull(purgedTransactions);
     }
 
     public long getHistoryId() {
@@ -36,34 +48,62 @@ public final class FrontendHistoryMetadata implements WritableObject {
         return cookie;
     }
 
-    public long getNextTransaction() {
-        return nextTransaction;
-    }
-
     public boolean isClosed() {
         return closed;
     }
 
+    public ImmutableMap<UnsignedLong, Boolean> getClosedTransactions() {
+        return closedTransactions;
+    }
+
+    public ImmutableUnsignedLongSet 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 int purgedSize = purgedTransactions.size();
+        WritableObjects.writeLongs(out, closedTransactions.size(), purgedSize);
+        for (Entry<UnsignedLong, Boolean> e : closedTransactions.entrySet()) {
+            WritableObjects.writeLong(out, e.getKey().longValue());
+            out.writeBoolean(e.getValue());
+        }
+        purgedTransactions.writeRangesTo(out, purgedSize);
     }
 
     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<UnsignedLong, Boolean> closedTransactions = new HashMap<>(csize);
+        for (int i = 0; i < csize; ++i) {
+            final UnsignedLong key = UnsignedLong.fromLongBits(WritableObjects.readLong(in));
+            final Boolean value = in.readBoolean();
+            closedTransactions.put(key, value);
+        }
+        final var purgedTransactions = ImmutableUnsignedLongSet.readFrom(in, psize);
+
+        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();
+        return MoreObjects.toStringHelper(FrontendHistoryMetadata.class).add("historyId", historyId)
+                .add("cookie", cookie).add("closed", closed).add("closedTransactions", closedTransactions)
+                .add("purgedTransactions", purgedTransactions).toString();
     }
 }