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); }
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); }