use of com.palantir.atlasdb.backup.api.InProgressBackupToken in project atlasdb by palantir.
the class AtlasBackupResourceTest method invalidBackupToken.
private static InProgressBackupToken invalidBackupToken(Namespace namespace, AsyncTimelockService timelock) {
LockToken lockToken = lockToken();
InProgressBackupToken backupToken = inProgressBackupToken(namespace, lockToken);
when(timelock.unlock(ImmutableSet.of(lockToken))).thenReturn(Futures.immediateFuture(ImmutableSet.of()));
return backupToken;
}
use of com.palantir.atlasdb.backup.api.InProgressBackupToken in project atlasdb by palantir.
the class AtlasBackupService method createAtlasBackupService.
private static AtlasBackupService createAtlasBackupService(AuthHeader authHeader, AtlasBackupClient atlasBackupClient, Function<AtlasService, Path> backupFolderFactory, KvsRunner kvsRunner, int completeBackupNumThreads) {
BackupPersister backupPersister = new ExternalBackupPersister(backupFolderFactory);
CoordinationServiceRecorder coordinationServiceRecorder = new CoordinationServiceRecorder(kvsRunner, backupPersister);
ScheduledExecutorService refreshExecutor = PTExecutors.newSingleThreadScheduledExecutor(new NamedThreadFactory("backupLockRefresher", true));
LockRefresher<InProgressBackupToken> lockRefresher = getLockRefresher(authHeader, atlasBackupClient, refreshExecutor);
return new AtlasBackupService(authHeader, atlasBackupClient, coordinationServiceRecorder, backupPersister, lockRefresher, refreshExecutor, completeBackupNumThreads);
}
use of com.palantir.atlasdb.backup.api.InProgressBackupToken in project atlasdb by palantir.
the class AtlasBackupService method completeBackup.
/**
* Completes backup for the given set of atlas services.
* This will store metadata about the completed backup via the BackupPersister.
* <p>
* In order to do this, we must unlock the immutable timestamp for each service. If {@link #prepareBackup(Set)}
* was not called, we will not have a record of the in-progress backup (and will not have been refreshing
* its lock anyway). Thus, we attempt to complete backup only for those atlas services where we have the in-progress
* backup stored.
*
* @return the atlas services whose backups were successfully completed
*/
public Set<AtlasService> completeBackup(Set<AtlasService> atlasServices) {
throwIfClosed(atlasServices);
AtlasServices.throwIfAtlasServicesCollide(atlasServices);
Map<AtlasService, InProgressBackupToken> knownBackups = KeyedStream.of(atlasServices).map((Function<AtlasService, InProgressBackupToken>) inProgressBackups::remove).filter(Objects::nonNull).collectToMap();
Set<InProgressBackupToken> tokens = ImmutableSet.copyOf(knownBackups.values());
if (tokens.isEmpty()) {
log.error("Complete backup called, but no in progress backups were found.", SafeArg.of("atlasServices", atlasServices));
return ImmutableSet.of();
}
lockRefresher.unregisterLocks(tokens);
Set<AtlasService> atlasServicesWithInProgressBackups = knownBackups.keySet();
if (tokens.size() < atlasServices.size()) {
Set<AtlasService> atlasServicesWithNoInProgressBackup = Sets.difference(atlasServices, atlasServicesWithInProgressBackups);
log.error("In progress backups were not found for some atlasServices. We will not complete backup for these.", SafeArg.of("numAtlasServicesWithBackup", tokens.size()), SafeArg.of("numAtlasServicesWithoutBackup", atlasServicesWithNoInProgressBackup.size()), SafeArg.of("atlasServicesWithoutBackup", atlasServicesWithNoInProgressBackup), SafeArg.of("allRequestedAtlasServices", atlasServices));
}
Map<Namespace, AtlasService> namespaceToServices = KeyedStream.of(atlasServices).mapKeys(AtlasService::getNamespace).collectToMap();
CompleteBackupRequest request = CompleteBackupRequest.of(tokens);
CompleteBackupResponse response = atlasBackupClient.completeBackup(authHeader, request);
Map<AtlasService, CompletedBackup> successfulBackups = KeyedStream.of(response.getSuccessfulBackups()).mapKeys(token -> namespaceToServices.get(token.getNamespace())).collectToMap();
Set<AtlasService> successfullyStoredBackups = storeCompletedBackups(successfulBackups);
if (successfullyStoredBackups.size() < atlasServicesWithInProgressBackups.size()) {
Set<AtlasService> failedAtlasServices = Sets.difference(atlasServicesWithInProgressBackups, successfullyStoredBackups);
log.error("Backup did not complete successfully for all atlasServices. Check TimeLock logs to debug.", SafeArg.of("failedAtlasServices", failedAtlasServices), SafeArg.of("successfulAtlasServices", successfullyStoredBackups), SafeArg.of("atlasServicesWithoutBackup", atlasServicesWithInProgressBackups));
}
return successfulBackups.keySet();
}
use of com.palantir.atlasdb.backup.api.InProgressBackupToken in project atlasdb by palantir.
the class AtlasBackupServiceTest method completeBackupReturnsSuccessfulServices.
@Test
public void completeBackupReturnsSuccessfulServices() {
InProgressBackupToken otherInProgress = inProgressBackupToken(OTHER_NAMESPACE);
Set<Namespace> namespaces = ImmutableSet.of(NAMESPACE, OTHER_NAMESPACE);
when(atlasBackupClient.prepareBackup(authHeader, PrepareBackupRequest.of(namespaces))).thenReturn(PrepareBackupResponse.of(ImmutableSet.of(IN_PROGRESS, otherInProgress)));
when(atlasBackupClient.completeBackup(authHeader, CompleteBackupRequest.of(ImmutableSet.of(IN_PROGRESS, otherInProgress)))).thenReturn(CompleteBackupResponse.of(ImmutableSet.of(completedBackup())));
Set<AtlasService> services = ImmutableSet.of(ATLAS_SERVICE, OTHER_ATLAS_SERVICE);
atlasBackupService.prepareBackup(services);
assertThat(atlasBackupService.completeBackup(services)).containsExactly(ATLAS_SERVICE);
}
use of com.palantir.atlasdb.backup.api.InProgressBackupToken in project atlasdb by palantir.
the class AtlasBackupServiceTest method completeBackupUnregistersLocks.
@Test
public void completeBackupUnregistersLocks() {
Set<AtlasService> oneService = ImmutableSet.of(ATLAS_SERVICE);
Set<Namespace> oneNamespace = ImmutableSet.of(NAMESPACE);
Set<InProgressBackupToken> tokens = ImmutableSet.of(IN_PROGRESS);
when(atlasBackupClient.prepareBackup(authHeader, PrepareBackupRequest.of(oneNamespace))).thenReturn(PrepareBackupResponse.of(tokens));
CompletedBackup completedBackup = completedBackup();
when(atlasBackupClient.completeBackup(authHeader, CompleteBackupRequest.of(tokens))).thenReturn(CompleteBackupResponse.of(ImmutableSet.of(completedBackup)));
atlasBackupService.prepareBackup(oneService);
atlasBackupService.completeBackup(oneService);
verify(lockRefresher).unregisterLocks(tokens);
}
Aggregations