public ConnectUploadResponse connect()

in src/main/java/com/uber/rss/clients/ServerBusyRetriableWriteClient.java [53:100]


    public ConnectUploadResponse connect() {
        metrics = new WriteClientMetrics(new WriteClientMetricsKey(
                this.getClass().getSimpleName(), user));

        long startTime = System.currentTimeMillis();
        long waitMillis = 1000;
        int maxTryTimes = 1000;

        int numTried = 0;
        ConnectUploadResponse serverVerboseInfo = null;
        for (; numTried < maxTryTimes; numTried++) {
            if (numTried > 0) {
                metrics.getNumRetries().inc(1);
            }

            try {
                delegate = creator.call();
            } catch (Exception e) {
                throw new RssException("Failed to create writer client", e);
            }

            try {
                serverVerboseInfo = delegate.connect();
                break;
            } catch (RssServerBusyException ex) {
                if (System.currentTimeMillis() - startTime < maxTryingMillis) {
                    logger.info(String.format("Server busy, will close current client and wait %s milliseconds to retry", waitMillis));
                    closeDelegate();
                    delegate = null;
                    try {
                        Thread.sleep(waitMillis);
                    } catch (InterruptedException e) {
                        logger.warn("Interrupted while waiting to retry", e);
                    }
                    // Reduce wait time to maxTryingMillis/10 if it becomes too large. This is to avoid very long wait.
                    waitMillis = Math.min(waitMillis * 2, maxTryingMillis / 10);
                } else {
                    throw ex;
                }
            }
        }

        if (delegate == null) {
            throw new RssException(String.format("Failed to create and initialize client after trying %s times", numTried));
        }

        return serverVerboseInfo;
    }