Пример #1
0
        private async Task TryConn(int retryCount, CancellationToken token)
        {
            var ipAddress = IPAddress.TryParse(Host, out var ip)
                ? ip
                : (await Dns.GetHostEntryAsync(Host)).AddressList.FirstOrDefault();
            var backoff = TimeSpan.FromMilliseconds(100);

            for (var i = 0; i < retryCount && token.IsCancellationRequested == false; i++)
            {
                try
                {
                    await _socket.ConnectAsync(ipAddress, Port);

                    _logger.LogInformation($"Connect to the RegionServer({Type}) at {Host}:{Port}");
                    return;
                }
                catch (Exception e)
                {
                    _logger.LogWarning($"Connect RegionServer({Host}:{Port}) failed in {i + 1}th,try the locate again after {backoff}.\n{e}");
                    backoff = await TaskEx.SleepAndIncreaseBackoff(backoff, TimeSpan.FromSeconds(5), token);
                }
            }

            _logger.LogError($"Connect RegionServer({Host}:{Port}) failed.");
        }
Пример #2
0
        private async Task <(RegionClient client, RegionInfo info)> TryLocateRegion(ICall rpc, CancellationToken token)
        {
            var backoff = BackoffStart;

            while (rpc.FindRegionRetryCount < RetryCount && token.IsCancellationRequested == false)
            {
                rpc.FindRegionRetryCount++;
                var reg = await FindRegionInfoForRPC(rpc.Table, rpc.Key, token);

                if (reg == null)
                {
                    _logger.LogWarning($"Locate region failed in {rpc.FindRegionRetryCount}th,try the locate again after {backoff}.");
                    backoff = await TaskEx.SleepAndIncreaseBackoff(backoff, BackoffIncrease, token);

                    continue;
                }

                var client = _cache.GetClient(reg.Host, reg.Port)
                             ?? await new RegionClient(reg.Host, reg.Port, RegionType.ClientService)
                {
                    TimeOut       = Timeout,
                    EffectiveUser = EffectiveUser,
                    CallQueueSize = CallQueueSize
                }
                .Build(RetryCount, token);
                reg.Client = client;
                return(client, reg);
            }
            return(null, null);
        }
Пример #3
0
        protected async Task <TResult> TryLocateResource <TResult>(string resource, Func <byte[], TResult> getResultFunc, CancellationToken token)
        {
            var zkc     = _zkHelper.CreateClient(ZkQuorum, Timeout);
            var backoff = BackoffStart;
            var result  = default(TResult);

            for (var i = 0; i < RetryCount && token.IsCancellationRequested == false; i++)
            {
                result = await _zkHelper.LocateResource(zkc, resource, getResultFunc);

                if (result == null)
                {
                    _logger.LogWarning($"Locate {resource} failed in {i + 1}th,try the locate again after {backoff}.");
                    backoff = await TaskEx.SleepAndIncreaseBackoff(backoff, BackoffIncrease, token);
                }
                else
                {
                    break;
                }
            }

            await zkc.closeAsync();

            if (result == null)
            {
                _logger.LogWarning(
                    $"Locate {resource} failed in {RetryCount}th, please check your network.");
            }
            return(result);
        }
Пример #4
0
        private async Task <bool> CheckProcedureWithBackoff(ulong procId, CancellationToken token)
        {
            var backoff = BackoffStart;
            var oldTime = DateTime.Now;

            while (DateTime.Now - oldTime < Timeout)
            {
                var req = new GetProcedureStateCall(procId);
                await _adminClient.QueueRPC(req);

                var res = await _adminClient.GetRPCResult(req.CallId);

                if (res == null)
                {
                    return(false);
                }

                if (res.Msg is GetProcedureResultResponse rep)
                {
                    switch (rep.State)
                    {
                    case GetProcedureResultResponse.Types.State.NotFound:
                        return(false);

                    case GetProcedureResultResponse.Types.State.Finished:
                        return(true);
                    }
                }
                else if (res.Error != null)
                {
                    switch (res.Error)
                    {
                    case DoNotRetryIOException _:
                        return(false);
                    }
                }
                backoff = await TaskEx.SleepAndIncreaseBackoff(backoff, BackoffIncrease, token);
            }

            return(false);
        }