This is an automated email from the ASF dual-hosted git repository. szaszm pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git
commit fb04567a0c3c4f29271742369a98d171a162549d Author: Gabor Gyimesi <[email protected]> AuthorDate: Mon Jun 14 15:27:53 2021 +0200 MINIFICPP-1557 Fix CPU usage percentage calculation Closes #1101 Signed-off-by: Marton Szasz <[email protected]> --- extensions/http-curl/tests/HTTPHandlers.h | 11 ++++++++--- libminifi/src/utils/ProcessCpuUsageTracker.cpp | 11 +++++++++-- libminifi/src/utils/SystemCpuUsageTracker.cpp | 16 ++++++++++++---- libminifi/test/unit/CpuUsageTest.cpp | 2 +- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/extensions/http-curl/tests/HTTPHandlers.h b/extensions/http-curl/tests/HTTPHandlers.h index e410f3b..f13e2be 100644 --- a/extensions/http-curl/tests/HTTPHandlers.h +++ b/extensions/http-curl/tests/HTTPHandlers.h @@ -27,6 +27,7 @@ #include "CivetStream.h" #include "io/CRCStream.h" #include "rapidjson/document.h" +#include "rapidjson/error/en.h" #include "HTTPUtils.h" #include "ServerAwareHandler.h" #include "utils/gsl.h" @@ -422,11 +423,15 @@ class HeartbeatHandler : public ServerAwareHandler { void verify(struct mg_connection *conn) { auto post_data = readPayload(conn); + if (!isServerRunning()) { + return; + } if (!IsNullOrEmpty(post_data)) { rapidjson::Document root; - rapidjson::ParseResult ok = root.Parse(post_data.data(), post_data.size()); - assert(ok); - (void)ok; // unused in release builds + rapidjson::ParseResult result = root.Parse(post_data.data(), post_data.size()); + if (!result) { + throw std::runtime_error(fmt::format("JSON parse error: {0}\n JSON data: {1}", std::string(rapidjson::GetParseError_En(result.Code())), post_data)); + } std::string operation = root["operation"].GetString(); if (operation == "heartbeat") { handleHeartbeat(root, conn); diff --git a/libminifi/src/utils/ProcessCpuUsageTracker.cpp b/libminifi/src/utils/ProcessCpuUsageTracker.cpp index c970c18..3a9eade 100644 --- a/libminifi/src/utils/ProcessCpuUsageTracker.cpp +++ b/libminifi/src/utils/ProcessCpuUsageTracker.cpp @@ -22,6 +22,7 @@ #endif #include <thread> +#include <algorithm> namespace org { namespace apache { @@ -68,10 +69,13 @@ bool ProcessCpuUsageTracker::isCurrentQuerySameAsPrevious() const { double ProcessCpuUsageTracker::getProcessCpuUsageBetweenLastTwoQueries() const { clock_t cpu_times_diff = cpu_times_ - previous_cpu_times_; + if (cpu_times_diff == 0) { + return -1.0; + } clock_t sys_cpu_times_diff = sys_cpu_times_ - previous_sys_cpu_times_; clock_t user_cpu_times_diff = user_cpu_times_ - previous_user_cpu_times_; double percent = static_cast<double>(sys_cpu_times_diff + user_cpu_times_diff) / static_cast<double>(cpu_times_diff); - percent = percent / std::thread::hardware_concurrency(); + percent = percent / (std::max)(uint32_t{1}, std::thread::hardware_concurrency()); return percent; } @@ -123,10 +127,13 @@ void ProcessCpuUsageTracker::queryCpuTimes() { double ProcessCpuUsageTracker::getProcessCpuUsageBetweenLastTwoQueries() const { uint64_t cpu_times_diff = cpu_times_ - previous_cpu_times_; + if (cpu_times_diff == 0) { + return -1.0; + } uint64_t sys_cpu_times_diff = sys_cpu_times_ - previous_sys_cpu_times_; uint64_t user_cpu_times_diff = user_cpu_times_ - previous_user_cpu_times_; double percent = static_cast<double>(sys_cpu_times_diff + user_cpu_times_diff) / static_cast<double>(cpu_times_diff); - percent = percent / std::thread::hardware_concurrency(); + percent = percent / (std::max)(uint32_t{1}, std::thread::hardware_concurrency()); return percent; } #endif diff --git a/libminifi/src/utils/SystemCpuUsageTracker.cpp b/libminifi/src/utils/SystemCpuUsageTracker.cpp index d7b5ec7..9ca5344 100644 --- a/libminifi/src/utils/SystemCpuUsageTracker.cpp +++ b/libminifi/src/utils/SystemCpuUsageTracker.cpp @@ -75,8 +75,11 @@ double SystemCpuUsageTracker::getCpuUsageBetweenLastTwoQueries() const { uint64_t total_user_low_diff = total_user_low_ - previous_total_user_low_; uint64_t total_system_diff = total_sys_ - previous_total_sys_; uint64_t total_idle_diff = total_idle_ - previous_total_idle_; - uint64_t total_diff = total_user_diff + total_user_low_diff + total_system_diff; - double percent = static_cast<double>(total_diff)/static_cast<double>(total_diff+total_idle_diff); + uint64_t total_diff = total_user_diff + total_user_low_diff + total_system_diff; + if (total_diff + total_idle_diff == 0) { + return -1.0; + } + double percent = static_cast<double>(total_diff) / static_cast<double>(total_diff + total_idle_diff); return percent; } @@ -126,6 +129,9 @@ double SystemCpuUsageTracker::getCpuUsageBetweenLastTwoQueries() const { uint64_t total_sys_diff = total_sys_ - previous_total_sys_; uint64_t total_idle_diff = total_idle_ - previous_total_idle_; uint64_t total_diff = total_user_diff + total_sys_diff; + if (total_diff == 0) { + return -1.0; + } double percent = static_cast<double>(total_diff - total_idle_diff) / static_cast<double>(total_diff); return percent; @@ -176,8 +182,10 @@ bool SystemCpuUsageTracker::isCurrentQuerySameAsPrevious() const { double SystemCpuUsageTracker::getCpuUsageBetweenLastTwoQueries() const { uint64_t total_ticks_since_last_time = total_ticks_-previous_total_ticks_; uint64_t idle_ticks_since_last_time = idle_ticks_-previous_idle_ticks_; - - double percent = static_cast<double>(total_ticks_since_last_time-idle_ticks_since_last_time)/static_cast<double>(total_ticks_since_last_time); + if (total_ticks_since_last_time == 0) { + return -1.0; + } + double percent = static_cast<double>(total_ticks_since_last_time - idle_ticks_since_last_time) / static_cast<double>(total_ticks_since_last_time); return percent; } diff --git a/libminifi/test/unit/CpuUsageTest.cpp b/libminifi/test/unit/CpuUsageTest.cpp index d9e6c06..c8ac357 100644 --- a/libminifi/test/unit/CpuUsageTest.cpp +++ b/libminifi/test/unit/CpuUsageTest.cpp @@ -49,7 +49,7 @@ TEST_CASE("Test System CPU Utilization", "[testcpuusage]") { org::apache::nifi::minifi::utils::SystemCpuUsageTracker hostTracker; org::apache::nifi::minifi::utils::ProcessCpuUsageTracker processTracker; - int vCores = std::thread::hardware_concurrency(); + auto vCores = (std::max)(uint32_t{1}, std::thread::hardware_concurrency()); auto test_start = std::chrono::system_clock::now(); for (int i = 0; i < number_of_rounds; ++i) { {
