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/30 07:00:41 UTC
svn commit: r980650 - in /hbase/branches/0.89.20100726: CHANGES.txt
src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java
Author: stack
Date: Fri Jul 30 05:00:40 2010
New Revision: 980650
URL: http://svn.apache.org/viewvc?rev=980650&view=rev
Log:
HBASE-2755 Duplicate assignment of a region after region server recovery
Modified:
hbase/branches/0.89.20100726/CHANGES.txt
hbase/branches/0.89.20100726/src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java
Modified: hbase/branches/0.89.20100726/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/branches/0.89.20100726/CHANGES.txt?rev=980650&r1=980649&r2=980650&view=diff
==============================================================================
--- hbase/branches/0.89.20100726/CHANGES.txt (original)
+++ hbase/branches/0.89.20100726/CHANGES.txt Fri Jul 30 05:00:40 2010
@@ -458,6 +458,8 @@ Release 0.89.2010726
gets suspended on tty output (Alexey Kovyrin via Stack)
HBASE-2852 Bloom filter NPE (pranav via jgray)
HBASE-2890 Initialize RPC JMX metrics on startup (Gary Helmling via Stack)
+ HBASE-2755 Duplicate assignment of a region after region server recovery
+ (Kannan Muthukkaruppan via Stack)
IMPROVEMENTS
HBASE-1760 Cleanup TODOs in HTable
Modified: hbase/branches/0.89.20100726/src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89.20100726/src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java?rev=980650&r1=980649&r2=980650&view=diff
==============================================================================
--- hbase/branches/0.89.20100726/src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java (original)
+++ hbase/branches/0.89.20100726/src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java Fri Jul 30 05:00:40 2010
@@ -194,7 +194,7 @@ abstract class BaseScanner extends Chore
long startCode = getStartCode(values);
// Note Region has been assigned.
- checkAssigned(regionServer, region, info, serverAddress, startCode);
+ checkAssigned(regionServer, region, info, serverAddress, startCode, true);
if (isSplitParent(info)) {
splitParents.put(info, values);
}
@@ -533,12 +533,15 @@ abstract class BaseScanner extends Chore
* @param info
* @param hostnameAndPort hostname ':' port as it comes out of .META.
* @param startCode
+ * @param checkTwice should we check twice before adding a region
+ * to unassigned pool.
* @throws IOException
*/
protected void checkAssigned(final HRegionInterface regionServer,
final MetaRegion meta, final HRegionInfo info,
- final String hostnameAndPort, final long startCode)
+ final String hostnameAndPort, final long startCode, boolean checkTwice)
throws IOException {
+ boolean tryAgain = false;
String serverName = null;
String sa = hostnameAndPort;
long sc = startCode;
@@ -575,16 +578,31 @@ abstract class BaseScanner extends Chore
// If we can't find the HServerInfo, then add it to the list of
// unassigned regions.
if (storedInfo == null) {
- // The current assignment is invalid
- if (LOG.isDebugEnabled()) {
- LOG.debug("Current assignment of " + info.getRegionNameAsString() +
- " is not valid; " + " serverAddress=" + sa +
- ", startCode=" + sc + " unknown.");
+ if (checkTwice) {
+ tryAgain = true;
+ } else {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Current assignment of " + info.getRegionNameAsString() +
+ " is not valid; " + " serverAddress=" + sa +
+ ", startCode=" + sc + " unknown.");
+ }
+ // Now get the region assigned
+ this.master.getRegionManager().setUnassigned(info, true);
}
- // Now get the region assigned
- this.master.getRegionManager().setUnassigned(info, true);
}
}
+ if (tryAgain) {
+ // The current assignment is invalid. But we need to try again.
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Current assignment of " + info.getRegionNameAsString() +
+ " is not valid; " + " serverAddress=" + sa +
+ ", startCode=" + sc + " unknown; checking once more!");
+ }
+ // passing null for hostNameAndPort will force the function
+ // to reget the assignment from META and protect against
+ // double assignment race conditions (HBASE-2755).
+ checkAssigned(regionServer, meta, info, null, 0, false);
+ }
}
/**