use of com.github.nosan.embedded.cassandra.Cassandra in project esop by instaclustr.
the class BaseListingRemovalTest method testListingAndBackup.
@Test
public void testListingAndBackup() throws Exception {
Cassandra cassandra = getCassandra(cassandraDir, CASSANDRA_VERSION);
cassandra.start();
waitForCql();
String[][] arguments = hardlinkingArguments(CASSANDRA_VERSION);
try (CqlSession session = CqlSession.builder().build()) {
createTable(session, KEYSPACE, TABLE);
createTable(session, KEYSPACE_2, TABLE_2);
// stefansnapshot-1
insertAndCallBackupCLI(2, session, arguments[0]);
// stefansnapshot-2
insertAndCallBackupCLI(2, session, arguments[1]);
// stefansnapshot-2 in different storage location
insertAndCallBackupCLI(2, session, arguments[6]);
try {
logger.info("Executing the first restoration phase - download {}", asList(arguments[2]));
Esop.mainWithoutExit(arguments[2]);
logger.info("Executing the second restoration phase - truncate {}", asList(arguments[3]));
Esop.mainWithoutExit(arguments[3]);
logger.info("Executing the third restoration phase - import {}", asList(arguments[4]));
Esop.mainWithoutExit(arguments[4]);
logger.info("Executing the fourth restoration phase - cleanup {}", asList(arguments[5]));
Esop.mainWithoutExit(arguments[5]);
// we expect 4 records to be there as 2 were there before the first backup and the second 2 before the second backup
dumpTableAndAssertRowCount(session, KEYSPACE, TABLE, 4);
dumpTableAndAssertRowCount(session, KEYSPACE_2, TABLE_2, 4);
// listing
final Path jsonComplexFile = createTempFile("esop-backup-json-complex", null);
final Path jsonSimpleFile = createTempFile("esop-backup-json-simple", null);
final Path tableComplexFile = createTempFile("esop-backup-table-complex", null);
final Path tableSimpleFile = createTempFile("esop-backup-table-simple", null);
final String[] jsonComplex = new String[] { "list", "--storage-location=" + getStorageLocation(), "--human-units", "--json", "--to-file=" + jsonComplexFile.toAbsolutePath(), "--cache-dir=" + target(".esop") };
final String[] jsonSimple = new String[] { "list", "--storage-location=" + getStorageLocation(), "--human-units", "--json", "--simple-format", "--to-file=" + jsonSimpleFile.toAbsolutePath(), "--cache-dir=" + target(".esop") };
final String[] tableComplex = new String[] { "list", "--storage-location=" + getStorageLocation(), "--human-units", "--to-file=" + tableComplexFile.toAbsolutePath(), "--cache-dir=" + target(".esop") };
final String[] tableSimple = new String[] { "list", "--storage-location=" + getStorageLocation(), "--human-units", "--simple-format", "--to-file=" + tableSimpleFile.toAbsolutePath(), "--cache-dir=" + target(".esop") };
logger.info("Executing listing of json complex format: " + asList(jsonComplex));
Esop.mainWithoutExit(jsonComplex);
logger.info("Executing listing of json simple format: " + asList(jsonSimple));
Esop.mainWithoutExit(jsonSimple);
logger.info("Executing listing of table complex format: " + asList(tableComplex));
Esop.mainWithoutExit(tableComplex);
logger.info("Executing listing of table simple format: " + asList(tableSimple));
Esop.mainWithoutExit(tableSimple);
Manifest.AllManifestsReport report = objectMapper.readValue(Files.readAllBytes(jsonComplexFile), Manifest.AllManifestsReport.class);
Optional<Manifest.ManifestReporter.ManifestReport> oldest = report.getOldest();
Optional<Manifest.ManifestReporter.ManifestReport> latest = report.getLatest();
if (!oldest.isPresent()) {
Assert.fail("Not found the oldest report!");
}
if (!latest.isPresent()) {
Assert.fail("Not found the latest report!");
}
final String oldestBackupName = oldest.get().name;
final String latestBackupName = latest.get().name;
final String[] delete1 = new String[] { "remove-backup", "--storage-location=" + getStorageLocation(), "--backup-name=" + oldestBackupName, "--cache-dir=" + target(".esop") };
logger.info("Executing the first delete - {}", asList(delete1));
// delete oldest
Esop.mainWithoutExit(delete1);
final String[] delete2 = new String[] { "remove-backup", "--storage-location=" + getStorageLocation(), "--backup-name=" + latestBackupName, "--cache-dir=" + target(".esop") };
logger.info("Executing the second delete - {}", asList(delete2));
// delete latest
Esop.mainWithoutExit(delete2);
// we basically deleted everything in the first storage location by deleting first two backups
// assertEquals(Files.list(Paths.get(getStorageLocation().replaceAll(protocol(), ""), "data")).count(), 0);
String s = getStorageLocation().replaceAll(protocol(), "");
Path manifests = Paths.get(target(".esop")).resolve(s).resolve("manifests");
assertEquals(0, Files.list(manifests).count());
} finally {
cassandra.stop();
}
}
}
use of com.github.nosan.embedded.cassandra.Cassandra in project embedded-cassandra-spring-boot-starter by nosan.
the class EmbeddedCassandraAutoConfigurationTests method configureProperties.
@Test
void configureProperties() {
this.runner.withUserConfiguration(ExcludeCassandraBeanDefinitionRegistryPostProcessor.class).withPropertyValues("cassandra.embedded.config-file=classpath:cassandra.yaml", "cassandra.embedded.config-properties.start_rpc=true", "cassandra.embedded.environment-variables.JVM_OPTS=-Xmx512m", "cassandra.embedded.jvm-options=-Xmx256m", "cassandra.embedded.logger=MyLogger", "cassandra.embedded.version=3.11.3", "cassandra.embedded.name=MyCassandra", "cassandra.embedded.register-shutdown-hook=false", "cassandra.embedded.system-properties.cassandra.start_rpc=true", "cassandra.embedded.startup-timeout=1m", "cassandra.embedded.working-directory-resources.[conf/cassandra.yaml]=classpath:cassandra.yaml", "cassandra.embedded.working-directory=target/embeddedCassandra").withBean(CassandraBuilderConfigurator.class, () -> (builder) -> builder.addJvmOptions("-Xmx1024m")).run(context -> {
assertThat(context).hasSingleBean(CassandraBuilder.class);
Cassandra cassandra = context.getBean(CassandraBuilder.class).build();
assertThat(cassandra).hasFieldOrPropertyWithValue("databaseFactory.jvmOptions", new LinkedHashSet<>(Arrays.asList("-Xmx256m", "-Xmx1024m")));
assertThat(cassandra).hasFieldOrPropertyWithValue("logger", Logger.get("MyLogger"));
assertThat(cassandra).hasFieldOrPropertyWithValue("name", "MyCassandra");
assertThat(cassandra).hasFieldOrPropertyWithValue("version", Version.parse("3.11.3"));
assertThat(cassandra).hasFieldOrPropertyWithValue("registerShutdownHook", false);
assertThat(cassandra).hasFieldOrPropertyWithValue("startupTimeout", Duration.ofMinutes(1));
assertThat(cassandra).hasFieldOrPropertyWithValue("workingDirectory", Paths.get("target/embeddedCassandra").toAbsolutePath());
assertThat(cassandra).hasFieldOrPropertyWithValue("databaseFactory.environmentVariables", Collections.singletonMap("JVM_OPTS", "-Xmx512m"));
Map<String, Object> systemProperties = new LinkedHashMap<>();
systemProperties.put("cassandra.start_rpc", "true");
systemProperties.put("cassandra.config", new UrlResource(new ClassPathResource("cassandra.yaml").getURL()));
assertThat(cassandra).hasFieldOrPropertyWithValue("databaseFactory.systemProperties", systemProperties);
assertThat((Collection<?>) ReflectionTestUtils.getField(cassandra, "workingDirectoryCustomizers")).hasSize(1);
});
}
use of com.github.nosan.embedded.cassandra.Cassandra in project esop by instaclustr.
the class AbstractBackupTest method liveBackupRestoreTestRenamedEntities.
public void liveBackupRestoreTestRenamedEntities(final String[][] arguments, final String cassandraVersion, int rounds, boolean crossKeyspaceRestore) throws Exception {
Cassandra cassandra = getCassandra(cassandraDir, cassandraVersion);
cassandra.start();
waitForCql();
try (CqlSession session = CqlSession.builder().build()) {
createTable(session, KEYSPACE, TABLE);
createTable(session, KEYSPACE_2, TABLE_2);
createTable(session, KEYSPACE_2, TABLE_3);
// stefansnapshot-1
insertAndCallBackupCLI(2, session, arguments[0]);
// stefansnapshot-2
insertAndCallBackupCLI(2, session, arguments[1]);
for (int i = 1; i < rounds + 1; ++i) {
// each phase is executed twice here to check that phases are idempotent / repeatable
logger.info("Round " + i + " - Executing the first restoration phase - download {}", asList(arguments[2]));
Esop.mainWithoutExit(arguments[2]);
logger.info("Round " + i + " - Executing the first restoration phase - download {}", asList(arguments[2]));
Esop.mainWithoutExit(arguments[2]);
logger.info("Round " + i + " - Executing the second restoration phase - truncate {}", asList(arguments[3]));
Esop.mainWithoutExit(arguments[3]);
logger.info("Round " + i + " - Executing the second restoration phase - truncate {}", asList(arguments[3]));
Esop.mainWithoutExit(arguments[3]);
//
// this will import backup-ed table2 into table3
//
logger.info("Round " + i + " - Executing the third restoration phase - import {}", asList(arguments[4]));
Esop.mainWithoutExit(arguments[4]);
if (!cassandraVersion.startsWith("4")) {
// second round would not pass for 4 because import deletes files in download
logger.info("Round " + i + " - Executing the third restoration phase for the second time - import {}", asList(arguments[4]));
Esop.mainWithoutExit(arguments[4]);
}
logger.info("Round " + i + " - Executing the fourth restoration phase - cleanup {}", asList(arguments[5]));
Esop.mainWithoutExit(arguments[5]);
logger.info("Round " + i + " - Executing the fourth restoration phase - cleanup {}", asList(arguments[5]));
Esop.mainWithoutExit(arguments[5]);
// we expect 4 records to be there as 2 were there before the first backup and the second 2 before the second backup
dumpTableAndAssertRowCount(session, KEYSPACE, TABLE, 4);
dumpTableAndAssertRowCount(session, KEYSPACE_2, TABLE_2, 4);
// here we expect that table3 is same as table2
if (!crossKeyspaceRestore) {
dumpTableAndAssertRowCount(session, KEYSPACE_2, TABLE_3, 4);
}
}
} finally {
cassandra.stop();
FileUtils.deleteDirectory(cassandraDir);
deleteDirectory(Paths.get(target("backup1")));
}
}
use of com.github.nosan.embedded.cassandra.Cassandra in project esop by instaclustr.
the class AbstractBackupTest method inPlaceBackupRestoreTest.
public void inPlaceBackupRestoreTest(final String[][] arguments) throws Exception {
Cassandra cassandra = null;
try {
cassandra = getCassandra(cassandraDir, CASSANDRA_VERSION);
cassandra.start();
List<Long> insertionTimes;
try (CqlSession session = CqlSession.builder().build()) {
insertionTimes = populateDatabaseWithBackup(session, arguments);
assertEquals(insertionTimes.size(), NUMBER_OF_INSERTED_ROWS);
}
logger.info("Executing backup of commit logs {}", asList(arguments[3]));
Esop.mainWithoutExit(arguments[3]);
cassandra.stop();
// RESTORE VERIFICATION
cassandra = getCassandra(cassandraRestoredDir, CASSANDRA_VERSION, (workingDirectory, version) -> {
try {
FileUtils.createDirectory(workingDirectory.resolve("data").resolve("data"));
FileUtils.createDirectory(workingDirectory.resolve("data").resolve("data2"));
FileUtils.createDirectory(workingDirectory.resolve("data").resolve("data3"));
} catch (final Exception ex) {
// ignore
}
restoreOnStoppedNode(insertionTimes, arguments);
});
cassandra.start();
waitForCql();
try (CqlSession session = CqlSession.builder().build()) {
dumpTableAndAssertRowCount(session, KEYSPACE, TABLE, NUMBER_OF_ROWS_AFTER_RESTORATION);
}
} finally {
if (cassandra != null) {
cassandra.stop();
}
deleteDirectory(Paths.get(target("commitlog_download_dir")));
FileUtils.deleteDirectory(cassandraDir);
FileUtils.deleteDirectory(cassandraRestoredDir);
}
}
Aggregations