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) {
     {

Reply via email to