예제 #1
0
        private async Task <DeleteContentResponse> DeleteAsync(DeleteContentRequest request, CancellationToken ct)
        {
            return(await RunFuncNoSessionAsync(
                       request.TraceId,
                       async context =>
            {
                var contentHash = request.ContentHash.ToContentHash((HashType)request.HashType);

                var deleteOptions = new DeleteContentOptions()
                {
                    DeleteLocalOnly = request.DeleteLocalOnly
                };
                var deleteResults = await Task.WhenAll <DeleteResult>(_contentStoreByCacheName.Values.Select(store => store.DeleteAsync(context.OperationContext, contentHash, deleteOptions)));

                bool succeeded = true;
                long contentSize = 0L;
                int code = (int)DeleteResult.ResultCode.ContentNotFound;
                var response = new DeleteContentResponse();
                foreach (var deleteResult in deleteResults)
                {
                    if (deleteOptions.DeleteLocalOnly)
                    {
                        succeeded &= deleteResult.Succeeded;

                        // Return the most severe result code
                        code = Math.Max(code, (int)deleteResult.Code);
                    }
                    else
                    {
                        if (deleteResult is DistributedDeleteResult distributedDeleteResult)
                        {
                            foreach (var kvp in distributedDeleteResult.DeleteMapping)
                            {
                                response.DeleteResults.Add(kvp.Key, new ResponseHeader(context.StartTime, kvp.Value.Succeeded, (int)kvp.Value.Code, kvp.Value.ErrorMessage, kvp.Value.Diagnostics));
                            }
                        }
                    }

                    contentSize = Math.Max(deleteResult.ContentSize, contentSize);
                }

                response.Header = succeeded ? ResponseHeader.Success(context.StartTime) : ResponseHeader.Failure(context.StartTime, string.Join(Environment.NewLine, deleteResults.Select(r => r.ToString())));
                response.ContentSize = contentSize;
                response.Result = code;
                return response;
            },
                       (context, errorMessage) => new DeleteContentResponse()
            {
                Header = ResponseHeader.Failure(context.StartTime, errorMessage)
            },
                       token : ct
                       ));
        }
예제 #2
0
        private async Task <DeleteContentResponse> DeleteAsync(DeleteContentRequest request, CancellationToken ct)
        {
            OperationStarted();

            DateTime startTime    = DateTime.UtcNow;
            var      cacheContext = new Context(new Guid(request.TraceId), Logger);
            var      contentHash  = request.ContentHash.ToContentHash((HashType)request.HashType);

            var deleteOptions = new DeleteContentOptions()
            {
                DeleteLocalOnly = request.DeleteLocalOnly
            };
            var deleteResults = await Task.WhenAll <DeleteResult>(_contentStoreByCacheName.Values.Select(store => store.DeleteAsync(cacheContext, contentHash, deleteOptions)));

            bool succeeded   = true;
            long evictedSize = 0L;
            long pinnedSize  = 0L;
            int  code        = (int)DeleteResult.ResultCode.ContentNotFound;

            foreach (var deleteResult in deleteResults)
            {
                succeeded   &= deleteResult.Succeeded;
                evictedSize += deleteResult.EvictedSize;
                pinnedSize  += deleteResult.PinnedSize;

                // Return the most severe result code
                code = Math.Max(code, (int)deleteResult.Code);
            }

            return(new DeleteContentResponse
            {
                Header = succeeded ? ResponseHeader.Success(startTime) : ResponseHeader.Failure(startTime, string.Join(Environment.NewLine, deleteResults.Select(r => r.ToString()))),
                EvictedSize = evictedSize,
                PinnedSize = pinnedSize,
                Result = code
            });
        }
예제 #3
0
 public Task <DeleteResult> DeleteAsync(Context context, ContentHash contentHash, DeleteContentOptions deleteOptions)
 {
     throw new NotImplementedException();
 }
예제 #4
0
        /// <inheritdoc />
        public Task <DeleteResult> DeleteAsync(Context context, ContentHash contentHash, DeleteContentOptions deleteOptions)
        {
            if (_cache is IContentStore contentStore)
            {
                return(contentStore.DeleteAsync(context, contentHash, deleteOptions));
            }

            return(Task.FromResult(new DeleteResult(DeleteResult.ResultCode.Error, "Not implemented")));
        }
 /// <inheritdoc />
 public Task <DeleteResult> DeleteAsync(Context context, ContentHash contentHash, DeleteContentOptions deleteOptions = null)
 {
     return(Store.DeleteAsync(context, contentHash, deleteOptions));
 }
예제 #6
0
 /// <inheritdoc />
 public Task <DeleteResult> DeleteAsync(Context context, ContentHash contentHash, DeleteContentOptions deleteOptions = null)
 {
     return(Task.FromResult(new DeleteResult(DeleteResult.ResultCode.ContentNotDeleted, FailureMessage)));
 }
예제 #7
0
 /// <inheritdoc />
 Task <DeleteResult> IContentStore.DeleteAsync(Context context, ContentHash contentHash, DeleteContentOptions deleteOptions) => Task.FromResult(new DeleteResult(DeleteResult.ResultCode.ContentNotDeleted, $"{nameof(ReadOnlyEmptyContentStore)} cannot contain any content to delete"));
 /// <inheritdoc />
 public Task <DeleteResult> DeleteAsync(Context context, ContentHash contentHash, DeleteContentOptions deleteOptions = null) => _innerStore.DeleteAsync(context, contentHash, deleteOptions);
예제 #9
0
        /// <inheritdoc />
        public Task <DeleteResult> DeleteAsync(Context context, ContentHash contentHash, DeleteContentOptions deleteOptions)
        {
            var operationContext = OperationContext(context);

            deleteOptions ??= new DeleteContentOptions()
            {
                DeleteLocalOnly = true
            };

            return(operationContext.PerformOperationAsync(Tracer,
                                                          async() =>
            {
                var deleteResult = await InnerContentStore.DeleteAsync(context, contentHash, deleteOptions);
                var contentHashes = new ContentHash[] { contentHash };
                if (!deleteResult)
                {
                    return deleteResult;
                }

                // Tell the event hub that this machine has removed the content locally
                var unRegisterResult = await UnregisterAsync(context, contentHashes, operationContext.Token).ThrowIfFailure();
                if (!unRegisterResult)
                {
                    return new DeleteResult(unRegisterResult, unRegisterResult.ToString());
                }

                if (deleteOptions.DeleteLocalOnly)
                {
                    return deleteResult;
                }

                var result = await _contentLocationStore.GetBulkAsync(context, contentHashes, operationContext.Token, UrgencyHint.Nominal, GetBulkOrigin.Local);
                if (!result)
                {
                    return new DeleteResult(result, result.ToString());
                }

                // Go through each machine that has this content, and delete async locally on each machine.
                if (result.ContentHashesInfo.Count == 1 && result.ContentHashesInfo.ElementAt(0).Locations != null)
                {
                    var machineLocations = result.ContentHashesInfo[0].Locations;
                    return await _distributedCopier.DeleteAsync(operationContext, contentHash, machineLocations);
                }

                return deleteResult;
            }));
        }
예제 #10
0
 Task <DeleteResult> IDeleteFileHandler.HandleDeleteAsync(Context context, ContentHash contentHash, DeleteContentOptions deleteOptions) => DeleteAsync(context, contentHash, deleteOptions);