This is an automated email from the ASF dual-hosted git repository.

wwbmmm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-brpc.git


The following commit(s) were added to refs/heads/master by this push:
     new a39db73a mbvar support delete_stats and has_stats interface (#2041)
a39db73a is described below

commit a39db73ad606c68c3c8e0f9175da54dabc7adfdf
Author: serverglen <[email protected]>
AuthorDate: Tue Dec 6 13:54:06 2022 +0800

    mbvar support delete_stats and has_stats interface (#2041)
    
    * mbvar support delete_stats and has_stats interface
    
    * Update multi_dimension_inl.h
---
 src/bvar/multi_dimension.h             | 17 +++++++++++------
 src/bvar/multi_dimension_inl.h         | 27 +++++++++++++++++++++++++--
 test/bvar_multi_dimension_unittest.cpp | 26 ++++++++++++++++++++++++++
 3 files changed, 62 insertions(+), 8 deletions(-)

diff --git a/src/bvar/multi_dimension.h b/src/bvar/multi_dimension.h
index c9cc9a3b..6c162517 100644
--- a/src/bvar/multi_dimension.h
+++ b/src/bvar/multi_dimension.h
@@ -85,6 +85,12 @@ public:
         return get_stats_impl(labels_value, READ_OR_INSERT);
     }
 
+    // Remove stat so those not count and dump
+    void delete_stats(const key_type& labels_value);
+
+    // True if bvar pointer exists
+    bool has_stats(const key_type& labels_value);
+
     // Get number of stats
     size_t count_stats();
 
@@ -96,7 +102,7 @@ public:
     // Return real bvar pointer if labels_name exist, NULL otherwise.
     // CAUTION!!! Just For Debug!!!
     T* get_stats_read_only(const key_type& labels_value) {
-        return get_stats_impl(labels_value, READ_ONLY);
+        return get_stats_impl(labels_value);
     }
 
     // Get real bvar pointer object 
@@ -105,14 +111,12 @@ public:
     T* get_stats_read_or_insert(const key_type& labels_value, bool* do_write = 
NULL) {
         return get_stats_impl(labels_value, READ_OR_INSERT, do_write);
     }
-
-    // Remove all stats so those not count and dump
-    // CAUTION!!! Just For Debug!!!
-    void delete_stats(const key_type& labels_value);
 #endif
 
 private:
-    T* get_stats_impl(const key_type& labels_value, STATS_OP stats_op = 
READ_ONLY, bool* do_write = NULL);
+    T* get_stats_impl(const key_type& labels_value);
+
+    T* get_stats_impl(const key_type& labels_value, STATS_OP stats_op, bool* 
do_write = NULL);
 
     void make_dump_key(std::ostream& os, 
                        const key_type& labels_value, 
@@ -125,6 +129,7 @@ private:
 
     bool is_valid_lables_value(const key_type& labels_value) const;
     
+    // Remove all stats so those not count and dump
     void delete_stats();
     
     static size_t init_flatmap(MetricMap& bg);
diff --git a/src/bvar/multi_dimension_inl.h b/src/bvar/multi_dimension_inl.h
index e66b5563..9e282dfa 100644
--- a/src/bvar/multi_dimension_inl.h
+++ b/src/bvar/multi_dimension_inl.h
@@ -87,7 +87,6 @@ size_t MultiDimension<T>::count_stats() {
     return metric_map_ptr->size();
 }
 
-#ifdef UNIT_TEST
 template <typename T>
 inline
 void MultiDimension<T>::delete_stats(const key_type& labels_value) {
@@ -110,7 +109,6 @@ void MultiDimension<T>::delete_stats(const key_type& 
labels_value) {
         }
     }
 }
-#endif // end UNIT_TEST
 
 template <typename T>
 inline
@@ -152,6 +150,25 @@ void MultiDimension<T>::list_stats(std::vector<key_type>* 
names) {
     }
 }
 
+template <typename T>
+inline
+T* MultiDimension<T>::get_stats_impl(const key_type& labels_value) {
+    if (!is_valid_lables_value(labels_value)) {
+        return nullptr;
+    }
+    MetricMapScopedPtr metric_map_ptr;
+    if (_metric_map.Read(&metric_map_ptr) != 0) {
+        LOG(ERROR) << "Fail to read dbd";
+        return nullptr;
+    }
+
+    auto it = metric_map_ptr->seek(labels_value);
+    if (it == nullptr) {
+        return nullptr;
+    }
+    return (*it);
+}
+
 template <typename T>
 inline
 T* MultiDimension<T>::get_stats_impl(const key_type& labels_value, STATS_OP 
stats_op, bool* do_write) {
@@ -204,6 +221,12 @@ T* MultiDimension<T>::get_stats_impl(const key_type& 
labels_value, STATS_OP stat
     return cache_metric;
 }
 
+template <typename T>
+inline
+bool MultiDimension<T>::has_stats(const key_type& labels_value) {
+    return get_stats_impl(labels_value) != nullptr;
+}
+
 template <typename T>
 inline
 size_t MultiDimension<T>::dump(Dumper* dumper, const DumpOptions* options) {
diff --git a/test/bvar_multi_dimension_unittest.cpp 
b/test/bvar_multi_dimension_unittest.cpp
index c40e5bbb..b30f8245 100644
--- a/test/bvar_multi_dimension_unittest.cpp
+++ b/test/bvar_multi_dimension_unittest.cpp
@@ -282,38 +282,50 @@ TEST_F(MultiDimensionTest, stats) {
     std::vector<std::list<std::string> > vec_labels;
     std::vector<std::list<std::string> > vec_labels_no_sort;
     bvar::MultiDimension<bvar::Adder<int> > my_madder("test_stats", labels);
+    ASSERT_EQ(0, my_madder.count_stats());
     std::list<std::string> labels_value1 = {"tc", "get", "200"};
+    ASSERT_FALSE(my_madder.has_stats(labels_value1));
     vec_labels.push_back(labels_value1);
     vec_labels_no_sort.push_back(labels_value1);
     bvar::Adder<int>* adder1 = my_madder.get_stats(labels_value1);
     ASSERT_TRUE(adder1);
+    ASSERT_TRUE(my_madder.has_stats(labels_value1));
     std::vector<std::list<std::string> > ret_labels;
     my_madder.list_stats(&ret_labels);
     ASSERT_EQ(vec_labels, ret_labels);
+    ASSERT_EQ(1, my_madder.count_stats());
 
     std::list<std::string> labels_value2 = {"nj", "get", "200"};
+    ASSERT_FALSE(my_madder.has_stats(labels_value2));
     bvar::Adder<int>* adder2 = my_madder.get_stats(labels_value2);
     ASSERT_TRUE(adder2);
+    ASSERT_TRUE(my_madder.has_stats(labels_value2));
     vec_labels.push_back(labels_value2);
     vec_labels_no_sort.push_back(labels_value2);
     my_madder.list_stats(&ret_labels);
     sort(vec_labels.begin(), vec_labels.end());
     sort(ret_labels.begin(), ret_labels.end());
     ASSERT_EQ(vec_labels, ret_labels);
+    ASSERT_EQ(2, my_madder.count_stats());
 
     std::list<std::string> labels_value3 = {"hz", "post", "500"};
+    ASSERT_FALSE(my_madder.has_stats(labels_value3));
     bvar::Adder<int>* adder3 = my_madder.get_stats(labels_value3);
     ASSERT_TRUE(adder3);
+    ASSERT_TRUE(my_madder.has_stats(labels_value3));
     vec_labels.push_back(labels_value3);
     vec_labels_no_sort.push_back(labels_value3);
     my_madder.list_stats(&ret_labels);
     sort(vec_labels.begin(), vec_labels.end());
     sort(ret_labels.begin(), ret_labels.end());
     ASSERT_EQ(vec_labels, ret_labels);
+    ASSERT_EQ(3, my_madder.count_stats());
 
     std::list<std::string> labels_value4 = {"gz", "post", "500"};
+    ASSERT_FALSE(my_madder.has_stats(labels_value4));
     bvar::Adder<int>* adder4 = my_madder.get_stats(labels_value4);
     ASSERT_TRUE(adder4);
+    ASSERT_TRUE(my_madder.has_stats(labels_value4));
     ASSERT_EQ(4, my_madder.count_stats());
     vec_labels.push_back(labels_value4);
     vec_labels_no_sort.push_back(labels_value4);
@@ -321,14 +333,28 @@ TEST_F(MultiDimensionTest, stats) {
     sort(vec_labels.begin(), vec_labels.end());
     sort(ret_labels.begin(), ret_labels.end());
     ASSERT_EQ(vec_labels, ret_labels);
+    ASSERT_EQ(4, my_madder.count_stats());
 
     my_madder.delete_stats(labels_value4);
+    ASSERT_FALSE(my_madder.has_stats(labels_value4));
     ASSERT_EQ(3, my_madder.count_stats());
     vec_labels_no_sort.pop_back();
     my_madder.list_stats(&ret_labels);
     sort(vec_labels_no_sort.begin(), vec_labels_no_sort.end());
     sort(ret_labels.begin(), ret_labels.end());
     ASSERT_EQ(vec_labels_no_sort, ret_labels);
+
+    ASSERT_TRUE(my_madder.has_stats(labels_value1));
+    ASSERT_TRUE(my_madder.has_stats(labels_value2));
+    ASSERT_TRUE(my_madder.has_stats(labels_value3));
+    ASSERT_FALSE(my_madder.has_stats(labels_value4));
+
+    my_madder.delete_stats();
+    ASSERT_EQ(0, my_madder.count_stats());
+    ASSERT_FALSE(my_madder.has_stats(labels_value1));
+    ASSERT_FALSE(my_madder.has_stats(labels_value2));
+    ASSERT_FALSE(my_madder.has_stats(labels_value3));
+    ASSERT_FALSE(my_madder.has_stats(labels_value4));
 }
 
 TEST_F(MultiDimensionTest, get_description) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to