use of com.instaclustr.esop.topology.CassandraClusterTopology.ClusterTopology in project esop by instaclustr.
the class InPlaceRestorationStrategy method getNodeTopology.
private NodeTopology getNodeTopology(final Restorer restorer, final RestoreOperationRequest request) {
try {
final String topologyFile = format("topology/%s", request.snapshotTag);
final String topology = restorer.downloadFileToString(Paths.get(topologyFile), fileName -> fileName.contains(topologyFile));
final ClusterTopology clusterTopology = objectMapper.readValue(topology, ClusterTopology.class);
// by translating, we get proper node id (uuid) so we fetch the right node in remote bucket
return clusterTopology.translateToNodeTopology(request.storageLocation.nodeId);
} catch (final Exception ex) {
throw new IllegalStateException(format("Unable to resolve node hostId to restore to for request %s", request), ex);
}
}
use of com.instaclustr.esop.topology.CassandraClusterTopology.ClusterTopology in project esop by instaclustr.
the class BaseBackupOperationCoordinator method coordinate.
@Override
public void coordinate(final Operation<BackupOperationRequest> operation) {
final BackupOperationRequest request = operation.request;
logger.info(request.toString());
try {
assert cassandraJMXService != null;
assert backuperFactoryMap != null;
assert bucketServiceFactoryMap != null;
assert objectMapper != null;
if (!request.skipBucketVerification) {
try (final BucketService bucketService = bucketServiceFactoryMap.get(request.storageLocation.storageProvider).createBucketService(request)) {
bucketService.checkBucket(request.storageLocation.bucket, request.createMissingBucket);
}
}
final CassandraData cassandraData = CassandraData.parse(request.dataDirs.get(0));
cassandraData.setDatabaseEntitiesFromRequest(request.entities);
final List<String> tokens = new CassandraTokens(cassandraJMXService).act();
logger.info("Tokens {}", tokens);
if (!Snapshots.snapshotContainsTimestamp(operation.request.snapshotTag)) {
if (operation.request.schemaVersion == null) {
operation.request.schemaVersion = new CassandraSchemaVersion(cassandraJMXService).act();
}
operation.request.snapshotTag = resolveSnapshotTag(operation.request, System.currentTimeMillis());
}
logger.info("Taking snapshot with name {}", request.snapshotTag);
new TakeSnapshotOperation(cassandraJMXService, new TakeSnapshotOperationRequest(request.entities, request.snapshotTag), cassandraVersionProvider).run0();
Snapshots.hashSpec = hashSpec;
final Snapshots snapshots = Snapshots.parse(request.dataDirs, request.snapshotTag);
final Optional<Snapshot> snapshot = snapshots.get(request.snapshotTag);
if (!snapshot.isPresent()) {
throw new IllegalStateException(format("There is not any snapshot of tag %s", request.snapshotTag));
}
final Manifest manifest = Manifest.from(snapshot.get());
manifest.setSchemaVersion(request.schemaVersion);
manifest.setTokens(tokens);
// manifest
final Path localManifestPath = getLocalManifestPath(request.snapshotTag);
Manifest.write(manifest, localManifestPath, objectMapper);
manifest.setManifest(getManifestAsManifestEntry(localManifestPath));
try (final Backuper backuper = backuperFactoryMap.get(request.storageLocation.storageProvider).createBackuper(request)) {
final List<ManifestEntry> manifestEntries = manifest.getManifestEntries();
Session<UploadUnit> uploadSession = null;
try {
uploadSession = uploadTracker.submit(backuper, operation, manifestEntries, request.snapshotTag, operation.request.concurrentConnections);
uploadSession.waitUntilConsideredFinished();
uploadTracker.cancelIfNecessary(uploadSession);
final List<UploadUnit> failedUnits = uploadSession.getFailedUnits();
if (!failedUnits.isEmpty()) {
final String message = failedUnits.stream().map(unit -> unit.getManifestEntry().objectKey.toString()).collect(Collectors.joining(","));
logger.error(message);
throw new IOException(format("Unable to upload some files successfully: %s", message));
}
} finally {
uploadTracker.removeSession(uploadSession);
uploadSession = null;
}
if (operation.request.uploadClusterTopology) {
// here we will upload all topology because we do not know what restore might look like (what dc a restorer will restore against if any)
final ClusterTopology topology = new CassandraClusterTopology(cassandraJMXService, null).act();
ClusterTopology.upload(backuper, topology, objectMapper, operation.request.snapshotTag);
}
} finally {
manifest.cleanup();
}
} catch (final Exception ex) {
operation.addError(Error.from(ex));
} finally {
final ClearSnapshotOperation cso = new ClearSnapshotOperation(cassandraJMXService, new ClearSnapshotOperationRequest(request.snapshotTag));
try {
cso.run0();
} catch (final Exception ex) {
operation.addErrors(cso.errors);
}
}
}
use of com.instaclustr.esop.topology.CassandraClusterTopology.ClusterTopology in project esop by instaclustr.
the class CassandraClusterTopologyTest method testNoDcFiltering.
@Test
public void testNoDcFiltering() throws Exception {
final ClusterTopology topology = getClusterTopology();
ClusterTopology filtered = ClusterTopology.filter(topology, Collections.emptyList());
assertEquals(topology, filtered);
}
use of com.instaclustr.esop.topology.CassandraClusterTopology.ClusterTopology in project esop by instaclustr.
the class CassandraClusterTopologyTest method invalidDcs.
@Test
public void invalidDcs() throws Exception {
final ClusterTopology topology = getClusterTopology();
final Set<String> invalidDcs = ClusterTopology.sanitizeDcs(" dc3 ,").stream().filter(dc -> !topology.getDcs().contains(dc)).collect(toSet());
assertFalse(invalidDcs.isEmpty());
}
use of com.instaclustr.esop.topology.CassandraClusterTopology.ClusterTopology in project esop by instaclustr.
the class CassandraClusterTopologyTest method getClusterTopology.
private ClusterTopology getClusterTopology() throws Exception {
ClusterTopology clusterTopology = new ClusterTopology();
clusterTopology.endpointRacks = new HashMap<InetAddress, String>() {
{
put(getByName("127.0.0.1"), "rack1");
put(getByName("127.0.0.2"), "rack2");
put(getByName("127.0.0.3"), "rack3");
put(getByName("127.0.0.4"), "rack1");
put(getByName("127.0.0.5"), "rack2");
put(getByName("127.0.0.6"), "rack3");
}
};
clusterTopology.hostnames = new HashMap<InetAddress, String>() {
{
put(getByName("127.0.0.1"), "host1");
put(getByName("127.0.0.2"), "host2");
put(getByName("127.0.0.3"), "host3");
put(getByName("127.0.0.4"), "host4");
put(getByName("127.0.0.5"), "host5");
put(getByName("127.0.0.6"), "host6");
}
};
clusterTopology.endpoints = new HashMap<InetAddress, UUID>() {
{
put(getByName("127.0.0.1"), uuid1);
put(getByName("127.0.0.2"), uuid2);
put(getByName("127.0.0.3"), uuid3);
put(getByName("127.0.0.4"), uuid4);
put(getByName("127.0.0.5"), uuid5);
put(getByName("127.0.0.6"), uuid6);
}
};
clusterTopology.endpointDcs = new HashMap<InetAddress, String>() {
{
put(getByName("127.0.0.1"), "dc1");
put(getByName("127.0.0.2"), "dc1");
put(getByName("127.0.0.3"), "dc1");
put(getByName("127.0.0.4"), "dc2");
put(getByName("127.0.0.5"), "dc2");
put(getByName("127.0.0.6"), "dc2");
}
};
clusterTopology.clusterName = "abc";
clusterTopology.timestamp = System.currentTimeMillis();
clusterTopology.schemaVersion = UUID.randomUUID().toString();
return clusterTopology;
}
Aggregations