diff --git a/src/conf.cpp b/src/conf.cpp index 47e6e696..a20647ca 100644 --- a/src/conf.cpp +++ b/src/conf.cpp @@ -7,6 +7,9 @@ #include "ledger/ledger_mount.hpp" #include "sc/contract_mount.hpp" +// Forward declaration to avoid circular dependency with usr/usr.hpp +namespace usr { void update_idle_timeout(const uint32_t timeout_ms); } + namespace conf { @@ -853,6 +856,21 @@ namespace conf return -1; } + // Apply user idle timeout change dynamically if present in patch config. + // Updates all active user sessions and future connections without restart. + try { + if (jdoc.contains("user") && jdoc["user"].contains("idle_timeout")) { + const uint32_t new_idle_timeout = jdoc["user"]["idle_timeout"].as(); + if (new_idle_timeout != cfg.user.idle_timeout) { + cfg.user.idle_timeout = new_idle_timeout; + temp_cfg.user.idle_timeout = new_idle_timeout; + usr::update_idle_timeout(new_idle_timeout); + LOG_INFO << "User idle timeout updated dynamically to: " << new_idle_timeout << "ms"; + } + } + } catch (const std::exception &e) { + LOG_ERROR << "Error applying user idle timeout from patch config: " << e.what(); + } LOG_INFO << "Contract config updated from patch file."; return 0; } diff --git a/src/usr/usr.cpp b/src/usr/usr.cpp index 061f48e8..6597bf83 100644 --- a/src/usr/usr.cpp +++ b/src/usr/usr.cpp @@ -74,6 +74,24 @@ namespace usr } } + /** + * Update user idle timeout on all active user sessions and for future connections. + * Called from conf::apply_patch_config() when user.idle_timeout changes in patch.cfg. + * Updates both the cached metric_thresholds array (for new sessions) and all + * existing live sessions via set_threshold() so no restart is required. + */ + void update_idle_timeout(const uint32_t timeout_ms) + { + metric_thresholds[4] = timeout_ms; + if (ctx.server.has_value()) + { + ctx.server->for_each_session([timeout_ms](user_comm_session &session) { + session.set_threshold(comm::SESSION_THRESHOLDS::IDLE_CONNECTION_TIMEOUT, timeout_ms, 60000); + }); + LOG_INFO << "User idle timeout updated dynamically to: " << timeout_ms << "ms"; + } + } + /** * Starts listening for incoming user websocket connections. */