2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.cluster.datastore.persisted;
10 import static java.util.Objects.requireNonNull;
12 import com.google.common.base.MoreObjects;
13 import java.io.DataInput;
14 import java.io.DataOutput;
15 import java.io.IOException;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.opendaylight.controller.cluster.datastore.utils.ImmutableUnsignedLongSet;
18 import org.opendaylight.controller.cluster.datastore.utils.UnsignedLongBitmap;
19 import org.opendaylight.yangtools.concepts.WritableObject;
20 import org.opendaylight.yangtools.concepts.WritableObjects;
22 public final class FrontendHistoryMetadata implements WritableObject {
23 private final @NonNull ImmutableUnsignedLongSet purgedTransactions;
24 private final @NonNull UnsignedLongBitmap closedTransactions;
25 private final long historyId;
26 private final long cookie;
27 private final boolean closed;
29 public FrontendHistoryMetadata(final long historyId, final long cookie, final boolean closed,
30 final UnsignedLongBitmap closedTransactions, final ImmutableUnsignedLongSet purgedTransactions) {
31 this.historyId = historyId;
34 this.closedTransactions = requireNonNull(closedTransactions);
35 this.purgedTransactions = requireNonNull(purgedTransactions);
38 public long getHistoryId() {
42 public long getCookie() {
46 public boolean isClosed() {
50 public UnsignedLongBitmap getClosedTransactions() {
51 return closedTransactions;
54 public ImmutableUnsignedLongSet getPurgedTransactions() {
55 return purgedTransactions;
59 public void writeTo(final DataOutput out) throws IOException {
60 WritableObjects.writeLongs(out, historyId, cookie);
61 out.writeBoolean(closed);
63 final int closedSize = closedTransactions.size();
64 final int purgedSize = purgedTransactions.rangeSize();
65 WritableObjects.writeLongs(out, closedSize, purgedSize);
66 closedTransactions.writeEntriesTo(out, closedSize);
67 purgedTransactions.writeRangesTo(out, purgedSize);
70 public static FrontendHistoryMetadata readFrom(final DataInput in) throws IOException {
71 final byte firstHdr = WritableObjects.readLongHeader(in);
72 final long historyId = WritableObjects.readFirstLong(in, firstHdr);
73 final long cookie = WritableObjects.readSecondLong(in, firstHdr);
74 final boolean closed = in.readBoolean();
76 final byte secondHdr = WritableObjects.readLongHeader(in);
77 final int csize = verifySize(WritableObjects.readFirstLong(in, secondHdr));
78 final int psize = verifySize(WritableObjects.readSecondLong(in, secondHdr));
80 return new FrontendHistoryMetadata(historyId, cookie, closed,
81 UnsignedLongBitmap.readFrom(in, csize),
82 ImmutableUnsignedLongSet.readFrom(in, psize));
86 public String toString() {
87 return MoreObjects.toStringHelper(FrontendHistoryMetadata.class)
88 .add("historyId", historyId)
89 .add("cookie", cookie)
90 .add("closed", closed)
91 .add("closedTransactions", closedTransactions)
92 .add("purgedTransactions", purgedTransactions)
96 private static int verifySize(final long size) throws IOException {
97 if (size < 0 || size > Integer.MAX_VALUE) {
98 throw new IOException("Invalid size " + size);