Yuta HIGUCHI

copy VersionedValue before returning to protect internal state

Change-Id: If56c512488b90bbfbabe32434e567b463d4acf1a
...@@ -38,6 +38,28 @@ public class VersionedValue { ...@@ -38,6 +38,28 @@ public class VersionedValue {
38 return version; 38 return version;
39 } 39 }
40 40
41 + /**
42 + * Creates a copy of given VersionedValue.
43 + *
44 + * @param original VersionedValue to create a copy
45 + * @return same as original if original or it's value is null,
46 + * otherwise creates a copy.
47 + */
48 + public static VersionedValue copy(VersionedValue original) {
49 + if (original == null) {
50 + return null;
51 + }
52 + if (original.value == null) {
53 + // immutable, no need to copy
54 + return original;
55 + } else {
56 + return new VersionedValue(
57 + Arrays.copyOf(original.value,
58 + original.value.length),
59 + original.version);
60 + }
61 + }
62 +
41 @Override 63 @Override
42 public String toString() { 64 public String toString() {
43 return MoreObjects.toStringHelper(getClass()) 65 return MoreObjects.toStringHelper(getClass())
......
...@@ -76,7 +76,7 @@ public class DatabaseStateMachine implements StateMachine { ...@@ -76,7 +76,7 @@ public class DatabaseStateMachine implements StateMachine {
76 results.add(new InternalReadResult(InternalReadResult.Status.NO_SUCH_TABLE, null)); 76 results.add(new InternalReadResult(InternalReadResult.Status.NO_SUCH_TABLE, null));
77 continue; 77 continue;
78 } 78 }
79 - VersionedValue value = table.get(request.key()); 79 + VersionedValue value = VersionedValue.copy(table.get(request.key()));
80 results.add(new InternalReadResult( 80 results.add(new InternalReadResult(
81 InternalReadResult.Status.OK, 81 InternalReadResult.Status.OK,
82 new ReadResult( 82 new ReadResult(
......