X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fmessages%2FDatastoreSnapshotList.java;h=42f3129728aae62f9a34527c1888c10a21501de2;hp=ca137d73dbc6f7a5853940f896614e7a161e4dc1;hb=95c296a7c1e8e186a88a0a0dc82e080b2185db33;hpb=2f77e92af7a68b4a97dbfb709c6cc9b11a49878a diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DatastoreSnapshotList.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DatastoreSnapshotList.java index ca137d73db..42f3129728 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DatastoreSnapshotList.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DatastoreSnapshotList.java @@ -7,8 +7,16 @@ */ package org.opendaylight.controller.cluster.datastore.messages; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.ObjectInputStream; import java.util.ArrayList; import java.util.List; +import org.opendaylight.controller.cluster.datastore.persisted.ShardDataTreeSnapshot; +import org.opendaylight.controller.cluster.datastore.persisted.ShardManagerSnapshot; +import org.opendaylight.controller.cluster.datastore.persisted.ShardSnapshotState; +import org.opendaylight.controller.cluster.raft.Snapshot; +import org.opendaylight.controller.cluster.raft.persisted.EmptyState; /** * Stores a list of DatastoreSnapshot instances. @@ -26,26 +34,55 @@ public class DatastoreSnapshotList extends ArrayList { super(snapshots); } - private Object readResolve() { + private Object readResolve() throws IOException, ClassNotFoundException { List snapshots = new ArrayList<>(size()); for (DatastoreSnapshot legacy: this) { snapshots.add(new org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshot( - legacy.getType(), legacy.getShardManagerSnapshot(), fromLegacy(legacy.getShardSnapshots()))); + legacy.getType(), deserializeShardManagerSnapshot(legacy.getShardManagerSnapshot()), + fromLegacy(legacy.getShardSnapshots()))); } return new org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshotList(snapshots); } - private List fromLegacy( - List from) { + private static org.opendaylight.controller.cluster.datastore.persisted.ShardManagerSnapshot + deserializeShardManagerSnapshot(byte [] bytes) throws IOException, ClassNotFoundException { + if (bytes == null) { + return null; + } + + try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))) { + return (ShardManagerSnapshot) ois.readObject(); + } + } + + private static List + fromLegacy(List from) throws IOException, ClassNotFoundException { List snapshots = new ArrayList<>(from.size()); for (DatastoreSnapshot.ShardSnapshot legacy: from) { snapshots.add(new org.opendaylight.controller.cluster.datastore.persisted.DatastoreSnapshot.ShardSnapshot( - legacy.getName(), legacy.getSnapshot())); + legacy.getName(), deserializeShardSnapshot(legacy.getSnapshot()))); } return snapshots; } + + private static org.opendaylight.controller.cluster.raft.persisted.Snapshot deserializeShardSnapshot(byte[] bytes) + throws IOException, ClassNotFoundException { + try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))) { + Snapshot legacy = (Snapshot) ois.readObject(); + + org.opendaylight.controller.cluster.raft.persisted.Snapshot.State state = EmptyState.INSTANCE; + if (legacy.getState().length > 0) { + state = new ShardSnapshotState(ShardDataTreeSnapshot.deserializePreCarbon(legacy.getState())); + } + + return org.opendaylight.controller.cluster.raft.persisted.Snapshot.create( + state, legacy.getUnAppliedEntries(), legacy.getLastIndex(), + legacy.getLastTerm(), legacy.getLastAppliedIndex(), legacy.getLastAppliedTerm(), + legacy.getElectionTerm(), legacy.getElectionVotedFor(), legacy.getServerConfiguration()); + } + } }