You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jd...@apache.org on 2010/04/29 03:23:08 UTC
svn commit: r939157 - in /hadoop/hbase/trunk: CHANGES.txt
core/src/main/java/org/apache/hadoop/hbase/master/ChangeTableState.java
Author: jdcryans
Date: Thu Apr 29 01:23:07 2010
New Revision: 939157
URL: http://svn.apache.org/viewvc?rev=939157&view=rev
Log:
HBASE-2499 Race condition when disabling a table leaves regions in transition
Modified:
hadoop/hbase/trunk/CHANGES.txt
hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/master/ChangeTableState.java
Modified: hadoop/hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=939157&r1=939156&r2=939157&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Thu Apr 29 01:23:07 2010
@@ -295,6 +295,7 @@ Release 0.21.0 - Unreleased
master.jsp moved under webapps/master(Cristian Ivascu via Stack)
HBASE-2487 Uncaught exceptions in receiving IPC responses orphan clients
(Todd Lipcon via Stack)
+ HBASE-2499 Race condition when disabling a table leaves regions in transition
IMPROVEMENTS
HBASE-1760 Cleanup TODOs in HTable
Modified: hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/master/ChangeTableState.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/master/ChangeTableState.java?rev=939157&r1=939156&r2=939157&view=diff
==============================================================================
--- hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/master/ChangeTableState.java (original)
+++ hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/master/ChangeTableState.java Thu Apr 29 01:23:07 2010
@@ -23,7 +23,9 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hbase.HRegionInfo;
import org.apache.hadoop.hbase.client.Delete;
+import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
+import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.ipc.HRegionInterface;
import org.apache.hadoop.hbase.util.Writables;
@@ -85,13 +87,17 @@ class ChangeTableState extends TableOper
continue;
}
- // Update meta table
- Put put = updateRegionInfo(i);
- server.put(m.getRegionName(), put);
- Delete delete = new Delete(i.getRegionName());
- delete.deleteColumns(CATALOG_FAMILY, SERVER_QUALIFIER);
- delete.deleteColumns(CATALOG_FAMILY, STARTCODE_QUALIFIER);
- server.delete(m.getRegionName(), delete);
+ // If it's already offline then don't set it a second/third time, skip
+ // Same for online, don't set again if already online
+ if (!(i.isOffline() && !online) && !(!i.isOffline() && online)) {
+ // Update meta table
+ Put put = updateRegionInfo(i);
+ server.put(m.getRegionName(), put);
+ Delete delete = new Delete(i.getRegionName());
+ delete.deleteColumns(CATALOG_FAMILY, SERVER_QUALIFIER);
+ delete.deleteColumns(CATALOG_FAMILY, STARTCODE_QUALIFIER);
+ server.delete(m.getRegionName(), delete);
+ }
if (LOG.isDebugEnabled()) {
LOG.debug("Removed server and startcode from row and set online=" +
this.online + ": " + i.getRegionNameAsString());
@@ -124,6 +130,15 @@ class ChangeTableState extends TableOper
// Cause regions being served to be taken off-line and disabled
for (HRegionInfo i: e.getValue()) {
+ // The scan we did could be totally staled, get the freshest data
+ Get get = new Get(i.getRegionName());
+ get.addColumn(CATALOG_FAMILY, SERVER_QUALIFIER);
+ Result values = server.get(m.getRegionName(), get);
+ String serverAddress = BaseScanner.getServerAddress(values);
+ // If this region is unassigned, skip!
+ if(serverAddress.length() == 0) {
+ continue;
+ }
if (LOG.isDebugEnabled()) {
LOG.debug("Adding region " + i.getRegionNameAsString() +
" to setClosing list");