You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by ya...@apache.org on 2021/03/12 05:45:14 UTC
[incubator-doris] branch master updated: [UT] fix memory tracker ut
(#5501)
This is an automated email from the ASF dual-hosted git repository.
yangzhg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new c9a25aa [UT] fix memory tracker ut (#5501)
c9a25aa is described below
commit c9a25aa29e5bebb5d5a20d7bc3e9f086841f3417
Author: stdpain <34...@users.noreply.github.com>
AuthorDate: Fri Mar 12 13:45:04 2021 +0800
[UT] fix memory tracker ut (#5501)
* [UT] fix memory tracker ut
* Update mem_limit_test.cpp
---
be/test/runtime/CMakeLists.txt | 2 +-
be/test/runtime/mem_limit_test.cpp | 182 +++++++------------------------------
2 files changed, 35 insertions(+), 149 deletions(-)
diff --git a/be/test/runtime/CMakeLists.txt b/be/test/runtime/CMakeLists.txt
index 0d0e33c..6c7e5ac 100644
--- a/be/test/runtime/CMakeLists.txt
+++ b/be/test/runtime/CMakeLists.txt
@@ -43,7 +43,7 @@ ADD_BE_TEST(fragment_mgr_test)
#ADD_BE_TEST(tmp_file_mgr_test)
#ADD_BE_TEST(disk_io_mgr_test)
-#ADD_BE_TEST(mem_limit_test)
+ADD_BE_TEST(mem_limit_test)
#ADD_BE_TEST(buffered_block_mgr2_test)
#ADD_BE_TEST(buffered_tuple_stream2_test)
ADD_BE_TEST(stream_load_pipe_test)
diff --git a/be/test/runtime/mem_limit_test.cpp b/be/test/runtime/mem_limit_test.cpp
index 487a54b..2e27970 100644
--- a/be/test/runtime/mem_limit_test.cpp
+++ b/be/test/runtime/mem_limit_test.cpp
@@ -23,89 +23,38 @@
namespace doris {
-TEST(MemTestTest, SingleTrackerNoLimit) {
- MemTracker t(-1);
- EXPECT_FALSE(t.has_limit());
- t.Consume(10);
- EXPECT_EQ(t.consumption(), 10);
- t.Consume(10);
- EXPECT_EQ(t.consumption(), 20);
- t.Release(15);
- EXPECT_EQ(t.consumption(), 5);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
+TEST(MemTrackerTest, SingleTrackerNoLimit) {
+ auto t = MemTracker::CreateTracker();
+ EXPECT_FALSE(t->has_limit());
+ t->Consume(10);
+ EXPECT_EQ(t->consumption(), 10);
+ t->Consume(10);
+ EXPECT_EQ(t->consumption(), 20);
+ t->Release(15);
+ EXPECT_EQ(t->consumption(), 5);
+ EXPECT_FALSE(t->LimitExceeded(MemLimit::HARD));
+ t->Release(5);
}
TEST(MemTestTest, SingleTrackerWithLimit) {
- MemTracker t(11);
- EXPECT_TRUE(t.has_limit());
- t.Consume(10);
- EXPECT_EQ(t.consumption(), 10);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
- t.Consume(10);
- EXPECT_EQ(t.consumption(), 20);
- EXPECT_TRUE(t.LimitExceeded(MemLimit::HARD));
- t.Release(15);
- EXPECT_EQ(t.consumption(), 5);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
+ auto t = MemTracker::CreateTracker(11, "limit tracker");
+ EXPECT_TRUE(t->has_limit());
+ t->Consume(10);
+ EXPECT_EQ(t->consumption(), 10);
+ EXPECT_FALSE(t->LimitExceeded(MemLimit::HARD));
+ t->Consume(10);
+ EXPECT_EQ(t->consumption(), 20);
+ EXPECT_TRUE(t->LimitExceeded(MemLimit::HARD));
+ t->Release(15);
+ EXPECT_EQ(t->consumption(), 5);
+ EXPECT_FALSE(t->LimitExceeded(MemLimit::HARD));
+ t->Release(5);
}
-#if 0
-TEST(MemTestTest, ConsumptionMetric) {
- TMetricDef md;
- md.__set_key("test");
- md.__set_units(TUnit::BYTES);
- md.__set_kind(TMetricKind::GAUGE);
- UIntGauge metric(md, 0);
- EXPECT_EQ(metric.value(), 0);
-
- MemTracker t(&metric, 100, -1, "");
- EXPECT_TRUE(t.has_limit());
- EXPECT_EQ(t.consumption(), 0);
-
- // Consume()/Release() arguments have no effect
- t.Consume(150);
- EXPECT_EQ(t.consumption(), 0);
- EXPECT_EQ(t.peak_consumption(), 0);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
- t.Release(5);
- EXPECT_EQ(t.consumption(), 0);
- EXPECT_EQ(t.peak_consumption(), 0);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
-
- metric.Increment(10);
- // _consumption is only updated with _consumption_metric after calls to
- // Consume()/Release() with a non-zero value
- t.Consume(1);
- EXPECT_EQ(t.consumption(), 10);
- EXPECT_EQ(t.peak_consumption(), 10);
- metric.Increment(-5);
- t.Consume(-1);
- EXPECT_EQ(t.consumption(), 5);
- EXPECT_EQ(t.peak_consumption(), 10);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
- metric.Increment(150);
- t.Consume(1);
- EXPECT_EQ(t.consumption(), 155);
- EXPECT_EQ(t.peak_consumption(), 155);
- EXPECT_TRUE(t.LimitExceeded(MemLimit::HARD));
- metric.Increment(-150);
- t.Consume(-1);
- EXPECT_EQ(t.consumption(), 5);
- EXPECT_EQ(t.peak_consumption(), 155);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
- // _consumption is not updated when Consume()/Release() is called with a zero value
- metric.Increment(10);
- t.Consume(0);
- EXPECT_EQ(t.consumption(), 5);
- EXPECT_EQ(t.peak_consumption(), 155);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
-}
-#endif // #end #if 0
-
TEST(MemTestTest, TrackerHierarchy) {
- auto p = std::make_shared<MemTracker>(100);
- auto c1 = std::make_shared<MemTracker>(80, "", p);
- auto c2 = std::make_shared<MemTracker>(50, "", p);
+ auto p = MemTracker::CreateTracker(100);
+ auto c1 = MemTracker::CreateTracker(80, "c1", p);
+ auto c2 = MemTracker::CreateTracker(50, "c2", p);
// everything below limits
c1->Consume(60);
@@ -141,12 +90,14 @@ TEST(MemTestTest, TrackerHierarchy) {
EXPECT_TRUE(c2->AnyLimitExceeded(MemLimit::HARD));
EXPECT_EQ(p->consumption(), 100);
EXPECT_FALSE(p->LimitExceeded(MemLimit::HARD));
+ c1->Release(40);
+ c2->Release(60);
}
TEST(MemTestTest, TrackerHierarchyTryConsume) {
- auto p = std::make_shared<MemTracker>(100);
- auto c1 = std::make_shared<MemTracker>(80, "", p);
- auto c2 = std::make_shared<MemTracker>(50, "", p);
+ auto p = MemTracker::CreateTracker(100);
+ auto c1 = MemTracker::CreateTracker(80, "c1", p);
+ auto c2 = MemTracker::CreateTracker(50, "c2", p);
// everything below limits
bool consumption = c1->TryConsume(60);
@@ -163,7 +114,7 @@ TEST(MemTestTest, TrackerHierarchyTryConsume) {
// p goes over limit
consumption = c2->TryConsume(50);
- EXPECT_EQ(consumption, true);
+ EXPECT_EQ(consumption, false);
EXPECT_EQ(c1->consumption(), 60);
EXPECT_FALSE(c1->LimitExceeded(MemLimit::HARD));
EXPECT_FALSE(c1->AnyLimitExceeded(MemLimit::HARD));
@@ -185,81 +136,16 @@ TEST(MemTestTest, TrackerHierarchyTryConsume) {
EXPECT_FALSE(c2->AnyLimitExceeded(MemLimit::HARD));
EXPECT_EQ(p->consumption(), 50);
EXPECT_FALSE(p->LimitExceeded(MemLimit::HARD));
-}
-
-#if 0
-class GcFunctionHelper {
- public:
- static const int NUM_RELEASE_BYTES = 1;
-
- GcFunctionHelper(MemTracker* tracker) : _tracker(tracker) { }
-
- ~GcFunctionHelper() {}
- void gc_func() { _tracker->Release(NUM_RELEASE_BYTES); }
- private:
- MemTracker* _tracker;
-};
-
-TEST(MemTestTest, GcFunctions) {
- MemTracker t(10);
- ASSERT_TRUE(t.has_limit());
-
- t.Consume(9);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
-
- // Test TryConsume()
- EXPECT_FALSE(t.TryConsume(2));
- EXPECT_EQ(t.consumption(), 9);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
-
- // Attach GcFunction that releases 1 byte
- GcFunctionHelper gc_func_helper(&t);
- t.AddGcFunction(boost::bind(&GcFunctionHelper::gc_func, &gc_func_helper));
- EXPECT_TRUE(t.TryConsume(2));
- EXPECT_EQ(t.consumption(), 10);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
-
- // GcFunction will be called even though TryConsume() fails
- EXPECT_FALSE(t.TryConsume(2));
- EXPECT_EQ(t.consumption(), 9);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
-
- // GcFunction won't be called
- EXPECT_TRUE(t.TryConsume(1));
- EXPECT_EQ(t.consumption(), 10);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
-
- // Test LimitExceeded(MemLimit::HARD)
- t.Consume(1);
- EXPECT_EQ(t.consumption(), 11);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
- EXPECT_EQ(t.consumption(), 10);
-
- // Add more GcFunctions, test that we only call them until the limit is no longer
- // exceeded
- GcFunctionHelper gc_func_helper2(&t);
- t.AddGcFunction(boost::bind(&GcFunctionHelper::gc_func, &gc_func_helper2));
- GcFunctionHelper gc_func_helper3(&t);
- t.AddGcFunction(boost::bind(&GcFunctionHelper::gc_func, &gc_func_helper3));
- t.Consume(1);
- EXPECT_EQ(t.consumption(), 11);
- EXPECT_FALSE(t.LimitExceeded(MemLimit::HARD));
- EXPECT_EQ(t.consumption(), 10);
+ c1->Release(40);
+ c2->Release(10);
}
-#endif // enf #if 0
} // end namespace doris
int main(int argc, char** argv) {
- // std::string conffile = std::string(getenv("DORIS_HOME")) + "/conf/be.conf";
- // if (!doris::config::init(conffile.c_str(), false)) {
- // fprintf(stderr, "error read config file. \n");
- // return -1;
- // }
doris::init_glog("be-test");
::testing::InitGoogleTest(&argc, argv);
-
return RUN_ALL_TESTS();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org