@Override
  public void start(Callback<None> callback) {
    LOG.info("{} enabled", _printName);

    Callback<None> prepareWarmUpCallback = new Callback<None>() {
      @Override
      public void onError(Throwable e) {
        if (e instanceof TimeoutException)
        {
          LOG.info("{} hit timeout: {}ms. The WarmUp will continue in background", _printName, _warmUpTimeoutMillis);
          callback.onSuccess(None.none());
        }
        else
        {
          LOG.error("{} failed to fetch dual read mode, continuing warmup.", _printName, e);
        }
        continueWarmUp(callback);
      }

      @Override
      public void onSuccess(None result) {
        continueWarmUp(callback);
      }
    };

    _loadBalancer.start(new Callback<None>() {
      @Override
      public void onError(Throwable e) {
        callback.onError(e);
      }

      @Override
      public void onSuccess(None result) {
        _allStartTime = _timeSupplier.get();
        _executorService.submit(() -> prepareWarmUp(prepareWarmUpCallback));
      }
    });
  }
@Test(dataProvider = "modesToSkipDataProvider", retryAnalyzer = ThreeRetries.class)
  public void testSkipWarmup(DualReadModeProvider.DualReadMode mode, Boolean isIndis)
      throws ExecutionException, InterruptedException, TimeoutException {
    int timeoutMillis = 40;
    createDefaultServicesIniFiles();
    setDualReadMode(mode);

    TestLoadBalancer balancer = new TestLoadBalancer(0, 0);
    AtomicInteger completedWarmUpCount = balancer.getCompletedRequestCount();
    LoadBalancer warmUpLb = new WarmUpLoadBalancer(balancer, balancer, Executors.newSingleThreadScheduledExecutor(),
        _tmpdir.getAbsolutePath(), MY_SERVICES_FS, _FSBasedDownstreamServicesFetcher, timeoutMillis,
        WarmUpLoadBalancer.DEFAULT_CONCURRENT_REQUESTS, _dualReadStateManager, isIndis,
        TestDataHelper.getTimeSupplier(0, TIME_FREEZED_CALL));

    FutureCallback<None> callback = new FutureCallback<>();
    warmUpLb.start(callback);

    callback.get(timeoutMillis, TimeUnit.MILLISECONDS); // skipping warmup should call back nearly immediately
    // no service data fetched
    verify(_dualReadStateManager, never()).updateCluster(any(), any());
    // warmups are not started
    Assert.assertEquals(completedWarmUpCount.get(), 0);
  }