@@ -84,7 +84,7 @@ get_aggregated_progress(Timeout) ->
8484 generic_get_call (get_aggregated_progress , Timeout ).
8585
8686get_stage_info () ->
87- generic_get_call (get_stage_info ).
87+ generic_get_call ({ get_stage_info , []} ).
8888
8989update_progress (Stage , StageProgress ) ->
9090 gen_server :cast (? SERVER , {update_progress , Stage , StageProgress }).
@@ -167,9 +167,11 @@ handle_call(get_detailed_progress, _From, State) ->
167167handle_call (get_aggregated_progress , _From ,
168168 # state {stage_info = StageInfo } = State ) ->
169169 {reply , dict :to_list (rebalance_stage_info :get_progress (StageInfo )), State };
170- handle_call (get_stage_info , _From ,
170+ handle_call ({ get_stage_info , Options } , _From ,
171171 # state {stage_info = StageInfo } = State ) ->
172- {reply , rebalance_stage_info :get_stage_info (StageInfo ), State };
172+ StageDetails = get_all_stage_rebalance_details (State , Options ),
173+ {reply , rebalance_stage_info :get_stage_info (StageInfo , StageDetails ),
174+ State };
173175handle_call (Req , From , State ) ->
174176 ? log_error (" Got unknown request: ~p from ~p " , [Req , From ]),
175177 {reply , unknown_request , State }.
@@ -660,3 +662,78 @@ update_vbucket_level_info_inner(
660662 BucketLevelInfo # bucket_level_info {
661663 vbucket_level_info = NewVBLevelInfo }
662664 end .
665+
666+ construct_bucket_level_info_json (
667+ # bucket_level_info {bucket_name = BucketName ,
668+ 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 )}]}}
676+ end .
677+
678+ construct_stat_info_json (# stat_info {start_time = false }) ->
679+ {[{startTime , rebalance_stage_info :binarify_timestamp (false )}]};
680+ construct_stat_info_json (# stat_info {start_time = ST ,
681+ end_time = ET }) ->
682+ {[{startTime , rebalance_stage_info :binarify_timestamp (ST )},
683+ {endTime , rebalance_stage_info :binarify_timestamp (ET )},
684+ {timeTaken , rebalance_stage_info :diff_timestamp (ET , ST )}]}.
685+
686+ average (_ , 0 ) ->
687+ 0 ;
688+ average (Total , Count ) ->
689+ Total / Count .
690+
691+ construct_total_stat_info_json (# total_stat_info {total_time = TT ,
692+ completed_count = CC }) ->
693+ {[{averageTime , average (TT , CC )}]}.
694+
695+ construct_replica_building_stats_json (# replica_building_stats {node = Node ,
696+ docs_total = DT ,
697+ docs_left = DL }) ->
698+ {Node , {[{node , Node },
699+ {docsTotal , DT },
700+ {docsLeft , DL }]}}.
701+
702+ construct_vbucket_info_json (Id , # vbucket_info {before_chain = BC ,
703+ after_chain = AC ,
704+ stats = RBS ,
705+ move = Move }) ->
706+ {[{id , Id },
707+ {beforeChain , BC },
708+ {afterChain , AC },
709+ {stats , {[construct_replica_building_stats_json (X ) || X <- RBS ]}},
710+ {move , construct_stat_info_json (Move )}]}.
711+
712+ construct_vbucket_level_info_json (
713+ # vbucket_level_info {move = Move ,
714+ vbucket_info = AllVBInfo }, Options ) ->
715+ VBI = case proplists :get_bool (add_vbucket_info , Options ) of
716+ true ->
717+ [{vbucketInfo ,
718+ dict :fold (fun (VB , Info , Acc ) ->
719+ [construct_vbucket_info_json (VB , Info ) | Acc ]
720+ end , [], AllVBInfo )}];
721+ _ ->
722+ []
723+ end ,
724+ {[{move , construct_total_stat_info_json (Move )}]
725+ ++ VBI }.
726+
727+ get_all_stage_rebalance_details (# state {bucket_info = BucketLevelInfo },
728+ Options ) ->
729+ RV = dict :fold (
730+ fun (_Key , BLI , Acc ) ->
731+ case construct_bucket_level_info_json (BLI , Options ) of
732+ undefined -> Acc ;
733+ Val -> [Val | Acc ]
734+ end
735+ end , [], BucketLevelInfo ),
736+ case RV of
737+ [] -> [];
738+ _ -> [{kv , {RV }}]
739+ end .
0 commit comments