001/**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.client;
019
020import java.util.Arrays;
021import java.util.List;
022import java.util.concurrent.CompletableFuture;
023import org.apache.hadoop.hbase.AsyncMetaTableAccessor;
024import org.apache.hadoop.hbase.HRegionLocation;
025import org.apache.hadoop.hbase.TableName;
026import org.apache.yetus.audience.InterfaceAudience;
027
028/**
029 * The implementation of AsyncRegionLocator.
030 */
031@InterfaceAudience.Private
032class AsyncTableRegionLocatorImpl implements AsyncTableRegionLocator {
033
034  private final TableName tableName;
035
036  private final AsyncConnectionImpl conn;
037
038  public AsyncTableRegionLocatorImpl(TableName tableName, AsyncConnectionImpl conn) {
039    this.tableName = tableName;
040    this.conn = conn;
041  }
042
043  @Override
044  public TableName getName() {
045    return tableName;
046  }
047
048  @Override
049  public CompletableFuture<HRegionLocation> getRegionLocation(byte[] row, int replicaId,
050      boolean reload) {
051    return conn.getLocator().getRegionLocation(tableName, row, replicaId, RegionLocateType.CURRENT,
052      reload, -1L);
053  }
054
055  @Override
056  public CompletableFuture<List<HRegionLocation>> getAllRegionLocations() {
057    if (TableName.isMetaTableName(tableName)) {
058      return conn.registry.getMetaRegionLocations()
059        .thenApply(locs -> Arrays.asList(locs.getRegionLocations()));
060    }
061    return AsyncMetaTableAccessor.getTableHRegionLocations(conn.getTable(TableName.META_TABLE_NAME),
062      tableName);
063  }
064
065  @Override
066  public CompletableFuture<List<HRegionLocation>> getRegionLocations(byte[] row, boolean reload) {
067    return conn.getLocator()
068      .getRegionLocations(tableName, row, RegionLocateType.CURRENT, reload, -1L)
069      .thenApply(locs -> Arrays.asList(locs.getRegionLocations()));
070  }
071
072  @Override
073  public void clearRegionLocationCache() {
074    conn.getLocator().clearCache(tableName);
075  }
076}