コード例 #1
0
        public ClientHolder(ZooKeeperClientSettings settings, ILog log)
        {
            this.log      = log;
            this.settings = settings;

            state            = ClientHolderState.CreateActive(null, null, ConnectionState.Disconnected, null, settings);
            suspendedManager = new SuspendedManager(settings.Timeout, settings.Timeout.Multiply(settings.MaximumConnectPeriodMultiplier), -3);

            ZooKeeperLogInjector.Register(this, this.log);
        }
コード例 #2
0
        private bool ResetClient([NotNull] ClientHolderState currentState)
        {
            log.Info("Resetting client. Current state: '{CurrentState}'.", currentState);

            var newConnectionString = settings.ConnectionStringProvider();

            if (string.IsNullOrEmpty(newConnectionString))
            {
                log.Error("Failed to resolve any ZooKeeper replicas.");
                return(false);
            }

            var newConnectionWatcher = new ConnectionWatcher(ProcessEvent);
            var newClient            = new Lazy <ZooKeeperNetExClient>(
                () =>
            {
                using (ExecutionContext.SuppressFlow())
                {
                    return(new ZooKeeperNetExClient(
                               newConnectionString,
                               settings.ToInnerConnectionTimeout(),
                               newConnectionWatcher,
                               settings.CanBeReadOnly));
                }
            },
                LazyThreadSafetyMode.ExecutionAndPublication);

            var suspendedFor = suspendedManager.GetNextDelay();
            var newState     = suspendedFor != null && !currentState.IsSuspended
                ? ClientHolderState.CreateSuspended(suspendedFor)
                : ClientHolderState.CreateActive(newClient, newConnectionWatcher, ConnectionState.Disconnected, newConnectionString, settings);

            if (ChangeState(currentState, newState))
            {
                newState.Client?.Touch();

                // Note(kungurtsev): increase delay for each active (not suspended) client creation.
                if (!currentState.IsSuspended)
                {
                    suspendedManager.IncreaseDelay();
                }

                currentState.Dispose();
            }

            return(true);
        }