Skip to content

HBASE-23561 Look up of Region in Master by encoded region name is O(n) #1193

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 21, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,17 @@ public int compare(final RegionState l, final RegionState r) {
* RegionName -- i.e. RegionInfo.getRegionName() -- as bytes to {@link RegionStateNode}
*/
private final ConcurrentSkipListMap<byte[], RegionStateNode> regionsMap =
new ConcurrentSkipListMap<byte[], RegionStateNode>(Bytes.BYTES_COMPARATOR);
new ConcurrentSkipListMap<>(Bytes.BYTES_COMPARATOR);

/**
* this map is a hack to lookup of region in master by encoded region name is O(n).
* must put and remove with regionsMap.
*/
private final ConcurrentSkipListMap<String, RegionStateNode> encodedRegionsMap =
new ConcurrentSkipListMap<>();

private final ConcurrentSkipListMap<RegionInfo, RegionStateNode> regionInTransition =
new ConcurrentSkipListMap<RegionInfo, RegionStateNode>(RegionInfo.COMPARATOR);
new ConcurrentSkipListMap<>(RegionInfo.COMPARATOR);

/**
* Regions marked as offline on a read of hbase:meta. Unused or at least, once
Expand All @@ -101,6 +108,7 @@ public RegionStates() { }
*/
public void clear() {
regionsMap.clear();
encodedRegionsMap.clear();
regionInTransition.clear();
regionOffline.clear();
serverMap.clear();
Expand All @@ -117,8 +125,11 @@ public boolean isRegionInRegionStates(final RegionInfo hri) {
// ==========================================================================
@VisibleForTesting
RegionStateNode createRegionStateNode(RegionInfo regionInfo) {
return regionsMap.computeIfAbsent(regionInfo.getRegionName(),
key -> new RegionStateNode(regionInfo, regionInTransition));
return regionsMap.computeIfAbsent(regionInfo.getRegionName(), key -> {
final RegionStateNode node = new RegionStateNode(regionInfo, regionInTransition);
encodedRegionsMap.putIfAbsent(regionInfo.getEncodedName(), node);
return node;
});
}

public RegionStateNode getOrCreateRegionStateNode(RegionInfo regionInfo) {
Expand All @@ -136,6 +147,7 @@ public RegionStateNode getRegionStateNode(RegionInfo regionInfo) {

public void deleteRegion(final RegionInfo regionInfo) {
regionsMap.remove(regionInfo.getRegionName());
encodedRegionsMap.remove(regionInfo.getEncodedName());
// See HBASE-20860
// After master restarts, merged regions' RIT state may not be cleaned,
// making sure they are cleaned here
Expand Down Expand Up @@ -203,13 +215,11 @@ public RegionState getRegionState(final RegionInfo regionInfo) {
}

public RegionState getRegionState(final String encodedRegionName) {
// TODO: Need a map <encodedName, ...> but it is just dispatch merge...
for (RegionStateNode node: regionsMap.values()) {
if (node.getRegionInfo().getEncodedName().equals(encodedRegionName)) {
return node.toRegionState();
}
final RegionStateNode node = encodedRegionsMap.get(encodedRegionName);
if (node == null) {
return null;
}
return null;
return node.toRegionState();
}

// ============================================================================================
Expand Down