private synchronized void checkTimeouts() throws Exception {
   long elapsed = System.currentTimeMillis() - connectionStartMs;
   if (elapsed >= Math.min(sessionTimeoutMs, connectionTimeoutMs)) {
     if (zooKeeper.hasNewConnectionString()) {
       handleNewConnectionString();
     } else if (elapsed > sessionTimeoutMs) {
       if (!Boolean.getBoolean(DebugUtils.PROPERTY_DONT_LOG_CONNECTION_ISSUES)) {
         log.warn(
             String.format(
                 "Connection attempt unsuccessful after %d (greater than session timeout of %d). Resetting connection and trying again with a new connection.",
                 elapsed, sessionTimeoutMs));
       }
       reset();
     } else {
       KeeperException.ConnectionLossException connectionLossException =
           new KeeperException.ConnectionLossException();
       if (!Boolean.getBoolean(DebugUtils.PROPERTY_DONT_LOG_CONNECTION_ISSUES)) {
         log.error(
             String.format(
                 "Connection timed out for connection string (%s) and timeout (%d) / elapsed (%d)",
                 zooKeeper.getConnectionString(), connectionTimeoutMs, elapsed),
             connectionLossException);
       }
       tracer.get().addCount("connections-timed-out", 1);
       throw connectionLossException;
     }
   }
 }
  private boolean checkState(Event.KeeperState state, boolean wasConnected) {
    boolean isConnected = wasConnected;
    boolean checkNewConnectionString = true;
    switch (state) {
      default:
      case Disconnected:
        {
          isConnected = false;
          break;
        }

      case SyncConnected:
      case ConnectedReadOnly:
        {
          isConnected = true;
          break;
        }

      case AuthFailed:
        {
          isConnected = false;
          log.error("Authentication failed");
          break;
        }

      case Expired:
        {
          isConnected = false;
          checkNewConnectionString = false;
          handleExpiredSession();
          break;
        }

      case SaslAuthenticated:
        {
          // NOP
          break;
        }
    }

    if (checkNewConnectionString && zooKeeper.hasNewConnectionString()) {
      handleNewConnectionString();
    }

    return isConnected;
  }