325
325
memory_reduction_run_count ,
326
326
% % Queue data is grouped by VHost. We need to store it
327
327
% % to work with queue index.
328
- virtual_host
328
+ virtual_host ,
329
+ waiting_bump = false
329
330
}).
330
331
331
332
-record (rates , { in , out , ack_in , ack_out , timestamp }).
@@ -911,7 +912,10 @@ timeout(State = #vqstate { index_state = IndexState }) ->
911
912
handle_pre_hibernate (State = # vqstate { index_state = IndexState }) ->
912
913
State # vqstate { index_state = rabbit_queue_index :flush (IndexState ) }.
913
914
914
- resume (State ) -> a (reduce_memory_use (State )).
915
+ resume (State = # vqstate {waiting_bump = true }) ->
916
+ resume (State # vqstate {waiting_bump = false });
917
+ resume (State ) ->
918
+ a (reduce_memory_use (State )).
915
919
916
920
msg_rates (# vqstate { rates = # rates { in = AvgIngressRate ,
917
921
out = AvgEgressRate } }) ->
@@ -2466,21 +2470,16 @@ reduce_memory_use(State = #vqstate {
2466
2470
Blocked = credit_flow :blocked (),
2467
2471
case {Blocked , NeedResumeA2B orelse NeedResumeB2D } of
2468
2472
% % Credit bump will continue paging
2469
- {true , _ } -> ok ;
2473
+ {true , _ } -> State3 ;
2470
2474
% % Finished with paging
2471
- {false , false } -> ok ;
2475
+ {false , false } -> State3 ;
2472
2476
% % Planning next batch
2473
2477
{false , true } ->
2474
2478
% % We don't want to use self-credit-flow, because it's harder to
2475
2479
% % reason about. So the process sends a (prioritised) message to
2476
2480
% % itself and sets a waiting_bump value to keep the message box clean
2477
- case get (waiting_bump ) of
2478
- true -> ok ;
2479
- _ -> self () ! bump_reduce_memory_use ,
2480
- put (waiting_bump , true )
2481
- end
2482
- end ,
2483
- State3 ;
2481
+ maybe_bump_reduce_memory_use (State3 )
2482
+ end ;
2484
2483
% % When using lazy queues, there are no alphas, so we don't need to
2485
2484
% % call push_alphas_to_betas/2.
2486
2485
reduce_memory_use (State = # vqstate {
@@ -2506,6 +2505,12 @@ reduce_memory_use(State = #vqstate {
2506
2505
garbage_collect (),
2507
2506
State3 .
2508
2507
2508
+ maybe_bump_reduce_memory_use (State = # vqstate {waiting_bump = true }) ->
2509
+ State ;
2510
+ maybe_bump_reduce_memory_use (State ) ->
2511
+ self () ! bump_reduce_memory_use ,
2512
+ State # vqstate {waiting_bump = true }.
2513
+
2509
2514
limit_ram_acks (0 , State ) ->
2510
2515
{0 , ui (State )};
2511
2516
limit_ram_acks (Quota , State = # vqstate { ram_pending_ack = RPA ,
0 commit comments