@Override public synchronized void onLogResponse(LogSyncResponse logSyncResponse) throws IOException { if (logSyncResponse.getDeliveryStatuses() != null) { boolean isAlreadyScheduled = false; for (LogDeliveryStatus response : logSyncResponse.getDeliveryStatuses()) { if (response.getResult() == SyncResponseResultType.SUCCESS) { storage.removeRecordBlock(response.getRequestId()); } else { storage.notifyUploadFailed(response.getRequestId()); final LogDeliveryErrorCode errorCode = response.getErrorCode(); final LogFailoverCommand controller = this.controller; executorContext .getCallbackExecutor() .execute( new Runnable() { @Override public void run() { strategy.onFailure(controller, errorCode); } }); isAlreadyScheduled = true; } LOG.info("Removing bucket id from timeouts: {}", response.getRequestId()); timeouts.remove(response.getRequestId()); } if (!isAlreadyScheduled) { processUploadDecision(strategy.isUploadNeeded(storage.getStatus())); } } }