You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pegasus.apache.org by la...@apache.org on 2023/06/25 04:12:04 UTC
[incubator-pegasus] branch migrate-metrics-dev updated: fix(new_metrics): total_capacity_mb and total_available_mb are not atomic (#1542)
This is an automated email from the ASF dual-hosted git repository.
laiyingchun pushed a commit to branch migrate-metrics-dev
in repository https://gitbox.apache.org/repos/asf/incubator-pegasus.git
The following commit(s) were added to refs/heads/migrate-metrics-dev by this push:
new 1a3ab78fb fix(new_metrics): total_capacity_mb and total_available_mb are not atomic (#1542)
1a3ab78fb is described below
commit 1a3ab78fb293a0aa40b3806549808e0bf837447e
Author: Dan Wang <wa...@apache.org>
AuthorDate: Sun Jun 25 12:11:59 2023 +0800
fix(new_metrics): total_capacity_mb and total_available_mb are not atomic (#1542)
---
src/block_service/hdfs/hdfs_service.cpp | 1 -
src/common/fs_manager.cpp | 17 ++++++++++-------
src/common/fs_manager.h | 5 +++--
src/replica/replica_stub.cpp | 4 ++--
src/replica/test/replica_test.cpp | 1 -
5 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/src/block_service/hdfs/hdfs_service.cpp b/src/block_service/hdfs/hdfs_service.cpp
index 459108e11..72b520028 100644
--- a/src/block_service/hdfs/hdfs_service.cpp
+++ b/src/block_service/hdfs/hdfs_service.cpp
@@ -19,7 +19,6 @@
#include <fcntl.h>
#include <algorithm>
#include <fstream>
-#include <type_traits>
#include <utility>
#include "block_service/directio_writable_file.h"
diff --git a/src/common/fs_manager.cpp b/src/common/fs_manager.cpp
index 9b8d791e6..f33e9eece 100644
--- a/src/common/fs_manager.cpp
+++ b/src/common/fs_manager.cpp
@@ -376,8 +376,8 @@ void fs_manager::remove_replica(const gpid &pid)
void fs_manager::update_disk_stat()
{
- _total_capacity_mb = 0;
- _total_available_mb = 0;
+ int64_t total_capacity_mb = 0;
+ int64_t total_available_mb = 0;
int total_available_ratio = 0;
int min_available_ratio = 100;
int max_available_ratio = 0;
@@ -393,23 +393,26 @@ void fs_manager::update_disk_stat()
continue;
}
dn->update_disk_stat();
- _total_capacity_mb += dn->disk_capacity_mb;
- _total_available_mb += dn->disk_available_mb;
+ total_capacity_mb += dn->disk_capacity_mb;
+ total_available_mb += dn->disk_available_mb;
min_available_ratio = std::min(dn->disk_available_ratio, min_available_ratio);
max_available_ratio = std::max(dn->disk_available_ratio, max_available_ratio);
}
total_available_ratio = static_cast<int>(
- _total_capacity_mb == 0 ? 0 : std::round(_total_available_mb * 100.0 / _total_capacity_mb));
+ total_capacity_mb == 0 ? 0 : std::round(total_available_mb * 100.0 / total_capacity_mb));
LOG_INFO("update disk space succeed: disk_count = {}, total_capacity_mb = {}, "
"total_available_mb = {}, total_available_ratio = {}%, min_available_ratio = {}%, "
"max_available_ratio = {}%",
_dir_nodes.size(),
- _total_capacity_mb,
- _total_available_mb,
+ total_capacity_mb,
+ total_available_mb,
total_available_ratio,
min_available_ratio,
max_available_ratio);
+
+ _total_capacity_mb.store(total_capacity_mb, std::memory_order_relaxed);
+ _total_available_mb.store(total_available_mb, std::memory_order_relaxed);
}
void fs_manager::add_new_dir_node(const std::string &data_dir, const std::string &tag)
diff --git a/src/common/fs_manager.h b/src/common/fs_manager.h
index c0c461c57..eacdeb317 100644
--- a/src/common/fs_manager.h
+++ b/src/common/fs_manager.h
@@ -29,6 +29,7 @@
#include "common/replication_other_types.h"
#include "metadata_types.h"
#include "utils/autoref_ptr.h"
+#include "utils/error_code.h"
#include "utils/flags.h"
#include "utils/metrics.h"
#include "utils/ports.h"
@@ -170,8 +171,8 @@ private:
// Especially when visiting the holding_replicas, you must take care.
mutable zrwlock_nr _lock; // [ lock
- int64_t _total_capacity_mb = 0;
- int64_t _total_available_mb = 0;
+ std::atomic<int64_t> _total_capacity_mb{0};
+ std::atomic<int64_t> _total_available_mb{0};
// Once dir_node has been added to '_dir_nodes', it will not be removed, it will be marked
// as non-NORMAL status if it is not available.
diff --git a/src/replica/replica_stub.cpp b/src/replica/replica_stub.cpp
index 292af639c..d917625bb 100644
--- a/src/replica/replica_stub.cpp
+++ b/src/replica/replica_stub.cpp
@@ -910,8 +910,8 @@ void replica_stub::on_query_disk_info(query_disk_info_rpc rpc)
resp.disk_infos = _fs_manager.get_disk_infos(app_id);
// Get the statistics from fs_manager's metrics, they are thread-safe.
- resp.total_capacity_mb = _fs_manager._counter_total_capacity_mb->get_integer_value();
- resp.total_available_mb = _fs_manager._counter_total_available_mb->get_integer_value();
+ resp.total_capacity_mb = _fs_manager._total_capacity_mb.load(std::memory_order_relaxed);
+ resp.total_available_mb = _fs_manager._total_available_mb.load(std::memory_order_relaxed);
resp.err = ERR_OK;
}
diff --git a/src/replica/test/replica_test.cpp b/src/replica/test/replica_test.cpp
index f2a211384..8a4d215c1 100644
--- a/src/replica/test/replica_test.cpp
+++ b/src/replica/test/replica_test.cpp
@@ -22,7 +22,6 @@
#include <gtest/gtest.h>
#include <stddef.h>
#include <stdint.h>
-#include <unistd.h>
#include <atomic>
#include <iostream>
#include <map>
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pegasus.apache.org
For additional commands, e-mail: commits-help@pegasus.apache.org