import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
}
try {
- String persistenceId = name.substring(PERSISTENCE_ID_START_INDEX, persistenceIdEndIndex);
+ // Since the persistenceId is url encoded in the filename, we need
+ // to decode relevant filename's part to obtain persistenceId back
+ String persistenceId = decode(name.substring(PERSISTENCE_ID_START_INDEX, persistenceIdEndIndex));
long sequenceNumber = Long.parseLong(name.substring(persistenceIdEndIndex + 1, sequenceNumberEndIndex));
long timestamp = Long.parseLong(name.substring(sequenceNumberEndIndex + 1));
return new SnapshotMetadata(persistenceId, sequenceNumber, timestamp);
}
}
+ private static String decode(final String str) {
+ try {
+ return URLDecoder.decode(str, StandardCharsets.UTF_8.name());
+ } catch (final UnsupportedEncodingException e) {
+ // Shouldn't happen
+ LOG.warn("Error decoding {}", str, e);
+ return str;
+ }
+ }
+
@VisibleForTesting
static int compare(final SnapshotMetadata m1, final SnapshotMetadata m2) {
return (int) (!m1.persistenceId().equals(m2.persistenceId())
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.SerializationUtils;
import org.junit.After;
*/
public class LocalSnapshotStoreTest {
private static final String PERSISTENCE_ID = "member-1-shard-default-config";
+ private static final String PREFIX_BASED_SHARD_PERSISTENCE_ID = "member-1-shard-id-ints!-config";
private static ActorSystem system;
private static ActorRef snapshotStore;
createSnapshotFile(PERSISTENCE_ID, "two", 1, 2000);
createSnapshotFile(PERSISTENCE_ID, "three", 1, 3000);
+ createSnapshotFile(PREFIX_BASED_SHARD_PERSISTENCE_ID, "foo", 0, 1000);
+ createSnapshotFile(PREFIX_BASED_SHARD_PERSISTENCE_ID, "bar", 1, 2000);
+ createSnapshotFile(PREFIX_BASED_SHARD_PERSISTENCE_ID, "foobar", 1, 3000);
+
createSnapshotFile("member-1-shard-default-oper", "foo", 0, 1000);
createSnapshotFile("member-1-shard-toaster-oper", "foo", 0, 1000);
new File(SNAPSHOT_DIR, "other").createNewFile();
assertEquals("SelectedSnapshot present", TRUE, possibleSnapshot.nonEmpty());
assertEquals("SelectedSnapshot metadata", metadata3, possibleSnapshot.get().metadata());
assertEquals("SelectedSnapshot snapshot", "three", possibleSnapshot.get().snapshot());
+
+ snapshotStore.tell(new LoadSnapshot(PREFIX_BASED_SHARD_PERSISTENCE_ID,
+ SnapshotSelectionCriteria.latest(), Long.MAX_VALUE), probe.getRef());
+ result = probe.expectMsgClass(LoadSnapshotResult.class);
+ possibleSnapshot = result.snapshot();
+
+ SnapshotMetadata prefixBasedShardMetada3 = new SnapshotMetadata(PREFIX_BASED_SHARD_PERSISTENCE_ID, 1, 3000);
+
+ assertEquals("SelectedSnapshot present", TRUE, possibleSnapshot.nonEmpty());
+ assertEquals("SelectedSnapshot metadata", prefixBasedShardMetada3, possibleSnapshot.get().metadata());
+ assertEquals("SelectedSnapshot snapshot", "foobar", possibleSnapshot.get().snapshot());
}
@Test
}
}
- private static String toSnapshotName(String persistenceId, int seqNr, int timestamp) {
- return "snapshot-" + persistenceId + "-" + seqNr + "-" + timestamp;
+ private static String toSnapshotName(String persistenceId, int seqNr, int timestamp)
+ throws UnsupportedEncodingException {
+ final String encodedPersistenceId = URLEncoder.encode(persistenceId, StandardCharsets.UTF_8.name());
+ return "snapshot-" + encodedPersistenceId + "-" + seqNr + "-" + timestamp;
}
}