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