Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (revision 1502665) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (working copy) @@ -3646,8 +3646,8 @@ try { checkOpen(); requestCount.increment(); - HRegion regionA = getRegion(request.getRegionA()); - HRegion regionB = getRegion(request.getRegionB()); + HRegion regionA = getRegionWithWait(request.getRegionA()); + HRegion regionB = getRegionWithWait(request.getRegionB()); boolean forcible = request.getForcible(); regionA.startRegionOperation(Operation.MERGE_REGION); regionB.startRegionOperation(Operation.MERGE_REGION); @@ -3865,6 +3865,30 @@ } /** + * Find the HRegion based on a region specifier. If RegionOpeningException is encountered, + * wait for a while before retying retrieval. + * + * @param regionSpecifier the region specifier + * @return the corresponding region + * @throws IOException if the specifier is not null, + * but failed to find the region + */ + protected HRegion getRegionWithWait( + final RegionSpecifier regionSpecifier) throws IOException { + int cnt = 0; + IOException ioe = null; + while (cnt++ < 5) { + try { + return getRegionByEncodedName(ProtobufUtil.getRegionEncodedName(regionSpecifier)); + } catch (RegionOpeningException roe) { + ioe = roe; + Threads.sleepWithoutInterrupt(50); + } + } + throw ioe; + } + + /** * Execute an append mutation. * * @param region