Index: src/main/java/org/apache/hadoop/hbase/catalog/CatalogTracker.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/catalog/CatalogTracker.java (revision 1142013) +++ src/main/java/org/apache/hadoop/hbase/catalog/CatalogTracker.java (working copy) @@ -22,8 +22,9 @@ import java.io.EOFException; import java.io.IOException; import java.net.ConnectException; +import java.net.SocketException; import java.net.SocketTimeoutException; -import java.net.SocketException; +import java.util.Collection; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.commons.logging.Log; @@ -34,9 +35,11 @@ import org.apache.hadoop.hbase.NotAllMetaRegionsOnlineException; import org.apache.hadoop.hbase.NotServingRegionException; import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HConnection; import org.apache.hadoop.hbase.client.HConnectionManager; import org.apache.hadoop.hbase.client.RetriesExhaustedException; +import org.apache.hadoop.hbase.ipc.HMasterInterface; import org.apache.hadoop.hbase.ipc.HRegionInterface; import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException; import org.apache.hadoop.hbase.util.Bytes; @@ -65,6 +68,7 @@ private final ZooKeeperWatcher zookeeper; private final RootRegionTracker rootRegionTracker; private final MetaNodeTracker metaNodeTracker; + private HMasterInterface master = null; private final AtomicBoolean metaAvailable = new AtomicBoolean(false); /** * Do not clear this address once set. Its needed when we do @@ -311,7 +315,23 @@ if (newLocation == null) { return null; } - HRegionInterface newConnection = getCachedConnection(newLocation); + + HRegionInterface newConnection = null; + try { + newConnection = getCachedConnection(newLocation); + } catch (IOException e) { + if (master == null) { + HBaseAdmin admin = new HBaseAdmin(conf); + master = admin.getMaster(); + } + Collection servers = master.getClusterStatus().getServers(); + for (ServerName info : servers) { + newConnection = connection.getHRegionConnection( + info.getServerName(), info.getPort()); + break; + } + } + // HRegionInterface newConnection = getCachedConnection(newLocation); if (verifyRegionLocation(newConnection, this.metaLocation, META_REGION)) { setMetaLocation(newLocation); return newConnection;