public async Task<HttpResponseMessage> Manifest(string id) { var filename = Uri.UnescapeDataString(id); FileAndPages fileAndPages = null; try { Storage.Batch(accessor => fileAndPages = accessor.GetFile(filename, 0, 0)); } catch (FileNotFoundException) { Log.Debug("Signature manifest for a file '{0}' was not found", filename); return Request.CreateResponse(HttpStatusCode.NotFound); } long? fileLength = fileAndPages.TotalSize; using (var signatureRepository = new StorageSignatureRepository(Storage, filename)) { var rdcManager = new LocalRdcManager(signatureRepository, Storage, SigGenerator); var signatureManifest = await rdcManager.GetSignatureManifestAsync( new DataInfo { Name = filename, CreatedAt = Convert.ToDateTime(fileAndPages.Metadata.Value<string>("Last-Modified")) .ToUniversalTime() }); signatureManifest.FileLength = fileLength ?? 0; Log.Debug("Signature manifest for a file '{0}' was downloaded. Signatures count was {1}", filename, signatureManifest.Signatures.Count); return this.GetMessageWithObject(signatureManifest, HttpStatusCode.OK); } }
public override async Task<SynchronizationReport> PerformAsync(RavenFileSystemClient.SynchronizationClient destination) { AssertLocalFileExistsAndIsNotConflicted(FileMetadata); var destinationMetadata = await destination.GetMetadataForAsync(FileName); if (destinationMetadata == null) { // if file doesn't exist on destination server - upload it there return await UploadToAsync(destination); } var destinationServerRdcStats = await destination.GetRdcStatsAsync(); if (!IsRemoteRdcCompatible(destinationServerRdcStats)) throw new SynchronizationException("Incompatible RDC version detected on destination server"); var conflict = CheckConflictWithDestination(FileMetadata, destinationMetadata, ServerInfo.FileSystemUrl); if (conflict != null) return await ApplyConflictOnDestinationAsync(conflict, destination, ServerInfo.FileSystemUrl, 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(destination, 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); } }
public async Task<HttpResponseMessage> Manifest(string id) { var canonicalFilename = FileHeader.Canonize(id); FileAndPagesInformation fileAndPages = null; try { Storage.Batch(accessor => fileAndPages = accessor.GetFile(canonicalFilename, 0, 0)); } catch (FileNotFoundException) { Log.Debug("Signature manifest for a file '{0}' was not found", id); return Request.CreateResponse(HttpStatusCode.NotFound); } long? fileLength = fileAndPages.TotalSize; using (var signatureRepository = new StorageSignatureRepository(Storage, canonicalFilename)) { var rdcManager = new LocalRdcManager(signatureRepository, Storage, SigGenerator); var signatureManifest = await rdcManager.GetSignatureManifestAsync( new DataInfo { Name = canonicalFilename, LastModified = fileAndPages.Metadata.Value<DateTime>(Constants.LastModified) .ToUniversalTime() }); signatureManifest.FileLength = fileLength ?? 0; Log.Debug("Signature manifest for a file '{0}' was downloaded. Signatures count was {1}", id, signatureManifest.Signatures.Count); return GetMessageWithObject(signatureManifest) .WithNoCache(); } }