From 657df05ad9d762fb6e4bf3c2758d02b31c7ae3cc Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Tue, 16 May 2023 09:45:54 -0300 Subject: [PATCH] fix(buffer_worker): avoid setting flush timer when inflight is full MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://emqx.atlassian.net/browse/EMQX-9902 When the buffer worker inflight window is full, we don’t need to set a timer to flush the messages again because there’s no more room, and one of the inflight windows will flush the buffer worker by calling `flush_worker`. Currently, we do set the timer on such situation, and this fact combined with the default batch time of 0 yields a busy loop situation where the CPU spins a lot while inflight messages do not return. --- apps/emqx_resource/src/emqx_resource.app.src | 2 +- apps/emqx_resource/src/emqx_resource_buffer_worker.erl | 3 +-- changes/ce/fix-10717.en.md | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 changes/ce/fix-10717.en.md diff --git a/apps/emqx_resource/src/emqx_resource.app.src b/apps/emqx_resource/src/emqx_resource.app.src index 3e264cb3e..3b92f1200 100644 --- a/apps/emqx_resource/src/emqx_resource.app.src +++ b/apps/emqx_resource/src/emqx_resource.app.src @@ -1,7 +1,7 @@ %% -*- mode: erlang -*- {application, emqx_resource, [ {description, "Manager for all external resources"}, - {vsn, "0.1.15"}, + {vsn, "0.1.16"}, {registered, []}, {mod, {emqx_resource_app, []}}, {applications, [ diff --git a/apps/emqx_resource/src/emqx_resource_buffer_worker.erl b/apps/emqx_resource/src/emqx_resource_buffer_worker.erl index 2dd14c46b..8c5311f2a 100644 --- a/apps/emqx_resource/src/emqx_resource_buffer_worker.erl +++ b/apps/emqx_resource/src/emqx_resource_buffer_worker.erl @@ -495,8 +495,7 @@ flush(Data0) -> {keep_state, Data1}; {_, true} -> ?tp(buffer_worker_flush_but_inflight_full, #{}), - Data2 = ensure_flush_timer(Data1), - {keep_state, Data2}; + {keep_state, Data1}; {_, false} -> ?tp(buffer_worker_flush_before_pop, #{}), {Q1, QAckRef, Batch} = replayq:pop(Q0, #{count_limit => BatchSize}), diff --git a/changes/ce/fix-10717.en.md b/changes/ce/fix-10717.en.md new file mode 100644 index 000000000..4c33d6971 --- /dev/null +++ b/changes/ce/fix-10717.en.md @@ -0,0 +1 @@ +Fixed an issue where the buffering layer processes could use a lot of CPU when inflight window is full.