From 94106cf964228559d5946ed6a0dadb532318aaa7 Mon Sep 17 00:00:00 2001 From: Aleksey Sabilin Date: Wed, 15 Jul 2026 17:28:39 +0300 Subject: [PATCH] =?UTF-8?q?fix(mnesia):=20=D0=BF=D0=BE=D0=B4=D0=BD=D1=8F?= =?UTF-8?q?=D1=82=D1=8C=20dump=5Flog=5Fwrite=5Fthreshold;=20Traefik=20base?= =?UTF-8?q?=20v3.3.6.=20Refs=20EventHub/EventHubBack#34=20Refs=20EventHub/?= =?UTF-8?q?EventHubDevOps#3=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/traefik/Dockerfile | 2 +- src/eventhub_app.erl | 1 + src/infra/infra_mnesia.erl | 30 ++++++++++++++++++++++++++++++ test/tsung/README.md | 2 ++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/docker/traefik/Dockerfile b/docker/traefik/Dockerfile index 13abd54..186d08a 100644 --- a/docker/traefik/Dockerfile +++ b/docker/traefik/Dockerfile @@ -1,4 +1,4 @@ -FROM traefik:v3.2.0 +FROM traefik:v3.3.6 ARG CORAZA_VERSION=v0.3.0 ARG CORAZA_MODULE=github.com/jcchavezs/coraza-http-wasm-traefik diff --git a/src/eventhub_app.erl b/src/eventhub_app.erl index 3ac444b..0c0a51a 100644 --- a/src/eventhub_app.erl +++ b/src/eventhub_app.erl @@ -47,6 +47,7 @@ start_application() -> application:set_env(eventhub, extra_db_nodes, Nodes) end, application:ensure_all_started(mnesia), + ok = infra_mnesia:configure_dump_log(), ok = infra_mnesia:init_tables(), ok = infra_mnesia:wait_for_tables(), ok = migration_engine:ensure_applied(), diff --git a/src/infra/infra_mnesia.erl b/src/infra/infra_mnesia.erl index 94c2cbf..55530cc 100644 --- a/src/infra/infra_mnesia.erl +++ b/src/infra/infra_mnesia.erl @@ -8,6 +8,7 @@ -export([start_link/0, init_tables/0, wait_for_tables/0, wait_for_table/1]). -export([add_cluster_nodes/1]). +-export([configure_dump_log/0]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). @@ -44,6 +45,35 @@ wait_for_tables() -> add_cluster_nodes(Nodes) -> gen_server:call(?MODULE, {add_nodes, Nodes}). +%% @doc Soften dump_log overload under write-heavy load (IFT stress). +%% OTP warns {dump_log, write_threshold|time_threshold} when a new dump +%% is requested while the previous dump still runs. +%% Override: MNESIA_DUMP_LOG_WRITE_THRESHOLD (default 50000; OTP default ~1000). +-spec configure_dump_log() -> ok. +configure_dump_log() -> + Threshold = env_int("MNESIA_DUMP_LOG_WRITE_THRESHOLD", 50000), + case mnesia:change_config(dump_log_write_threshold, Threshold) of + {ok, Old} -> + io:format("Mnesia dump_log_write_threshold: ~p -> ~p~n", [Old, Threshold]), + ok; + Other -> + io:format("Mnesia dump_log_write_threshold change failed: ~p~n", [Other]), + ok + end. + +env_int(Name, Default) -> + case os:getenv(Name) of + false -> Default; + "" -> Default; + Val -> + try list_to_integer(Val) of + N when N > 0 -> N; + _ -> Default + catch + error:badarg -> Default + end + end. + %% =================================================================== %% gen_server callbacks %% =================================================================== diff --git a/test/tsung/README.md b/test/tsung/README.md index 42b2c0f..c062110 100644 --- a/test/tsung/README.md +++ b/test/tsung/README.md @@ -62,6 +62,8 @@ IFT = Docker Swarm **внутри WSL2 на Windows**. Aggressive open-loop бе **Controlled hold ×3** (`20260715-1411/`, `EVENTHUB_REPLICAS=3`): connect по фазам 0.2→0.035 GREEN (0.05 mean≈40 ms); overall BOUNDARY_HIT из‑за **3772× HTTP 429** — узкое место сместилось на Traefik `api-ratelimit` (per source IP, было 5000/1m≈83 rps). После поднятия IFT-лимитов до 2000/1s (EventHubBack#32) перепроверить hold ×3. +Под hold также: `Mnesia is overloaded: {dump_log, write_threshold|time_threshold}`. Краткосрочно: `MNESIA_DUMP_LOG_WRITE_THRESHOLD` (IFT default 50000, EventHubBack#34). Долгосрочно: меньше sync-транзакций / hot-path вне Mnesia. + Restore fallback: оркестратор → WSL SSH, при fail Windows `restore-ift.ps1`. Если после stress SSH «висит на banner» — **reboot IFT**, затем: