You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2010/07/13 21:36:53 UTC
svn commit: r963831 - in /hbase/branches/0.20: CHANGES.txt
src/java/org/apache/hadoop/hbase/master/RegionManager.java
Author: stack
Date: Tue Jul 13 19:36:52 2010
New Revision: 963831
URL: http://svn.apache.org/viewvc?rev=963831&view=rev
Log:
HBASE-2802 Stop daughter regions both being assigned same server
Modified:
hbase/branches/0.20/CHANGES.txt
hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java
Modified: hbase/branches/0.20/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/branches/0.20/CHANGES.txt?rev=963831&r1=963830&r2=963831&view=diff
==============================================================================
--- hbase/branches/0.20/CHANGES.txt (original)
+++ hbase/branches/0.20/CHANGES.txt Tue Jul 13 19:36:52 2010
@@ -6,6 +6,7 @@ Release 0.20.6 - Unreleased
HBASE-2786 TestHLog.testSplit hangs
HBASE-2797 Another NPE in ReadWriteConsistencyControl
HBASE-2796 Backport of 2707 to 0.20 branch
+ HBASE-2802 Stop daughter regions both being assigned same server
Release 0.20.5 - Jun 24, 2010
Modified: hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java?rev=963831&r1=963830&r2=963831&view=diff
==============================================================================
--- hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java (original)
+++ hbase/branches/0.20/src/java/org/apache/hadoop/hbase/master/RegionManager.java Tue Jul 13 19:36:52 2010
@@ -28,9 +28,11 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NavigableMap;
+import java.util.NavigableSet;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
+import java.util.TreeSet;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
@@ -190,7 +192,7 @@ class RegionManager implements HConstant
// figure out what regions need to be assigned and aren't currently being
// worked on elsewhere.
- Set<RegionState> regionsToAssign =
+ NavigableSet<RegionState> regionsToAssign =
regionsAwaitingAssignment(info.getServerAddress(), isSingleServer);
if (regionsToAssign.size() == 0) {
// There are no regions waiting to be assigned.
@@ -226,7 +228,7 @@ class RegionManager implements HConstant
* @param returnMsgs
*/
private void assignRegionsToMultipleServers(final HServerLoad thisServersLoad,
- final Set<RegionState> regionsToAssign, final HServerInfo info,
+ final NavigableSet<RegionState> regionsToAssign, final HServerInfo info,
final ArrayList<HMsg> returnMsgs) {
boolean isMetaAssign = false;
for (RegionState s : regionsToAssign) {
@@ -289,7 +291,19 @@ class RegionManager implements HConstant
if (count > this.maxAssignInOneGo) {
count = this.maxAssignInOneGo;
}
+ HRegionInfo previous = null;
for (RegionState s: regionsToAssign) {
+ if (previous != null && previous.getEndKey() != null &&
+ Bytes.equals(previous.getEndKey(), s.getRegionInfo().getStartKey())) {
+ // If contiguous regions, do not assign adjacent regions in this
+ // one assignment session. We do this to break daughters of splits so
+ // its more likely they endup on different clusters on the cluster.
+ LOG.info("Passing on " + s.getRegionInfo().getRegionNameAsString() +
+ " because contiguous with " + previous.getRegionNameAsString() +
+ " (will assign next server that checks in)");
+ continue;
+ }
+ previous = s.getRegionInfo();
doRegionAssignment(s, info, returnMsgs);
if (--count <= 0) {
break;
@@ -308,7 +322,7 @@ class RegionManager implements HConstant
* @param serverName
* @param returnMsgs
*/
- private void assignRegionsToOneServer(final Set<RegionState> regionsToAssign,
+ private void assignRegionsToOneServer(final NavigableSet<RegionState> regionsToAssign,
final HServerInfo info, final ArrayList<HMsg> returnMsgs) {
for (RegionState s: regionsToAssign) {
doRegionAssignment(s, info, returnMsgs);
@@ -377,10 +391,10 @@ class RegionManager implements HConstant
* only caller (assignRegions, whose caller is ServerManager.processMsgs) owns
* the monitor for RegionManager
*/
- private Set<RegionState> regionsAwaitingAssignment(HServerAddress addr,
+ private NavigableSet<RegionState> regionsAwaitingAssignment(HServerAddress addr,
boolean isSingleServer) {
// set of regions we want to assign to this server
- Set<RegionState> regionsToAssign = new HashSet<RegionState>();
+ NavigableSet<RegionState> regionsToAssign = new TreeSet<RegionState>();
boolean isMetaServer = isMetaServer(addr);
RegionState rootState = null;
synchronized (this.regionsInTransition) {