Esempio n. 1
0
        private async Task TryHandleDepositAsync(IDepositNodesHandler deposit, bool isRetry = false)
        {
            if (_logger.IsTrace)
            {
                _logger.Trace($"Started handling consumed units for deposit: '{deposit.DepositId}'.");
            }
            if (deposit.ConsumedAll || await _receiptsPolicies.CanRequestReceipts(deposit.UnpaidUnits, deposit.UnitPrice))
            {
                await RequestReceiptsAsync(deposit);
            }

            if (deposit.ConsumedAll || await _receiptsPolicies.CanMergeReceipts(deposit.UnmergedUnits, deposit.UnitPrice))
            {
                await TryMergeReceiptsAsync(deposit);
            }

            await TryClaimPaymentAsync(deposit);

            if (_logger.IsTrace)
            {
                _logger.Trace($"Finished handling consumed units for deposit: '{deposit.DepositId}'.");
            }
            if (isRetry)
            {
                return;
            }

            if (!deposit.ConsumedAll)
            {
                return;
            }

            if (deposit.HasClaimedAllUnits)
            {
                if (_logger.IsInfo)
                {
                    _logger.Info($"Last payment claim for deposit: '{deposit.DepositId}' was already processed.");
                }

                return;
            }

            deposit.FinishHandling();
            while (deposit.CurrentLastClaimRetry < LastClaimRetries)
            {
                if (_logger.IsInfo)
                {
                    _logger.Info($"Missing payment claim for deposit: '{deposit.DepositId}', retry {deposit.CurrentLastClaimRetry + 1}/{LastClaimRetries}.");
                }
                foreach (ConsumerNode node in _sessionManager.GetConsumerNodes(deposit.DepositId))
                {
                    ProviderSession?session = node.GetSession(deposit.DepositId);
                    if (session is null)
                    {
                        if (_logger.IsInfo)
                        {
                            _logger.Info($"Session was not found for deposit: '{deposit.DepositId}', node: '{node.Peer.NodeId}'.");
                        }
                        continue;
                    }

                    if (_logger.IsInfo)
                    {
                        _logger.Info($"Consumer: '{node.Peer.NodeId}', session: '{session.Id}' has {session.UnpaidUnits} unpaid units.");
                    }
                }
                await TryHandleDepositAsync(deposit, true);

                deposit.IncrementLastClaimRetries();
                if (deposit.HasClaimedAllUnits)
                {
                    return;
                }
            }
        }