2222import java .time .Instant ;
2323import java .time .Period ;
2424import java .util .ArrayList ;
25- import java .util .Collection ;
2625import java .util .Collections ;
2726import java .util .LinkedList ;
2827import java .util .List ;
@@ -80,10 +79,8 @@ class SimpleRegionNormalizer implements RegionNormalizer, ConfigurationObserver
8079 static final int DEFAULT_MERGE_MIN_REGION_AGE_DAYS = 3 ;
8180 static final String MERGE_MIN_REGION_SIZE_MB_KEY = "hbase.normalizer.merge.min_region_size.mb" ;
8281 static final int DEFAULT_MERGE_MIN_REGION_SIZE_MB = 0 ;
83- static final String CUMULATIVE_MERGE_SIZE_LIMIT_MB_KEY = "hbase.normalizer.merge.plans_size_limit.mb" ;
84- static final long DEFAULT_CUMULATIVE_MERGE_SIZE_LIMIT_MB = Long .MAX_VALUE ;
85- static final String CUMULATIVE_SPLIT_SIZE_LIMIT_MB_KEY = "hbase.normalizer.split.plans_size_limit.mb" ;
86- static final long DEFAULT_CUMULATIVE_SPLIT_SIZE_LIMIT_MB = Long .MAX_VALUE ;
82+ static final String CUMULATIVE_SIZE_LIMIT_MB_KEY = "hbase.normalizer.plans_size_limit.mb" ;
83+ static final long DEFAULT_CUMULATIVE_SIZE_LIMIT_MB = Long .MAX_VALUE ;
8784
8885 private MasterServices masterServices ;
8986 private NormalizerConfiguration normalizerConfiguration ;
@@ -220,7 +217,7 @@ public List<NormalizationPlan> computePlansForTable(final TableDescriptor tableD
220217 LOG .debug ("Computing normalization plan for table: {}, number of regions: {}" , table ,
221218 ctx .getTableRegions ().size ());
222219
223- final List <NormalizationPlan > plans = new ArrayList <>();
220+ List <NormalizationPlan > plans = new ArrayList <>();
224221 int splitPlansCount = 0 ;
225222 if (proceedWithSplitPlanning ) {
226223 List <NormalizationPlan > splitPlans = computeSplitNormalizationPlans (ctx );
@@ -234,19 +231,13 @@ public List<NormalizationPlan> computePlansForTable(final TableDescriptor tableD
234231 plans .addAll (mergePlans );
235232 }
236233
234+ plans = truncateForSize (plans );
235+
237236 LOG .debug ("Computed normalization plans for table {}. Total plans: {}, split plans: {}, "
238237 + "merge plans: {}" , table , plans .size (), splitPlansCount , mergePlansCount );
239238 return plans ;
240239 }
241240
242- private long getTotalRegionSizeMB (Collection <NormalizationTarget > targets ) {
243- long total = 0 ;
244- for (NormalizationTarget target : targets ) {
245- total += target .getRegionSizeMb ();
246- }
247- return total ;
248- }
249-
250241 /** Returns size of region in MB and if region is not found than -1 */
251242 private long getRegionSizeMB (RegionInfo hri ) {
252243 ServerName sn =
@@ -370,7 +361,6 @@ private List<NormalizationPlan> computeMergeNormalizationPlans(final NormalizeCo
370361 final List <NormalizationPlan > plans = new LinkedList <>();
371362 final List <NormalizationTarget > rangeMembers = new LinkedList <>();
372363 long sumRangeMembersSizeMb ;
373- long cumulativePlansSizeMb = 0 ;
374364 int current = 0 ;
375365 for (int rangeStart = 0 ; rangeStart < ctx .getTableRegions ().size () - 1
376366 && current < ctx .getTableRegions ().size ();) {
@@ -408,12 +398,7 @@ private List<NormalizationPlan> computeMergeNormalizationPlans(final NormalizeCo
408398 break ;
409399 }
410400 if (rangeMembers .size () > 1 ) {
411- cumulativePlansSizeMb += getTotalRegionSizeMB (rangeMembers );
412- if (cumulativePlansSizeMb > normalizerConfiguration .getCumulativeMergePlansSizeLimitMb ()) {
413- return plans ;
414- } else {
415- plans .add (new MergeNormalizationPlan .Builder ().setTargets (rangeMembers ).build ());
416- }
401+ plans .add (new MergeNormalizationPlan .Builder ().setTargets (rangeMembers ).build ());
417402 }
418403 }
419404 return plans ;
@@ -441,7 +426,6 @@ private List<NormalizationPlan> computeSplitNormalizationPlans(final NormalizeCo
441426 LOG .debug ("Table {}, average region size: {} MB" , ctx .getTableName (),
442427 String .format ("%.3f" , avgRegionSize ));
443428
444- long cumulativePlansSizeMb = 0 ;
445429 final List <NormalizationPlan > plans = new ArrayList <>();
446430 for (final RegionInfo hri : ctx .getTableRegions ()) {
447431 if (skipForSplit (ctx .getRegionStates ().getRegionState (hri ), hri )) {
@@ -454,12 +438,7 @@ private List<NormalizationPlan> computeSplitNormalizationPlans(final NormalizeCo
454438 + "splitting" ,
455439 ctx .getTableName (), hri .getRegionNameAsString (), regionSizeMb ,
456440 String .format ("%.3f" , avgRegionSize ));
457- cumulativePlansSizeMb += getRegionSizeMB (hri );
458- if (cumulativePlansSizeMb > normalizerConfiguration .getCumulativeSplitPlansSizeLimitMb ()) {
459- return plans ;
460- } else {
461- plans .add (new SplitNormalizationPlan (hri , regionSizeMb ));
462- }
441+ plans .add (new SplitNormalizationPlan (hri , regionSizeMb ));
463442 }
464443 }
465444 return plans ;
@@ -489,6 +468,27 @@ private boolean isLargeEnoughForMerge(final NormalizerConfiguration normalizerCo
489468 return getRegionSizeMB (regionInfo ) >= normalizerConfiguration .getMergeMinRegionSizeMb (ctx );
490469 }
491470
471+ private List <NormalizationPlan > truncateForSize (List <NormalizationPlan > plans ) {
472+ if (
473+ normalizerConfiguration .getCumulativePlansSizeLimitMb () != DEFAULT_CUMULATIVE_SIZE_LIMIT_MB
474+ ) {
475+ // If we are going to truncate our list of plans, shuffle the split and merge plans together
476+ // so that the merge plans, which are listed last, are not starved out.
477+ List <NormalizationPlan > maybeTruncatedPlans = new ArrayList <>();
478+ Collections .shuffle (plans );
479+ long cumulativeSizeMb = 0 ;
480+ for (NormalizationPlan plan : plans ) {
481+ cumulativeSizeMb += plan .getPlanSizeMb ();
482+ if (cumulativeSizeMb < normalizerConfiguration .getCumulativePlansSizeLimitMb ()) {
483+ maybeTruncatedPlans .add (plan );
484+ }
485+ }
486+ return maybeTruncatedPlans ;
487+ } else {
488+ return plans ;
489+ }
490+ }
491+
492492 private static boolean logTraceReason (final BooleanSupplier predicate , final String fmtWhenTrue ,
493493 final Object ... args ) {
494494 final boolean value = predicate .getAsBoolean ();
@@ -509,8 +509,7 @@ private static final class NormalizerConfiguration {
509509 private final int mergeMinRegionCount ;
510510 private final Period mergeMinRegionAge ;
511511 private final long mergeMinRegionSizeMb ;
512- private final long cumulativeMergePlansSizeLimitMb ;
513- private final long cumulativeSplitPlansSizeLimitMb ;
512+ private final long cumulativePlansSizeLimitMb ;
514513
515514 private NormalizerConfiguration () {
516515 conf = null ;
@@ -519,8 +518,7 @@ private NormalizerConfiguration() {
519518 mergeMinRegionCount = DEFAULT_MERGE_MIN_REGION_COUNT ;
520519 mergeMinRegionAge = Period .ofDays (DEFAULT_MERGE_MIN_REGION_AGE_DAYS );
521520 mergeMinRegionSizeMb = DEFAULT_MERGE_MIN_REGION_SIZE_MB ;
522- cumulativeMergePlansSizeLimitMb = DEFAULT_CUMULATIVE_MERGE_SIZE_LIMIT_MB ;
523- cumulativeSplitPlansSizeLimitMb = DEFAULT_CUMULATIVE_SPLIT_SIZE_LIMIT_MB ;
521+ cumulativePlansSizeLimitMb = DEFAULT_CUMULATIVE_SIZE_LIMIT_MB ;
524522 }
525523
526524 private NormalizerConfiguration (final Configuration conf ,
@@ -531,8 +529,8 @@ private NormalizerConfiguration(final Configuration conf,
531529 mergeMinRegionCount = parseMergeMinRegionCount (conf );
532530 mergeMinRegionAge = parseMergeMinRegionAge (conf );
533531 mergeMinRegionSizeMb = parseMergeMinRegionSizeMb (conf );
534- cumulativeSplitPlansSizeLimitMb = conf . getLong ( CUMULATIVE_SPLIT_SIZE_LIMIT_MB_KEY , DEFAULT_CUMULATIVE_MERGE_SIZE_LIMIT_MB );
535- cumulativeMergePlansSizeLimitMb = conf .getLong (CUMULATIVE_MERGE_SIZE_LIMIT_MB_KEY , DEFAULT_CUMULATIVE_MERGE_SIZE_LIMIT_MB );
532+ cumulativePlansSizeLimitMb =
533+ conf .getLong (CUMULATIVE_SIZE_LIMIT_MB_KEY , DEFAULT_CUMULATIVE_SIZE_LIMIT_MB );
536534 logConfigurationUpdated (SPLIT_ENABLED_KEY , currentConfiguration .isSplitEnabled (),
537535 splitEnabled );
538536 logConfigurationUpdated (MERGE_ENABLED_KEY , currentConfiguration .isMergeEnabled (),
@@ -543,8 +541,8 @@ private NormalizerConfiguration(final Configuration conf,
543541 currentConfiguration .getMergeMinRegionAge (), mergeMinRegionAge );
544542 logConfigurationUpdated (MERGE_MIN_REGION_SIZE_MB_KEY ,
545543 currentConfiguration .getMergeMinRegionSizeMb (), mergeMinRegionSizeMb );
546- logConfigurationUpdated (CUMULATIVE_SPLIT_SIZE_LIMIT_MB_KEY , currentConfiguration . getCumulativeSplitPlansSizeLimitMb (), cumulativeSplitPlansSizeLimitMb );
547- logConfigurationUpdated ( CUMULATIVE_MERGE_SIZE_LIMIT_MB_KEY , currentConfiguration .getCumulativeMergePlansSizeLimitMb (), cumulativeMergePlansSizeLimitMb );
544+ logConfigurationUpdated (CUMULATIVE_SIZE_LIMIT_MB_KEY ,
545+ currentConfiguration .getCumulativePlansSizeLimitMb (), cumulativePlansSizeLimitMb );
548546 }
549547
550548 public Configuration getConf () {
@@ -608,12 +606,8 @@ public long getMergeMinRegionSizeMb(NormalizeContext context) {
608606 return mergeMinRegionSizeMb ;
609607 }
610608
611- public long getCumulativeSplitPlansSizeLimitMb () {
612- return cumulativeSplitPlansSizeLimitMb ;
613- }
614-
615- public long getCumulativeMergePlansSizeLimitMb () {
616- return cumulativeMergePlansSizeLimitMb ;
609+ public long getCumulativePlansSizeLimitMb () {
610+ return cumulativePlansSizeLimitMb ;
617611 }
618612 }
619613
0 commit comments