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