code: private synchronized void startQuerying() {
      boolean consistentSnapshotFirstQueryHasRun = false;
      for ( Forest forest : getForestConfig().listForests() ) {
        QueryTask runnable = new QueryTask(getMoveMgr(), this, forest, query, 1, 1);
        if ( consistentSnapshot == true && consistentSnapshotFirstQueryHasRun == false ) {
          // let's run this first time in-line so we'll have the serverTimestamp set
          // before we launch all the parallel threads
          runnable.run();
          consistentSnapshotFirstQueryHasRun = true;
        } else {
          threadPool.execute(runnable);
        }
      }
    }
docs: /* All we do to startQuerying is create a task per forest that queries that
  forest for the first page of results, then spawns a new task to query for
  the next page of results, etc.  Tasks are handled by threadPool which is a
  slightly modified ThreadPoolExecutor with threadCount threads.  We don't
  know whether we're at the end of the result set from a forest until we get
  the last batch that isn't full (batch size != batchSize).  Therefore, any
  error to retrieve a batch might prevent us from getting the next batch and
  all remaining batches.  To mitigate the risk of one error effectively
  cancelling the rest of the pagination for that forest,
  HostAvailabilityListener is configured to retry any batch that encounters
  a "host unavailable" error (see HostAvailabilityListener for more
  details).  HostAvailabilityListener is also intended to act as an example
  so comparable client-specific listeners can be built to handle other
  failure scenarios and retry those batches.