From 5fda1c0fabe306ff6751703cc3a1df2f2863f0d7 Mon Sep 17 00:00:00 2001 From: Dariusz Trawinski Date: Mon, 13 Jul 2026 00:07:43 +0200 Subject: [PATCH 1/3] watcher started only when needed --- src/modelmanager.cpp | 29 ++++++++++++++++++++++++++++- src/modelmanager.hpp | 6 ++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/modelmanager.cpp b/src/modelmanager.cpp index 544ad2a69b..d666ce9087 100644 --- a/src/modelmanager.cpp +++ b/src/modelmanager.cpp @@ -196,7 +196,7 @@ Status ModelManager::start(const Config& config) { SPDLOG_LOGGER_ERROR(modelmanager_logger, "Couldn't start model manager"); return status; } - startWatcher(isStartedWithConfigFile()); + evaluatePollingState(); if (resourcesCleanupIntervalMillisec > 0) startCleaner(); @@ -212,6 +212,33 @@ void ModelManager::startWatcher(bool watchConfigFile) { } } +void ModelManager::evaluatePollingState() { + if (watcherStarted) { + return; + } + + static const std::set singleFileExtensions = { + ".xml", ".onnx", ".pdmodel", ".pdiparams", ".pb", ".tflite"}; + + bool needed = false; + for (const auto& [name, config] : servedModelConfigs) { + const std::string& basePath = config.getBasePath(); + auto ext = std::filesystem::path(basePath).extension().string(); + if (singleFileExtensions.count(ext) == 0) { + SPDLOG_LOGGER_TRACE(modelmanager_logger, "Model {} with path {} requires version polling", name, basePath); + needed = true; + break; + } + } + + if (needed && watcherIntervalMillisec > 0) { + SPDLOG_LOGGER_INFO(modelmanager_logger, "Filesystem version polling enabled - at least one model uses version directories"); + startWatcher(isStartedWithConfigFile()); + } else { + SPDLOG_LOGGER_INFO(modelmanager_logger, "Filesystem version polling disabled - no model uses version directories"); + } +} + void ModelManager::startCleaner() { if ((!cleanerStarted)) { std::future exitSignal = cleanerExitTrigger.get_future(); diff --git a/src/modelmanager.hpp b/src/modelmanager.hpp index 22b80b5251..1a23ea75e5 100644 --- a/src/modelmanager.hpp +++ b/src/modelmanager.hpp @@ -128,6 +128,12 @@ class ModelManager : public ServableNameChecker, public MetricProvider, public M */ void watcher(std::future exitSignal, bool watchConfigFile); + /** + * @brief Evaluates whether filesystem version polling is needed + * and starts the watcher thread if at least one model uses version directories + */ + void evaluatePollingState(); + /** * @brief Cleaner thread for resources cleanup */ From 0650cfa0ef2ba5d93fce10dd0ed537cd9b1d092f Mon Sep 17 00:00:00 2001 From: Dariusz Trawinski Date: Fri, 17 Jul 2026 01:50:27 +0200 Subject: [PATCH 2/3] fix watcher conditions --- src/modelmanager.cpp | 34 +++++++++++++++++++---------- src/modelmanager.hpp | 1 + src/test/configs/config_string.json | 3 ++- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/modelmanager.cpp b/src/modelmanager.cpp index bc5a5ada00..1ece3d3c2c 100644 --- a/src/modelmanager.cpp +++ b/src/modelmanager.cpp @@ -213,29 +213,34 @@ void ModelManager::startWatcher(bool watchConfigFile) { } void ModelManager::evaluatePollingState() { - if (watcherStarted) { - return; - } - static const std::set singleFileExtensions = { ".xml", ".onnx", ".pdmodel", ".pdiparams", ".pb", ".tflite"}; - bool needed = false; + versionPollingNeeded = false; for (const auto& [name, config] : servedModelConfigs) { const std::string& basePath = config.getBasePath(); auto ext = std::filesystem::path(basePath).extension().string(); if (singleFileExtensions.count(ext) == 0) { SPDLOG_LOGGER_TRACE(modelmanager_logger, "Model {} with path {} requires version polling", name, basePath); - needed = true; + versionPollingNeeded = true; break; } } - if (needed && watcherIntervalMillisec > 0) { - SPDLOG_LOGGER_INFO(modelmanager_logger, "Filesystem version polling enabled - at least one model uses version directories"); + if (watcherStarted) { + return; + } + + bool needWatcher = versionPollingNeeded || isStartedWithConfigFile(); + if (needWatcher && watcherIntervalMillisec > 0) { + if (versionPollingNeeded) { + SPDLOG_LOGGER_DEBUG(modelmanager_logger, "Filesystem version polling enabled - at least one model uses version directories"); + } else { + SPDLOG_LOGGER_DEBUG(modelmanager_logger, "Filesystem version polling disabled - no model uses version directories"); + } startWatcher(isStartedWithConfigFile()); } else { - SPDLOG_LOGGER_INFO(modelmanager_logger, "Filesystem version polling disabled - no model uses version directories"); + SPDLOG_LOGGER_DEBUG(modelmanager_logger, "Filesystem version polling disabled - no model uses version directories"); } } @@ -1074,18 +1079,23 @@ Status ModelManager::configFileReloadNeeded(bool& isNeeded) { void ModelManager::watcher(std::future exitSignal, bool watchConfigFile) { SPDLOG_LOGGER_INFO(modelmanager_logger, "Started model manager thread"); while (exitSignal.wait_for(std::chrono::milliseconds(this->watcherIntervalMillisec)) == std::future_status::timeout) { - SPDLOG_LOGGER_TRACE(modelmanager_logger, "Models configuration and filesystem check cycle begin"); std::unique_lock loadingLock(configMtx); if (watchConfigFile) { + SPDLOG_LOGGER_TRACE(modelmanager_logger, "Checking if config file changed"); bool isNeeded; configFileReloadNeeded(isNeeded); if (isNeeded) { loadConfig(); + evaluatePollingState(); } } - updateConfigurationWithoutConfigFile(); + if (versionPollingNeeded) { + SPDLOG_LOGGER_TRACE(modelmanager_logger, "Models configuration and filesystem check cycle begin"); + updateConfigurationWithoutConfigFile(); + SPDLOG_LOGGER_TRACE(modelmanager_logger, "Models configuration and filesystem check cycle end"); + } loadingLock.unlock(); - SPDLOG_LOGGER_TRACE(modelmanager_logger, "Models configuration and filesystem check cycle end"); + } SPDLOG_LOGGER_INFO(modelmanager_logger, "Stopped model manager thread"); } diff --git a/src/modelmanager.hpp b/src/modelmanager.hpp index c216c49774..42bcd45ffc 100644 --- a/src/modelmanager.hpp +++ b/src/modelmanager.hpp @@ -96,6 +96,7 @@ class ModelManager : public ServableNameChecker, public MetricProvider, public M private: bool watcherStarted = false; bool cleanerStarted = false; + bool versionPollingNeeded = false; ModelManager(const ModelManager&) = delete; diff --git a/src/test/configs/config_string.json b/src/test/configs/config_string.json index 4fb2a33969..cd322447f3 100644 --- a/src/test/configs/config_string.json +++ b/src/test/configs/config_string.json @@ -3,6 +3,7 @@ {"config": { "name": "passthrough", "base_path": "/ovms/src/test/passthrough_string", - "shape": "(-1)"}} + "shape": "(-1)", + "target_device": "CPU"}} ] } From b34a88f93bcb017b95f01d455c7056d900973a7a Mon Sep 17 00:00:00 2001 From: Dariusz Trawinski Date: Fri, 17 Jul 2026 02:31:56 +0200 Subject: [PATCH 3/3] style --- src/modelmanager.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/modelmanager.cpp b/src/modelmanager.cpp index 1ece3d3c2c..906693dc68 100644 --- a/src/modelmanager.cpp +++ b/src/modelmanager.cpp @@ -1095,7 +1095,6 @@ void ModelManager::watcher(std::future exitSignal, bool watchConfigFile) { SPDLOG_LOGGER_TRACE(modelmanager_logger, "Models configuration and filesystem check cycle end"); } loadingLock.unlock(); - } SPDLOG_LOGGER_INFO(modelmanager_logger, "Stopped model manager thread"); }