summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Klishin <klishinm@vmware.com>2021-10-15 16:24:30 +0300
committerMichael Klishin <michael@clojurewerkz.org>2021-10-15 16:25:24 +0300
commit732e72b0dac1fb06e938e71e5fe3c83d3f48eb5b (patch)
tree527ee2c3c3e30406743cdc67cbeb1b9ab987cc8b
parent45a654c9299b7c71ac9fd47de645b3f443ca0820 (diff)
downloadrabbitmq-server-git-732e72b0dac1fb06e938e71e5fe3c83d3f48eb5b.tar.gz
Merge pull request #3582 from luos/channel-q-pid-leak-fix-v39x
Fix an Erlang monitor leak when queue churn is high (cherry picked from commit a78b76afcda60820cf78f16a509b50b8ec32789b)
-rw-r--r--deps/rabbit/src/rabbit_channel.erl8
-rw-r--r--deps/rabbit/src/rabbit_queue_type.erl2
2 files changed, 6 insertions, 4 deletions
diff --git a/deps/rabbit/src/rabbit_channel.erl b/deps/rabbit/src/rabbit_channel.erl
index cf4b160fcb..d1059b4cbe 100644
--- a/deps/rabbit/src/rabbit_channel.erl
+++ b/deps/rabbit/src/rabbit_channel.erl
@@ -817,8 +817,10 @@ handle_info({'DOWN', _MRef, process, QPid, Reason},
State1 = State0#ch{queue_states = QState1},
State = handle_queue_actions(Actions, State1),
noreply_coalesce(State);
- {eol, QRef} ->
- State1 = handle_consuming_queue_down_or_eol(QRef, State0),
+ {eol, QState1, QRef} ->
+ State1 = handle_consuming_queue_down_or_eol(QRef, State0#ch{
+ queue_states = QState1
+ }),
{ConfirmMXs, UC1} =
rabbit_confirms:remove_queue(QRef, State1#ch.unconfirmed),
%% Deleted queue is a special case.
@@ -827,7 +829,7 @@ handle_info({'DOWN', _MRef, process, QPid, Reason},
State1#ch{unconfirmed = UC1}),
erase_queue_stats(QRef),
noreply_coalesce(
- State2#ch{queue_states = rabbit_queue_type:remove(QRef, QStates0)})
+ State2#ch{queue_states = rabbit_queue_type:remove(QRef, State2#ch.queue_states)})
end;
handle_info({'EXIT', _Pid, Reason}, State) ->
diff --git a/deps/rabbit/src/rabbit_queue_type.erl b/deps/rabbit/src/rabbit_queue_type.erl
index dd405119be..055b637354 100644
--- a/deps/rabbit/src/rabbit_queue_type.erl
+++ b/deps/rabbit/src/rabbit_queue_type.erl
@@ -398,7 +398,7 @@ handle_down(Pid, Info, #?STATE{monitor_registry = Reg0} = State0) ->
{ok, State, Actions} ->
{ok, State#?STATE{monitor_registry = Reg}, Actions};
eol ->
- {eol, QRef};
+ {eol, State0#?STATE{monitor_registry = Reg}, QRef};
Err ->
Err
end;