// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. #include "olap/wal/wal_dirs_info.h" #include #include #include namespace doris { class WalDirsInfoTest : public testing::Test { public: WalDirsInfoTest() = default; ~WalDirsInfoTest() override = default; void SetUp() override { // limit 1000 used 100 estimated bytes in wal 200 available 700 Status st = wal_dirs_info.add(wal_dir_test_1, 0, 0, 0); EXPECT_EQ(st, Status::OK()); // limit 1000 used 200 estimated bytes in wal 300 available 500 st = wal_dirs_info.add(wal_dir_test_2, 0, 0, 0); EXPECT_EQ(st, Status::OK()); // limit 1000 used 400 estimated bytes in wal 500 available 100 st = wal_dirs_info.add(wal_dir_test_3, 0, 0, 0); EXPECT_EQ(st, Status::OK()); } void TearDown() override {} void set_and_check_success(std::string wal_dir, size_t limit, size_t used, size_t estimated_wal_bytes) { Status st = wal_dirs_info.update_wal_dir_limit(wal_dir, limit); EXPECT_EQ(st, Status::OK()); std::shared_ptr wal_dir_info; st = wal_dirs_info.get_wal_dir_info(wal_dir, wal_dir_info); EXPECT_NE(wal_dir_info, nullptr); EXPECT_EQ(st, Status::OK()); EXPECT_EQ(wal_dir_info->get_limit(), limit); st = wal_dirs_info.update_wal_dir_used(wal_dir, used); EXPECT_EQ(st, Status::OK()); st = wal_dirs_info.get_wal_dir_info(wal_dir, wal_dir_info); EXPECT_NE(wal_dir_info, nullptr); EXPECT_EQ(st, Status::OK()); EXPECT_EQ(wal_dir_info->get_used(), used); st = wal_dirs_info.update_wal_dir_estimated_wal_bytes(wal_dir, estimated_wal_bytes, 0); EXPECT_EQ(st, Status::OK()); st = wal_dirs_info.get_wal_dir_info(wal_dir, wal_dir_info); EXPECT_NE(wal_dir_info, nullptr); EXPECT_EQ(st, Status::OK()); EXPECT_EQ(wal_dir_info->get_estimated_wal_bytes(), estimated_wal_bytes); st = wal_dirs_info.update_wal_dir_estimated_wal_bytes(wal_dir, 0, estimated_wal_bytes); EXPECT_EQ(st, Status::OK()); st = wal_dirs_info.get_wal_dir_info(wal_dir, wal_dir_info); EXPECT_NE(wal_dir_info, nullptr); EXPECT_EQ(st, Status::OK()); EXPECT_EQ(wal_dir_info->get_estimated_wal_bytes(), 0); st = wal_dirs_info.update_wal_dir_estimated_wal_bytes(wal_dir, estimated_wal_bytes, 0); EXPECT_EQ(st, Status::OK()); st = wal_dirs_info.get_wal_dir_info(wal_dir, wal_dir_info); EXPECT_NE(wal_dir_info, nullptr); EXPECT_EQ(st, Status::OK()); EXPECT_EQ(wal_dir_info->get_estimated_wal_bytes(), estimated_wal_bytes); EXPECT_EQ(wal_dir_info->available(), limit - used - estimated_wal_bytes); } void set_and_check_fail(std::string wal_dir, size_t limit, size_t used, size_t estimated_wal_bytes) { Status st = wal_dirs_info.update_wal_dir_limit(wal_dir, limit); EXPECT_EQ(st, Status::InternalError("")); } WalDirsInfo wal_dirs_info; std::string wal_dir = std::string(getenv("DORIS_HOME")) + "/wal_test"; // exist std::string wal_dir_test_1 = wal_dir + "/test_1"; std::string wal_dir_test_2 = wal_dir + "/test_2"; std::string wal_dir_test_3 = wal_dir + "/test_3"; // not exist std::string wal_dir_test_4 = wal_dir + "/test_4"; }; TEST_F(WalDirsInfoTest, test_wal_set_data) { set_and_check_success(wal_dir_test_1, 1000, 100, 200); set_and_check_success(wal_dir_test_2, 1000, 200, 300); set_and_check_success(wal_dir_test_3, 1000, 400, 500); set_and_check_fail(wal_dir_test_4, 0, 0, 0); } TEST_F(WalDirsInfoTest, test_wal_dir_select_random_strategy) { // available 700 set_and_check_success(wal_dir_test_1, 1000, 100, 200); // available 500 set_and_check_success(wal_dir_test_2, 1000, 200, 300); // available 100 set_and_check_success(wal_dir_test_3, 1000, 400, 500); for (int i = 0; i < 100; i++) { std::string wal_dir = wal_dirs_info.get_available_random_wal_dir(); EXPECT_NE(wal_dir, wal_dir_test_3); } } TEST_F(WalDirsInfoTest, test_wal_dir_select_max_available_strategy) { // available 100 set_and_check_success(wal_dir_test_1, 1000, 500, 400); // available 50 set_and_check_success(wal_dir_test_2, 1000, 500, 450); // available 0 set_and_check_success(wal_dir_test_3, 1000, 500, 500); for (int i = 0; i < 100; i++) { std::string wal_dir = wal_dirs_info.get_available_random_wal_dir(); EXPECT_EQ(wal_dir, wal_dir_test_1); } } } // namespace doris