package org.opendaylight.controller.cluster.raft.messages;
import com.google.common.base.Optional;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import org.opendaylight.controller.cluster.raft.persisted.ServerConfigurationPayload;
+/**
+ * Message sent from a leader to install a snapshot chunk on a follower.
+ */
public class InstallSnapshot extends AbstractRaftRPC {
private static final long serialVersionUID = 1L;
private final Optional<Integer> lastChunkHashCode;
private final Optional<ServerConfigurationPayload> serverConfig;
+ @SuppressFBWarnings(value = "EI_EXPOSE_REP2", justification = "Stores a reference to an externally mutable byte[] "
+ + "object but this is OK since this class is merely a DTO and does not process byte[] internally. "
+ + "Also it would be inefficient to create a copy as the byte[] could be large.")
public InstallSnapshot(long term, String leaderId, long lastIncludedIndex, long lastIncludedTerm, byte[] data,
- int chunkIndex, int totalChunks, Optional<Integer> lastChunkHashCode, Optional<ServerConfigurationPayload> serverConfig) {
+ int chunkIndex, int totalChunks, Optional<Integer> lastChunkHashCode,
+ Optional<ServerConfigurationPayload> serverConfig) {
super(term);
this.leaderId = leaderId;
this.lastIncludedIndex = lastIncludedIndex;
return lastIncludedTerm;
}
+ @SuppressFBWarnings(value = "EI_EXPOSE_REP", justification = "Exposes a mutable object stored in a field but "
+ + "this is OK since this class is merely a DTO and does not process the byte[] internally. "
+ + "Also it would be inefficient to create a return copy as the byte[] could be large.")
public byte[] getData() {
return data;
}
}
- public <T extends Object> Object toSerializable(short version) {
+ public <T> Object toSerializable(short version) {
return this;
}
private InstallSnapshot installSnapshot;
+ // checkstyle flags the public modifier as redundant which really doesn't make sense since it clearly isn't
+ // redundant. It is explicitly needed for Java serialization to be able to create instances via reflection.
+ @SuppressWarnings("checkstyle:RedundantModifier")
public Proxy() {
}
out.writeInt(installSnapshot.totalChunks);
out.writeByte(installSnapshot.lastChunkHashCode.isPresent() ? 1 : 0);
- if(installSnapshot.lastChunkHashCode.isPresent()) {
+ if (installSnapshot.lastChunkHashCode.isPresent()) {
out.writeInt(installSnapshot.lastChunkHashCode.get().intValue());
}
out.writeByte(installSnapshot.serverConfig.isPresent() ? 1 : 0);
- if(installSnapshot.serverConfig.isPresent()) {
+ if (installSnapshot.serverConfig.isPresent()) {
out.writeObject(installSnapshot.serverConfig.get());
}
Optional<Integer> lastChunkHashCode = Optional.absent();
boolean chunkHashCodePresent = in.readByte() == 1;
- if(chunkHashCodePresent) {
+ if (chunkHashCodePresent) {
lastChunkHashCode = Optional.of(in.readInt());
}
Optional<ServerConfigurationPayload> serverConfig = Optional.absent();
boolean serverConfigPresent = in.readByte() == 1;
- if(serverConfigPresent) {
+ if (serverConfigPresent) {
serverConfig = Optional.of((ServerConfigurationPayload)in.readObject());
}