public override async Task<SynchronizationReport> PerformAsync(string destination)
{
AssertLocalFileExistsAndIsNotConflicted(FileMetadata);
var destinationRavenFileSystemClient = new RavenFileSystemClient(destination);
var destinationMetadata = await destinationRavenFileSystemClient.GetMetadataForAsync(FileName);
if (destinationMetadata == null)
{
// if file doesn't exist on destination server - upload it there
return await UploadToAsync(destination);
}
var destinationServerRdcStats = await destinationRavenFileSystemClient.Synchronization.GetRdcStatsAsync();
if (!IsRemoteRdcCompatible(destinationServerRdcStats))
throw new SynchronizationException("Incompatible RDC version detected on destination server");
var conflict = CheckConflictWithDestination(FileMetadata, destinationMetadata, ServerInfo.Url);
if (conflict != null)
return await ApplyConflictOnDestinationAsync(conflict, destination, ServerInfo.Url, log);
using (var localSignatureRepository = new StorageSignatureRepository(Storage, FileName))
using (var remoteSignatureCache = new VolatileSignatureRepository(FileName))
{
var localRdcManager = new LocalRdcManager(localSignatureRepository, Storage, sigGenerator);
var destinationRdcManager = new RemoteRdcManager(destinationRavenFileSystemClient, localSignatureRepository,
remoteSignatureCache);
log.Debug("Starting to retrieve signatures of a local file '{0}'.", FileName);
Cts.Token.ThrowIfCancellationRequested();
// first we need to create a local file signatures before we synchronize with remote ones
var localSignatureManifest = await localRdcManager.GetSignatureManifestAsync(FileDataInfo);
log.Debug("Number of a local file '{0}' signatures was {1}.", FileName, localSignatureManifest.Signatures.Count);
if (localSignatureManifest.Signatures.Count > 0)
{
var destinationSignatureManifest = await destinationRdcManager.SynchronizeSignaturesAsync(FileDataInfo, Cts.Token);
if (destinationSignatureManifest.Signatures.Count > 0)
{
return
await
SynchronizeTo(destination, localSignatureRepository, remoteSignatureCache, localSignatureManifest,
destinationSignatureManifest);
}
}
return await UploadToAsync(destination);
}
}