Ejemplo n.º 1
0
 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");
 }
Ejemplo n.º 2
0
        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,
            });
        }
Ejemplo n.º 3
0
        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));
            }
        }
Ejemplo n.º 4
0
 public static AddAddPacketPartResult FailResult(AddPacketPartRequest request)
 {
     return(new AddAddPacketPartResult(request, false, null, null));
 }
Ejemplo n.º 5
0
 public static AddAddPacketPartResult SuccessResult(AddPacketPartRequest request, string storageToken, string id)
 {
     return(new AddAddPacketPartResult(request, true, storageToken, id));
 }
Ejemplo n.º 6
0
        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));
        }