private static void checkRegionsToMerge(MasterProcedureEnv env, final RegionInfo[] regionsToMerge, final boolean forcible) throws MergeRegionException { // For now, we only merge 2 regions. // It could be extended to more than 2 regions in the future. if (regionsToMerge == null || regionsToMerge.length != 2) { throw new MergeRegionException("Expected to merge 2 regions, got: " + Arrays.toString(regionsToMerge)); } checkRegionsToMerge(env, regionsToMerge[0], regionsToMerge[1], forcible); }
/** * One time checks. */ private static void checkRegionsToMerge(MasterProcedureEnv env, final RegionInfo regionToMergeA, final RegionInfo regionToMergeB, final boolean forcible) throws MergeRegionException { if (!regionToMergeA.getTable().equals(regionToMergeB.getTable())) { throw new MergeRegionException("Can't merge regions from two different tables: " + regionToMergeA + ", " + regionToMergeB); } if (regionToMergeA.getReplicaId() != RegionInfo.DEFAULT_REPLICA_ID || regionToMergeB.getReplicaId() != RegionInfo.DEFAULT_REPLICA_ID) { throw new MergeRegionException("Can't merge non-default replicas"); } try { checkOnline(env, regionToMergeA); checkOnline(env, regionToMergeB); } catch (DoNotRetryRegionException dnrre) { throw new MergeRegionException(dnrre); } if (!RegionInfo.areAdjacent(regionToMergeA, regionToMergeB)) { String msg = "Unable to merge non-adjacent regions " + regionToMergeA.getShortNameToLog() + ", " + regionToMergeB.getShortNameToLog() + " where forcible = " + forcible; LOG.warn(msg); if (!forcible) { throw new MergeRegionException(msg); } } }
throw new MergeRegionException( "Cannot merge a region to itself " + regionsToMerge[0] + ", " + regionsToMerge[1]);
throw new MergeRegionException( "Skip merging regions " + RegionInfo.getShortNameToLog(regionsToMerge) + ", because we are taking snapshot for the table " + regionsToMerge[0].getTable()); .getEncodedName()) + " has merge qualifier"; LOG.warn(msg); throw new MergeRegionException(msg); throw new MergeRegionException( "Unable to merge regions that are not online " + regionStateA + ", " + regionStateB);
throw new ServiceException(new MergeRegionException( "Unable to merge regions not online " + regionStateA + ", " + regionStateB)); if (regionInfoA.getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID || regionInfoB.getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID) { throw new ServiceException(new MergeRegionException("Can't merge non-default replicas")); throw new ServiceException(new MergeRegionException( "Unable to merge a region to itself " + regionInfoA + ", " + regionInfoB)); throw new ServiceException(new MergeRegionException( "Unable to merge not adjacent regions " + regionInfoA.getRegionNameAsString() + ", "
if (regionA.getRegionInfo().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID || regionB.getRegionInfo().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID) { throw new ServiceException(new MergeRegionException("Can't merge non-default replicas"));