From 81e0d5ca13f2d4d9cc3376ebedcf80e8702514c1 Mon Sep 17 00:00:00 2001 From: HaHaJeff Date: Tue, 8 Aug 2023 10:42:42 +0000 Subject: [PATCH] fixed restart failed because physical log disk is smaller than log disk size --- .../test_observer_expand_shrink.cpp | 7 +++++-- src/logservice/ob_server_log_block_mgr.cpp | 19 ++++++++++--------- src/observer/ob_server_utils.cpp | 16 +++++++++++----- src/observer/ob_server_utils.h | 3 ++- 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/mittest/simple_server/test_observer_expand_shrink.cpp b/mittest/simple_server/test_observer_expand_shrink.cpp index 73054a49f3..79b3b2be5b 100644 --- a/mittest/simple_server/test_observer_expand_shrink.cpp +++ b/mittest/simple_server/test_observer_expand_shrink.cpp @@ -101,9 +101,12 @@ TEST_F(ObserverExpandShink, basic_func) GCONF.log_disk_size = 1024 * 1024 * 1024ul * 1024 * 100ul; int64_t log_disk_size = 0; int64_t log_disk_percentage = 0; - EXPECT_EQ(OB_SERVER_OUTOF_DISK_SPACE, observer::ObServerUtils::get_log_disk_info_in_config( + int64_t total_space = 0; + EXPECT_EQ(OB_SUCCESS, observer::ObServerUtils::get_log_disk_info_in_config( log_disk_size, - log_disk_percentage)); + log_disk_percentage, + total_space)); + EXPECT_EQ(true, total_space < log_disk_size); } template diff --git a/src/logservice/ob_server_log_block_mgr.cpp b/src/logservice/ob_server_log_block_mgr.cpp index 6c4bff5e28..bbd1077a2b 100644 --- a/src/logservice/ob_server_log_block_mgr.cpp +++ b/src/logservice/ob_server_log_block_mgr.cpp @@ -204,6 +204,7 @@ int ObServerLogBlockMgr::resize_(const int64_t new_size_byte) } else if (OB_FAIL( do_resize_(old_log_pool_meta, resize_block_cnt, new_log_pool_meta))) { if (OB_ALLOCATE_DISK_SPACE_FAILED == ret) { + ret = OB_MACHINE_RESOURCE_NOT_ENOUGH; LOG_DBA_ERROR(OB_ALLOCATE_DISK_SPACE_FAILED, "possible reason", "may be diskspace is not enough, please check the configuration about log disk", @@ -758,7 +759,8 @@ int ObServerLogBlockMgr::try_resize() { int ret = OB_SUCCESS; int64_t log_disk_size = 0; - int64_t log_disk_percentage = 0; + int64_t unused_log_disk_percentage = 0; + int64_t total_log_disk_size = 0; if (IS_NOT_INIT) { ret = OB_NOT_INIT; CLOG_LOG(WARN, "ObServerLogBlockMgr has not inited", KPC(this)); @@ -766,17 +768,16 @@ int ObServerLogBlockMgr::try_resize() ret = OB_NOT_RUNNING; CLOG_LOG(WARN, "ObServerLogBlockMgr not running, can not support resize", KPC(this)); } else if (OB_FAIL(observer::ObServerUtils::get_log_disk_info_in_config(log_disk_size, - log_disk_percentage))) { - if (OB_SERVER_OUTOF_DISK_SPACE == ret) { - ret = OB_MACHINE_RESOURCE_NOT_ENOUGH; - CLOG_LOG(ERROR, "try_resize failed, log disk space is not enough", K(log_disk_size), KPC(this)); - } else { - CLOG_LOG(ERROR, "get_log_disk_info_in_config failed", K(log_disk_size), KPC(this)); - } + unused_log_disk_percentage, + total_log_disk_size))) { + CLOG_LOG(ERROR, "get_log_disk_info_in_config failed", K(log_disk_size), KPC(this)); + } else if (log_disk_size > total_log_disk_size) { + ret = OB_MACHINE_RESOURCE_NOT_ENOUGH; + CLOG_LOG(ERROR, "try_resize failed, log disk space is not enough", K(log_disk_size), KPC(this)); } else if (OB_FAIL(resize_(log_disk_size))) { CLOG_LOG(ERROR, "ObServerLogBlockMGR resize failed", K(ret), KPC(this)); } else { - CLOG_LOG(INFO, "try_resize success", K(ret), K(log_disk_size), KPC(this)); + CLOG_LOG(INFO, "try_resize success", K(ret), K(log_disk_size), K(total_log_disk_size), KPC(this)); } return ret; } diff --git a/src/observer/ob_server_utils.cpp b/src/observer/ob_server_utils.cpp index e8d2d9dab8..5e61bed149 100644 --- a/src/observer/ob_server_utils.cpp +++ b/src/observer/ob_server_utils.cpp @@ -49,7 +49,8 @@ int ObServerUtils::get_server_ip(ObIAllocator *allocator, ObString &ipstr) } int ObServerUtils::get_log_disk_info_in_config(int64_t& log_disk_size, - int64_t& log_disk_percentage) + int64_t& log_disk_percentage, + int64_t& total_log_disk_size) { int ret = OB_SUCCESS; int64_t suggested_data_disk_size = GCONF.datafile_size; @@ -81,9 +82,10 @@ int ObServerUtils::get_log_disk_info_in_config(int64_t& log_disk_size, KR(ret), K(data_dir), K(suggested_data_disk_size), K(suggested_data_disk_percentage), K(data_default_disk_percentage), K(shared_mode)); } else { + total_log_disk_size = clog_disk_total_size; LOG_INFO("get_log_disk_info_in_config", K(suggested_data_disk_size), K(suggested_clog_disk_size), K(suggested_data_disk_percentage), K(suggested_clog_disk_percentage), K(log_disk_size), - K(log_disk_percentage)); + K(log_disk_percentage), K(total_log_disk_size)); } return ret; } @@ -138,9 +140,10 @@ int ObServerUtils::cal_all_part_disk_size(const int64_t suggested_data_disk_size int64_t& log_disk_percentage) { int ret = OB_SUCCESS; + int64_t total_log_disk_space = 0; if (OB_FAIL(get_data_disk_info_in_config(data_disk_size, data_disk_percentage))) { LOG_ERROR("get_data_disk_info_in_config failed", K(data_disk_size), K(data_disk_percentage)); - } else if (OB_FAIL(get_log_disk_info_in_config(log_disk_size, log_disk_percentage))) { + } else if (OB_FAIL(get_log_disk_info_in_config(log_disk_size, log_disk_percentage, total_log_disk_space))) { LOG_ERROR("get_log_disk_info_in_config failed", K(log_disk_size), K(log_disk_percentage)); } else { LOG_INFO("cal_all_part_disk_size success", K(suggested_data_disk_size), K(suggested_clog_disk_size), @@ -345,10 +348,13 @@ int ObServerUtils::decide_disk_size(const int64_t total_space, } else { disk_size = suggested_disk_size; } - if (disk_size > total_space) { - ret = OB_SERVER_OUTOF_DISK_SPACE; + LOG_WARN("disk_size is greater than total disk space", KR(OB_SERVER_OUTOF_DISK_SPACE), + K(suggested_disk_size), K(suggested_disk_percentage), + K(default_disk_percentage), + K(total_space), K(disk_size)); } + LOG_INFO("decide disk size finished", K(suggested_disk_size), K(suggested_disk_percentage), K(default_disk_percentage), diff --git a/src/observer/ob_server_utils.h b/src/observer/ob_server_utils.h index 05a66b4f2f..321930620c 100644 --- a/src/observer/ob_server_utils.h +++ b/src/observer/ob_server_utils.h @@ -38,7 +38,8 @@ public: static int get_server_ip(ObIAllocator *allocator, ObString &ipstr); static int get_log_disk_info_in_config(int64_t& log_disk_size, - int64_t& log_disk_percentage); + int64_t& log_disk_percentage, + int64_t& total_log_disk_size); static int get_data_disk_info_in_config(int64_t& data_disk_size, int64_t& data_disk_percentage);