Skip to content

Commit 4776581

Browse files
committed
Set per-queue-type disk alarms for configured mount points
This introduces a new variant of `rabbit_alarm:resource_alarm_source()`: `{disk, QueueType}` which triggers when the configured mount point for queue type(s) fall under their limit of available space.
1 parent 0e4f126 commit 4776581

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

deps/rabbit/src/rabbit_alarm.erl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@
4949

5050
-export_type([alarm/0]).
5151
-type local_alarm() :: 'file_descriptor_limit'.
52-
-type resource_alarm_source() :: 'disk' | 'memory'.
52+
-type resource_alarm_source() ::
53+
memory
54+
| disk
55+
| {disk, rabbit_queue_type:queue_type()}.
5356
-type resource_alarm() :: {resource_limit, resource_alarm_source(), node()}.
5457
-type alarm() :: local_alarm() | resource_alarm().
5558
-type resource_alert() :: {WasAlarmSetForNode :: boolean(),
@@ -128,6 +131,8 @@ is_local({{resource_limit, _Resource, Node}, _}) when Node =/= node() -> false.
128131
-spec format_resource_alarm_source(resource_alarm_source()) -> iodata().
129132
format_resource_alarm_source(disk) ->
130133
?DISK_SPACE_RESOURCE;
134+
format_resource_alarm_source({disk, QueueType}) ->
135+
io_lib:format("disk for queue type '~ts'", [QueueType]);
131136
format_resource_alarm_source(memory) ->
132137
?MEMORY_RESOURCE;
133138
format_resource_alarm_source(Unknown) ->

deps/rabbit/src/rabbit_disk_monitor.erl

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,10 +288,14 @@ internal_update(#state{limit = DataDirLimit,
288288
limit = Limit} <- NewMountPoints]),
289289

290290
AlarmedMPs = alarmed_mount_points(MountPoints),
291+
AlarmedQTs = alarmed_queue_types(MountPoints),
291292
NewAlarmedMPs = alarmed_mount_points(NewMountPoints),
293+
NewAlarmedQTs = alarmed_queue_types(NewMountPoints),
292294

293295
NewlyClearedMPs = sets:subtract(AlarmedMPs, NewAlarmedMPs),
296+
NewlyClearedQTs = sets:subtract(AlarmedQTs, NewAlarmedQTs),
294297
NewlyAlarmedMPs = sets:subtract(NewAlarmedMPs, AlarmedMPs),
298+
NewlyAlarmedQTs = sets:subtract(NewAlarmedQTs, AlarmedQTs),
295299

296300
lists:foreach(
297301
fun(Path) ->
@@ -301,7 +305,11 @@ internal_update(#state{limit = DataDirLimit,
301305
NewMountPoints),
302306
emit_update_info(Id, "insufficient", Available, Limit)
303307
end, lists:sort(sets:to_list(NewlyAlarmedMPs))),
304-
%% TODO: rabbit_alarm:set_alarm/1 for affected queue types
308+
lists:foreach(
309+
fun(QT) ->
310+
Alarm = {resource_limit, {disk, QT}, node()},
311+
rabbit_alarm:set_alarm({Alarm, []})
312+
end, lists:sort(sets:to_list(NewlyAlarmedQTs))),
305313
lists:foreach(
306314
fun(Path) ->
307315
#mount_point{id = Id,
@@ -310,7 +318,11 @@ internal_update(#state{limit = DataDirLimit,
310318
NewMountPoints),
311319
emit_update_info(Id, "sufficient", Available, Limit)
312320
end, lists:sort(sets:to_list(NewlyClearedMPs))),
313-
%% TODO: rabbit_alarm:clear_alarm/1 for affected queue types
321+
lists:foreach(
322+
fun(QT) ->
323+
Alarm = {resource_limit, {disk, QT}, node()},
324+
rabbit_alarm:clear_alarm(Alarm)
325+
end, lists:sort(sets:to_list(NewlyClearedQTs))),
314326

315327
State#state{alarmed = NewAlarmed,
316328
actual = DataDirFree,
@@ -336,6 +348,19 @@ alarmed_mount_points(MountPoints) ->
336348
Acc
337349
end, sets:new([{version, 2}]), MountPoints).
338350

351+
-spec alarmed_queue_types(mount_points()) ->
352+
sets:set(module()).
353+
alarmed_queue_types(MountPoints) ->
354+
maps:fold(
355+
fun (_Path, #mount_point{available = Available,
356+
limit = Limit,
357+
queue_types = QTs}, Acc)
358+
when Available < Limit ->
359+
sets:union(QTs, Acc);
360+
(_Path, _MP, Acc) ->
361+
Acc
362+
end, sets:new([{version, 2}]), MountPoints).
363+
339364
-spec get_disk_free(#state{}) ->
340365
#{file:filename_all() => AvailableB :: non_neg_integer()}.
341366
get_disk_free(#state{dir = DataDir, mount_points = MountPoints}) ->

0 commit comments

Comments
 (0)