use of com.palantir.atlasdb.backup.api.CompleteBackupRequest in project atlasdb by palantir.
the class AtlasBackupService method completeBackup.
public Set<Namespace> completeBackup(Set<Namespace> namespaces) {
Set<InProgressBackupToken> tokens = namespaces.stream().map(inProgressBackups::remove).filter(Objects::nonNull).collect(Collectors.toSet());
CompleteBackupRequest request = CompleteBackupRequest.of(tokens);
CompleteBackupResponse response = atlasBackupClient.completeBackup(authHeader, request);
return response.getSuccessfulBackups().stream().peek(coordinationServiceRecorder::storeFastForwardState).peek(backupPersister::storeCompletedBackup).map(CompletedBackup::getNamespace).collect(Collectors.toSet());
}
use of com.palantir.atlasdb.backup.api.CompleteBackupRequest 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();
}
Aggregations