Void verifyTaskGenerationAndOwnership(ConnectorTaskId id, int initialTaskGen, Callback<Void> callback) {
        Integer currentTaskGen = configState.taskConfigGeneration(id.connector());
        if (!Objects.equals(initialTaskGen, currentTaskGen)) {
            throw new ConnectException("Cannot start source task "
                + id + " with exactly-once support as the connector has already generated a new set of task configs");
        }

        if (!assignment.tasks().contains(id)) {
            throw new ConnectException("Cannot start source task "
                + id + " as it has already been revoked from this worker");
        }

        callback.onCompletion(null, null);
        return null;
    }
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