Skip to content

Commit 623f8af

Browse files
authored
HBASE-26649 Support meta replica LoadBalance mode for RegionLocator#getAllRegionLocations() (#4442)
Signed-off-by: Duo Zhang <zhangduo@apache.org>
1 parent 1be2c83 commit 623f8af

File tree

5 files changed

+52
-9
lines changed

5 files changed

+52
-9
lines changed

hbase-client/src/main/java/org/apache/hadoop/hbase/client/CatalogReplicaMode.java renamed to hbase-client/src/main/java/org/apache/hadoop/hbase/CatalogReplicaMode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* See the License for the specific language governing permissions and
1616
* limitations under the License.
1717
*/
18-
package org.apache.hadoop.hbase.client;
18+
package org.apache.hadoop.hbase;
1919

2020
import org.apache.yetus.audience.InterfaceAudience;
2121

@@ -33,7 +33,7 @@
3333
* </ol>
3434
*/
3535
@InterfaceAudience.Private
36-
enum CatalogReplicaMode {
36+
public enum CatalogReplicaMode {
3737
NONE {
3838
@Override
3939
public String toString() {

hbase-client/src/main/java/org/apache/hadoop/hbase/ClientMetaTableAccessor.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
package org.apache.hadoop.hbase;
1919

20+
import static org.apache.hadoop.hbase.client.RegionLocator.LOCATOR_META_REPLICAS_MODE;
2021
import static org.apache.hadoop.hbase.util.FutureUtils.addListener;
2122

2223
import java.io.Closeable;
@@ -26,6 +27,7 @@
2627
import java.util.List;
2728
import java.util.Optional;
2829
import java.util.concurrent.CompletableFuture;
30+
import java.util.concurrent.ThreadLocalRandom;
2931
import java.util.stream.Collectors;
3032
import org.apache.hadoop.hbase.client.AdvancedScanResultConsumer;
3133
import org.apache.hadoop.hbase.client.AsyncTable;
@@ -257,7 +259,37 @@ private static CompletableFuture<Void> scanMeta(AsyncTable<AdvancedScanResultCon
257259
}
258260

259261
CompletableFuture<Void> future = new CompletableFuture<Void>();
260-
metaTable.scan(scan, new MetaTableScanResultConsumer(rowUpperLimit, visitor, future));
262+
// Get the region locator's meta replica mode.
263+
CatalogReplicaMode metaReplicaMode = CatalogReplicaMode.fromString(metaTable.getConfiguration()
264+
.get(LOCATOR_META_REPLICAS_MODE, CatalogReplicaMode.NONE.toString()));
265+
266+
if (metaReplicaMode == CatalogReplicaMode.LOAD_BALANCE) {
267+
addListener(metaTable.getDescriptor(), (desc, error) -> {
268+
if (error != null) {
269+
LOG.error("Failed to get meta table descriptor, error: ", error);
270+
future.completeExceptionally(error);
271+
return;
272+
}
273+
274+
int numOfReplicas = desc.getRegionReplication();
275+
if (numOfReplicas > 1) {
276+
int replicaId = ThreadLocalRandom.current().nextInt(numOfReplicas);
277+
278+
// When the replicaId is 0, do not set to Consistency.TIMELINE
279+
if (replicaId > 0) {
280+
scan.setReplicaId(replicaId);
281+
scan.setConsistency(Consistency.TIMELINE);
282+
}
283+
}
284+
metaTable.scan(scan, new MetaTableScanResultConsumer(rowUpperLimit, visitor, future));
285+
});
286+
} else {
287+
if (metaReplicaMode == CatalogReplicaMode.HEDGED_READ) {
288+
scan.setConsistency(Consistency.TIMELINE);
289+
}
290+
metaTable.scan(scan, new MetaTableScanResultConsumer(rowUpperLimit, visitor, future));
291+
}
292+
261293
return future;
262294
}
263295

hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncNonMetaRegionLocator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import java.util.concurrent.TimeUnit;
5151
import org.apache.commons.lang3.ObjectUtils;
5252
import org.apache.hadoop.hbase.CatalogFamilyFormat;
53+
import org.apache.hadoop.hbase.CatalogReplicaMode;
5354
import org.apache.hadoop.hbase.HBaseIOException;
5455
import org.apache.hadoop.hbase.HConstants;
5556
import org.apache.hadoop.hbase.HRegionLocation;

hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import java.util.concurrent.ThreadLocalRandom;
3838
import java.util.stream.IntStream;
3939
import org.apache.hadoop.conf.Configuration;
40+
import org.apache.hadoop.hbase.CatalogReplicaMode;
4041
import org.apache.hadoop.hbase.HBaseClassTestRule;
4142
import org.apache.hadoop.hbase.HBaseTestingUtil;
4243
import org.apache.hadoop.hbase.HRegionLocation;

hbase-server/src/test/java/org/apache/hadoop/hbase/replication/regionserver/TestMetaRegionReplicaReplication.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.apache.hadoop.hbase.client.ConnectionFactory;
4444
import org.apache.hadoop.hbase.client.Get;
4545
import org.apache.hadoop.hbase.client.RegionInfo;
46+
import org.apache.hadoop.hbase.client.RegionLocator;
4647
import org.apache.hadoop.hbase.client.Result;
4748
import org.apache.hadoop.hbase.client.Scan;
4849
import org.apache.hadoop.hbase.client.Table;
@@ -396,11 +397,8 @@ private void primaryIncreaseReplicaNoChange(final long[] before, final long[] af
396397
}
397398

398399
private void primaryIncreaseReplicaIncrease(final long[] before, final long[] after) {
399-
// There are read requests increase for primary meta replica.
400-
assertTrue(after[RegionInfo.DEFAULT_REPLICA_ID] > before[RegionInfo.DEFAULT_REPLICA_ID]);
401-
402-
// There are read requests incrase for meta replica regions.
403-
for (int i = 1; i < after.length; i++) {
400+
// There are read requests increase for all meta replica regions,
401+
for (int i = 0; i < after.length; i++) {
404402
assertTrue(after[i] > before[i]);
405403
}
406404
}
@@ -420,6 +418,7 @@ public void testHBaseMetaReplicaGets() throws Exception {
420418
final Region[] metaRegions = getAllRegions(TableName.META_TABLE_NAME, numOfMetaReplica);
421419
long[] readReqsForMetaReplicas = new long[numOfMetaReplica];
422420
long[] readReqsForMetaReplicasAfterGet = new long[numOfMetaReplica];
421+
long[] readReqsForMetaReplicasAfterGetAllLocations = new long[numOfMetaReplica];
423422
long[] readReqsForMetaReplicasAfterMove = new long[numOfMetaReplica];
424423
long[] readReqsForMetaReplicasAfterSecondMove = new long[numOfMetaReplica];
425424
long[] readReqsForMetaReplicasAfterThirdGet = new long[numOfMetaReplica];
@@ -468,6 +467,16 @@ public void testHBaseMetaReplicaGets() throws Exception {
468467
// There are more reads against all meta replica regions, including the primary region.
469468
primaryIncreaseReplicaIncrease(readReqsForMetaReplicas, readReqsForMetaReplicasAfterGet);
470469

470+
RegionLocator locator = tableForGet.getRegionLocator();
471+
472+
for (int j = 0; j < numOfMetaReplica * 3; j ++) {
473+
locator.getAllRegionLocations();
474+
}
475+
476+
getMetaReplicaReadRequests(metaRegions, readReqsForMetaReplicasAfterGetAllLocations);
477+
primaryIncreaseReplicaIncrease(readReqsForMetaReplicasAfterGet,
478+
readReqsForMetaReplicasAfterGetAllLocations);
479+
471480
// move one of regions so it meta cache may be invalid.
472481
HTU.moveRegionAndWait(userRegion.getRegionInfo(), destRs.getServerName());
473482

@@ -477,7 +486,7 @@ public void testHBaseMetaReplicaGets() throws Exception {
477486

478487
// There are read requests increase for primary meta replica.
479488
// For rest of meta replicas, there is no change as regionMove will tell the new location
480-
primaryIncreaseReplicaNoChange(readReqsForMetaReplicasAfterGet,
489+
primaryIncreaseReplicaNoChange(readReqsForMetaReplicasAfterGetAllLocations,
481490
readReqsForMetaReplicasAfterMove);
482491
// Move region again.
483492
HTU.moveRegionAndWait(userRegion.getRegionInfo(), srcRs.getServerName());

0 commit comments

Comments
 (0)