code: protected synchronized ApiFuture<List<HRegionLocation>> getRegionsAsync(boolean reload) {
      // If we don't need to refresh and we have a recent enough version, just use that.
      if (!reload && regionsFuture != null &&
          regionsFetchTimeMillis + MAX_REGION_AGE_MILLIS > System.currentTimeMillis()) {
        return this.regionsFuture;
      }
  
      LOG.debug("Sampling rowkeys for table %s", bigtableTableName.toString());
  
      try {
        ApiFuture<List<KeyOffset>> future =
            client.sampleRowKeysAsync(bigtableTableName.getTableId());
        this.regionsFuture = ApiFutures.transform(future, new ApiFunction<List<KeyOffset>, List<HRegionLocation>>() {
              @Override
              public List<HRegionLocation> apply(@Nullable List<KeyOffset> input) {
                return adapter.adaptResponse(input);
              }
            }, MoreExecutors.directExecutor());
        ApiFutures.addCallback(this.regionsFuture, new ApiFutureCallback<List<HRegionLocation>>() {
          @Override public void onSuccess(@Nullable List<HRegionLocation> result) {
          }
          @Override public void onFailure(Throwable t) {
            synchronized (AbstractBigtableRegionLocator.this) {
              regionsFuture = null;
            }
          }
        }, MoreExecutors.directExecutor());
        regionsFetchTimeMillis = System.currentTimeMillis();
        return this.regionsFuture;
      } catch(Throwable throwable) {
        regionsFuture = null;
        Futures.immediateFailedFuture(throwable);
      }
      return regionsFuture;
    }
docs: The list of regions will be sorted and cover all the possible rows.
  @param reload a boolean field.
  @return a {@link List} object.