Skip to content

Commit 44df809

Browse files
anuthanAliaksey Artamonau
authored andcommitted
Add compaction info in rebalance stage info.
Helps with, MB-25168: Log in-flight compactions MB-30803: Collect rebalance related stats CBSE-1097: Visualize bucket movements during rebalance Part of EPIC, MB-30894: Rebalance visibility and reporting Change-Id: Ifa621a3e8ba14b6049ab9f66c8836ed5eddb7af0 Reviewed-on: http://review.couchbase.org/101823 Reviewed-by: Aliaksey Artamonau <[email protected]> Well-Formed: Build Bot <[email protected]> Tested-by: Aliaksey Artamonau <[email protected]>
1 parent be70e78 commit 44df809

File tree

1 file changed

+94
-14
lines changed

1 file changed

+94
-14
lines changed

src/ns_rebalance_observer.erl

Lines changed: 94 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@
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;
107111
is_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;
109117
is_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+
366377
update_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+
581642
get_all_vb_info(_, undefined) ->
582643
dict:new();
583644
get_all_vb_info(#state{bucket_info = BucketInfo}, BucketName) ->
@@ -665,14 +726,27 @@ update_vbucket_level_info_inner(
665726

666727
construct_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

678752
construct_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

Comments
 (0)