protected AddAddPacketPartResult(AddPacketPartRequest request, bool success, string storageToken, string id) { Request = request; Success = success; StorageToken = storageToken ?? throw new ArgumentNullException("storageToken"); Id = id ?? throw new ArgumentNullException("id"); }
private PacketPart Get(AgentIdentity agentId, AddPacketPartRequest request) { var now = DateTime.UtcNow; return(new PacketPart { ProviderKey = request.ProviderKey, PacketId = request.PacketId, StartPosition = request.StartPosition, EndPosition = request.EndPosition, Bytes = request.Bytes, // TODO надо бы переделать на время сервера БД CreatedTime = now, FinalPartTransferTime = request.IsFinal ? now : (DateTime?)null, AgentInfo = new ServerBundle.AgentIdentity { ComputerName = agentId.ComputerName, DomainName = agentId.DomainName, }, PreviousPartStorageToken = request.PreviousPartStorageToken, PreviousPartId = request.PreviousPartId, }); }
public async Task <AddAddPacketPartResult> AddIfNotExistsPacketPartAsync(AgentIdentity agentId, AddPacketPartRequest request, CancellationToken cancellationToken = default(CancellationToken)) { if (request == null) { throw new ArgumentException("request"); } if (!this.initialized) { await this.InitAsync(cancellationToken); } var doc = this.Get(agentId, request); try { await this.chunks.InsertOneAsync(doc, null, cancellationToken); return(AddAddPacketPartResult.SuccessResult(request, this.storageToken, doc.Id)); } catch (MongoWriteException ex) { // Instrumentation ??? var nonDupKeyExceptions = ex.WriteError.Category != ServerErrorCategory.DuplicateKey; if (nonDupKeyExceptions) { return(AddAddPacketPartResult.FailResult(request)); } // пока не удастся получить id для документа который зафейлился из exception-а // https://jira.mongodb.org/browse/SERVER-4637 var id = await this.chunks.Find(x => x.PacketId == doc.PacketId && x.StartPosition == doc.StartPosition).Project(x => x.Id).FirstOrDefaultAsync(cancellationToken); if (id == null) { return(AddAddPacketPartResult.FailResult(request)); } return(AddAddPacketPartResult.SuccessResult(request, this.storageToken, id)); } }
public static AddAddPacketPartResult FailResult(AddPacketPartRequest request) { return(new AddAddPacketPartResult(request, false, null, null)); }
public static AddAddPacketPartResult SuccessResult(AddPacketPartRequest request, string storageToken, string id) { return(new AddAddPacketPartResult(request, true, storageToken, id)); }
public async Task <AddAddPacketPartResult> AddIfNotExistsPacketPartAsync(AgentIdentity agentId, AddPacketPartRequest request, CancellationToken cancellationToken = default(CancellationToken)) { var leaseResult = this.dbClusterService.RenewLeaseReservations(); this.ThrowIfNotValid(leaseResult); // выбираем бд RoundRobin-ом var store = this.GetPacketsStore(leaseResult.ReservedServices); return(await store.AddIfNotExistsPacketPartAsync(agentId, request, cancellationToken)); }