snapshot compression
Change-Id: I0de15a66a129d2966a196b2de5491456aacc20e2
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseStateMachine.java b/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseStateMachine.java
index 9ef9cb6..50d1203 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseStateMachine.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseStateMachine.java
@@ -2,10 +2,14 @@
import static org.slf4j.LoggerFactory.getLogger;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import java.util.zip.DeflaterOutputStream;
+import java.util.zip.InflaterInputStream;
import net.kuujo.copycat.Command;
import net.kuujo.copycat.Query;
@@ -23,6 +27,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
+import com.google.common.io.ByteStreams;
/**
* StateMachine whose transitions are coordinated/replicated
@@ -50,6 +55,8 @@
private State state = new State();
+ private boolean compressSnapshot = false;
+
@Command
public boolean createTable(String tableName) {
return state.getTables().putIfAbsent(tableName, Maps.newHashMap()) == null;
@@ -214,7 +221,16 @@
@Override
public byte[] takeSnapshot() {
try {
- return SERIALIZER.encode(state);
+ if (compressSnapshot) {
+ byte[] input = SERIALIZER.encode(state);
+ ByteArrayOutputStream comp = new ByteArrayOutputStream(input.length);
+ DeflaterOutputStream compressor = new DeflaterOutputStream(comp);
+ compressor.write(input, 0, input.length);
+ compressor.close();
+ return comp.toByteArray();
+ } else {
+ return SERIALIZER.encode(state);
+ }
} catch (Exception e) {
log.error("Failed to take snapshot", e);
throw new SnapshotException(e);
@@ -224,7 +240,14 @@
@Override
public void installSnapshot(byte[] data) {
try {
- this.state = SERIALIZER.decode(data);
+ if (compressSnapshot) {
+ ByteArrayInputStream in = new ByteArrayInputStream(data);
+ InflaterInputStream decompressor = new InflaterInputStream(in);
+ ByteStreams.toByteArray(decompressor);
+ this.state = SERIALIZER.decode(ByteStreams.toByteArray(decompressor));
+ } else {
+ this.state = SERIALIZER.decode(data);
+ }
} catch (Exception e) {
log.error("Failed to install from snapshot", e);
throw new SnapshotException(e);