private void reconfigureConnectorTasksWithExponentialBackoffRetries(long initialRequestTime, final String connName, ExponentialBackoff exponentialBackoff, int attempts) {
        reconfigureConnector(connName, (error, result) -> {
            // If we encountered an error, we don't have much choice but to just retry. If we don't, we could get
            // stuck with a connector that thinks it has generated tasks, but wasn't actually successful and therefore
            // never makes progress. The retry has to run through a DistributedHerderRequest since this callback could be happening
            // from the HTTP request forwarding thread.
            if (error != null) {
                if (isPossibleExpiredKeyException(initialRequestTime, error)) {
                    log.debug("Failed to reconfigure connector's tasks ({}), possibly due to expired session key. Retrying after backoff", connName);
                } else if (error instanceof TooManyTasksException) {
                    log.debug("Connector {} generated too many tasks; will not retry configuring connector", connName);
                    return;
                } else {
                    log.error("Failed to reconfigure connector's tasks ({}), retrying after backoff.", connName, error);
                }
                addRequest(exponentialBackoff.backoff(attempts),
                    () -> {
                        reconfigureConnectorTasksWithExponentialBackoffRetries(initialRequestTime, connName, exponentialBackoff, attempts + 1);
                        return null;
                    }, (err, res) -> {
                        if (err != null) {
                            log.error("Unexpected error during connector task reconfiguration: ", err);
                            log.error("Task reconfiguration for {} failed unexpectedly, this connector will not be properly reconfigured unless manually triggered.", connName);
                        }
                    }
                );
            }
        });
    }
Request task configs from the connector and write them to the config storage in case the configs are detected to
have changed. This method retries infinitely with exponential backoff in case of any errors.

@param initialRequestTime the time in milliseconds when the original request was made (i.e. before any retries)
@param connName the name of the connector
@param exponentialBackoff {@link ExponentialBackoff} used to calculate the retry backoff duration
@param attempts the number of retry attempts that have been made
connect/runtime/src/main/java/org/apache/kafka/connect/runtime/distributed/DistributedHerder.java