5353-record (vbucket_level_info , {move = # total_stat_info {},
5454 vbucket_info = dict :new ()}).
5555
56+ -record (compaction_info , {per_node = [] :: [{node (), # total_stat_info {}}],
57+ in_progress = [] :: [{node (), # stat_info {}}]}).
58+
5659-record (bucket_level_info , {bucket_name ,
60+ compaction_info = # compaction_info {},
5761 vbucket_level_info = # vbucket_level_info {}}).
5862
5963-record (state , {bucket :: bucket_name () | undefined ,
@@ -106,6 +110,10 @@ is_interesting_master_event({_, rebalance_stage_completed, _Stage}) ->
106110 fun handle_rebalance_stage_completed /2 ;
107111is_interesting_master_event ({_ , rebalance_stage_event , _Stage , _Event }) ->
108112 fun handle_rebalance_stage_event /2 ;
113+ is_interesting_master_event ({_ , compaction_uninhibit_started , _BucketName , _ }) ->
114+ fun handle_compaction_uninhibit /2 ;
115+ is_interesting_master_event ({_ , compaction_uninhibit_done , _BucketName , _ }) ->
116+ fun handle_compaction_uninhibit /2 ;
109117is_interesting_master_event (_ ) ->
110118 undefined .
111119
@@ -363,6 +371,9 @@ handle_vbucket_move_done({TS, vbucket_move_done, BucketName, VBucket},
363371 {noreply , update_info (vbucket_move_done , State1 ,
364372 {TS , BucketName , VBucket })}.
365373
374+ handle_compaction_uninhibit ({TS , Event , BucketName , Node }, State ) ->
375+ {noreply , update_info (Event , State , {TS , BucketName , Node })}.
376+
366377update_move (State , BucketName , VBucket , Fun ) ->
367378 update_all_vb_info (State , BucketName ,
368379 dict :update (VBucket , Fun ,
@@ -573,11 +584,61 @@ update_info(Event,
573584 NewBucketLevelInfo =
574585 dict :update (
575586 BucketName ,
576- fun (BLI ) ->
577- update_vbucket_level_info (Event , BLI , UpdateArgs )
587+ fun (BLI0 ) ->
588+ BLI1 = update_bucket_level_info (Event , BLI0 , UpdateArgs ),
589+ update_vbucket_level_info (Event , BLI1 , UpdateArgs )
578590 end , OldBucketLevelInfo ),
579591 State # state {bucket_info = NewBucketLevelInfo }.
580592
593+ update_bucket_level_info (compaction_uninhibit_started ,
594+ BucketLevelInfo ,
595+ {TS , _Bucket , Node }) ->
596+ Compaction = BucketLevelInfo # bucket_level_info .compaction_info ,
597+ InProgress = Compaction # compaction_info .in_progress ,
598+ case lists :keyfind (Node , 1 , InProgress ) of
599+ false ->
600+ NewInprogress = [{Node , # stat_info {start_time = TS }} | InProgress ],
601+ NewCompaction = Compaction # compaction_info {
602+ in_progress = NewInprogress },
603+ BucketLevelInfo # bucket_level_info {compaction_info = NewCompaction };
604+ _ ->
605+ BucketLevelInfo
606+ end ;
607+ update_bucket_level_info (compaction_uninhibit_done ,
608+ BucketLevelInfo ,
609+ {TS , _Bucket , Node }) ->
610+ Compaction = BucketLevelInfo # bucket_level_info .compaction_info ,
611+ InProgress = Compaction # compaction_info .in_progress ,
612+ case lists :keytake (Node , 1 , InProgress ) of
613+ false ->
614+ BucketLevelInfo ;
615+ {value , {Node , CompactionStat }, NewInprogress } ->
616+ BucketLevelInfo # bucket_level_info {
617+ compaction_info = update_on_compaction_end (
618+ Compaction , Node ,
619+ CompactionStat # stat_info {end_time = TS },
620+ NewInprogress )}
621+ end ;
622+ update_bucket_level_info (_ , BLI , _ ) ->
623+ BLI .
624+
625+ update_on_compaction_end (# compaction_info {per_node = OldPerNode },
626+ Node ,
627+ NewCompactionStat ,
628+ NewInprogress ) ->
629+ NewPerNode = case lists :keytake (Node , 1 , OldPerNode ) of
630+ {value , {Node , TotalStat }, PerNode } ->
631+ NewTotalStat = update_total_stat (TotalStat ,
632+ NewCompactionStat ),
633+ [{Node , NewTotalStat } | PerNode ];
634+ false ->
635+ NewTotalStat = update_total_stat (# total_stat_info {},
636+ NewCompactionStat ),
637+ [{Node , NewTotalStat } | OldPerNode ]
638+ end ,
639+ # compaction_info {per_node = NewPerNode ,
640+ in_progress = NewInprogress }.
641+
581642get_all_vb_info (_ , undefined ) ->
582643 dict :new ();
583644get_all_vb_info (# state {bucket_info = BucketInfo }, BucketName ) ->
@@ -665,14 +726,27 @@ update_vbucket_level_info_inner(
665726
666727construct_bucket_level_info_json (
667728 # bucket_level_info {bucket_name = BucketName ,
729+ compaction_info = CompactionInfo ,
668730 vbucket_level_info = VBLevelInfo }, Options ) ->
669- case dict :is_empty (VBLevelInfo # vbucket_level_info .vbucket_info ) of
670- true ->
671- undefined ;
672- false ->
673- {BucketName , {[{vbucketLevelInfo ,
674- construct_vbucket_level_info_json (VBLevelInfo ,
675- Options )}]}}
731+ case construct_compaction_info_json (CompactionInfo ) ++
732+ construct_vbucket_level_info_json (VBLevelInfo , Options ) of
733+ [] -> [];
734+ BLI -> [{BucketName , {BLI }}]
735+ end .
736+
737+ construct_compaction_info_json (# compaction_info {per_node = PerNode ,
738+ in_progress = InProgress }) ->
739+ InProgressElem = {inProgress ,
740+ {[{Node , construct_stat_info_json (StatInfo )} ||
741+ {Node , StatInfo } <- InProgress ]}},
742+ PerNodeElem = {perNode ,
743+ {[{Node , construct_total_stat_info_json (TotalStatInfo )} ||
744+ {Node , TotalStatInfo } <- PerNode ]}},
745+ case {PerNode , InProgress } of
746+ {[], []} -> [];
747+ {[], _ } -> [{compactionInfo , {[InProgressElem ]}}];
748+ {_ , []} -> [{compactionInfo , {[PerNodeElem ]}}];
749+ _ -> [{compactionInfo , {[InProgressElem , PerNodeElem ]}}]
676750 end .
677751
678752construct_stat_info_json (# stat_info {start_time = false }) ->
@@ -709,7 +783,16 @@ construct_vbucket_info_json(Id, #vbucket_info{before_chain = BC,
709783 {stats , {[construct_replica_building_stats_json (X ) || X <- RBS ]}},
710784 {move , construct_stat_info_json (Move )}]}.
711785
712- construct_vbucket_level_info_json (
786+ construct_vbucket_level_info_json (VBLevelInfo , Options ) ->
787+ case dict :is_empty (VBLevelInfo # vbucket_level_info .vbucket_info ) of
788+ true ->
789+ [];
790+ false ->
791+ [{vbucketLevelInfo ,
792+ construct_vbucket_level_info_json_inner (VBLevelInfo , Options )}]
793+ end .
794+
795+ construct_vbucket_level_info_json_inner (
713796 # vbucket_level_info {move = Move ,
714797 vbucket_info = AllVBInfo }, Options ) ->
715798 VBI = case proplists :get_bool (add_vbucket_info , Options ) of
@@ -728,10 +811,7 @@ get_all_stage_rebalance_details(#state{bucket_info = BucketLevelInfo},
728811 Options ) ->
729812 RV = dict :fold (
730813 fun (_Key , BLI , Acc ) ->
731- case construct_bucket_level_info_json (BLI , Options ) of
732- undefined -> Acc ;
733- Val -> [Val | Acc ]
734- end
814+ construct_bucket_level_info_json (BLI , Options ) ++ Acc
735815 end , [], BucketLevelInfo ),
736816 case RV of
737817 [] -> [];
0 commit comments