@@ -308,10 +308,14 @@ internal_update(#state{limit = DataDirLimit,
308308 ets :insert (? MOUNT_ETS_NAME , [M || _Path := M <- NewMounts ]),
309309
310310 AlarmedMs = alarmed_mounts (Mounts ),
311+ AlarmedQTs = alarmed_queue_types (Mounts ),
311312 NewAlarmedMs = alarmed_mounts (NewMounts ),
313+ NewAlarmedQTs = alarmed_queue_types (NewMounts ),
312314
313315 NewlyClearedMs = sets :subtract (AlarmedMs , NewAlarmedMs ),
316+ NewlyClearedQTs = sets :subtract (AlarmedQTs , NewAlarmedQTs ),
314317 NewlyAlarmedMs = sets :subtract (NewAlarmedMs , AlarmedMs ),
318+ NewlyAlarmedQTs = sets :subtract (NewAlarmedQTs , AlarmedQTs ),
315319
316320 lists :foreach (
317321 fun (Path ) ->
@@ -320,15 +324,23 @@ internal_update(#state{limit = DataDirLimit,
320324 available = Available } = maps :get (Path , NewMounts ),
321325 emit_update_info (Name , " insufficient" , Available , Limit )
322326 end , lists :sort (sets :to_list (NewlyAlarmedMs ))),
323- % % TODO: rabbit_alarm:set_alarm/1 for affected queue types
327+ lists :foreach (
328+ fun (QT ) ->
329+ Alarm = {resource_limit , {disk , QT }, node ()},
330+ rabbit_alarm :set_alarm ({Alarm , []})
331+ end , lists :sort (sets :to_list (NewlyAlarmedQTs ))),
324332 lists :foreach (
325333 fun (Path ) ->
326334 # mount {name = Name ,
327335 limit = Limit ,
328336 available = Available } = maps :get (Path , NewMounts ),
329337 emit_update_info (Name , " sufficient" , Available , Limit )
330338 end , lists :sort (sets :to_list (NewlyClearedMs ))),
331- % % TODO: rabbit_alarm:clear_alarm/1 for affected queue types
339+ lists :foreach (
340+ fun (QT ) ->
341+ Alarm = {resource_limit , {disk , QT }, node ()},
342+ rabbit_alarm :clear_alarm (Alarm )
343+ end , lists :sort (sets :to_list (NewlyClearedQTs ))),
332344
333345 State # state {alarmed = NewAlarmed ,
334346 actual = DataDirFree ,
@@ -353,6 +365,18 @@ alarmed_mounts(Mounts) ->
353365 Acc
354366 end , sets :new ([{version , 2 }]), Mounts ).
355367
368+ -spec alarmed_queue_types (mounts ()) ->
369+ sets :set (module ()).
370+ alarmed_queue_types (MountPoints ) ->
371+ maps :fold (
372+ fun (_Path , # mount {available = Available ,
373+ limit = Limit ,
374+ queue_types = QTs }, Acc ) when Available < Limit ->
375+ sets :union (QTs , Acc );
376+ (_Path , _Mount , Acc ) ->
377+ Acc
378+ end , sets :new ([{version , 2 }]), MountPoints ).
379+
356380-spec get_disk_free (# state {}) ->
357381 #{file :filename () => AvailableB :: non_neg_integer ()}.
358382get_disk_free (# state {dir = DataDir , mounts = Mounts }) ->
0 commit comments