fixed query LOG_DISK_IN_USE from gv$ob_servers may be negative.
This commit is contained in:
@ -53,17 +53,17 @@ TEST_F(ObserverExpandShink, observer_start)
|
||||
TEST_F(ObserverExpandShink, basic_func)
|
||||
{
|
||||
omt::ObTenantNodeBalancer::get_instance().refresh_interval_ = 1 * 1000 * 1000;
|
||||
int64_t origin_server_log_free_size, origin_server_log_total_size;
|
||||
EXPECT_EQ(OB_SUCCESS, GCTX.log_block_mgr_->get_disk_usage(origin_server_log_free_size, origin_server_log_total_size));
|
||||
int64_t origin_server_in_use_size, origin_server_log_total_size;
|
||||
EXPECT_EQ(OB_SUCCESS, GCTX.log_block_mgr_->get_disk_usage(origin_server_in_use_size, origin_server_log_total_size));
|
||||
GCONF.log_disk_size = GCTX.log_block_mgr_->lower_align_(2 * origin_server_log_total_size);
|
||||
sleep(6);
|
||||
int64_t new_server_log_free_size, new_server_log_total_size;
|
||||
EXPECT_EQ(OB_SUCCESS, GCTX.log_block_mgr_->get_disk_usage(new_server_log_free_size, new_server_log_total_size));
|
||||
int64_t new_server_in_use_size, new_server_log_total_size;
|
||||
EXPECT_EQ(OB_SUCCESS, GCTX.log_block_mgr_->get_disk_usage(new_server_in_use_size, new_server_log_total_size));
|
||||
EXPECT_EQ(new_server_log_total_size, 2 * origin_server_log_total_size);
|
||||
LOG_INFO("first resize success");
|
||||
GCONF.log_disk_size = 0;
|
||||
sleep(3);
|
||||
EXPECT_EQ(OB_SUCCESS, GCTX.log_block_mgr_->get_disk_usage(new_server_log_free_size, new_server_log_total_size));
|
||||
EXPECT_EQ(OB_SUCCESS, GCTX.log_block_mgr_->get_disk_usage(new_server_in_use_size, new_server_log_total_size));
|
||||
EXPECT_NE(new_server_log_total_size, 0);
|
||||
LOG_INFO("second resize success");
|
||||
|
||||
|
||||
@ -81,6 +81,7 @@ ObServerLogBlockMgr::ObServerLogBlockMgr()
|
||||
min_block_id_(0),
|
||||
max_block_id_(0),
|
||||
min_log_disk_size_for_all_tenants_(0),
|
||||
block_cnt_in_use_(0),
|
||||
is_inited_(false)
|
||||
{
|
||||
memset(log_pool_path_, '\0', OB_MAX_FILE_NAME_LENGTH);
|
||||
@ -122,6 +123,7 @@ void ObServerLogBlockMgr::destroy()
|
||||
{
|
||||
CLOG_LOG_RET(WARN, OB_SUCCESS, "ObServerLogBlockMgr destroy", KPC(this));
|
||||
is_inited_ = false;
|
||||
block_cnt_in_use_ = 0;
|
||||
min_log_disk_size_for_all_tenants_ = 0;
|
||||
max_block_id_ = 0;
|
||||
min_block_id_ = 0;
|
||||
@ -211,7 +213,7 @@ int ObServerLogBlockMgr::resize_(const int64_t new_size_byte)
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObServerLogBlockMgr::get_disk_usage(int64_t &free_size_byte, int64_t &total_size_byte)
|
||||
int ObServerLogBlockMgr::get_disk_usage(int64_t &in_use_size_byte, int64_t &total_size_byte)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (IS_NOT_INIT) {
|
||||
@ -219,7 +221,7 @@ int ObServerLogBlockMgr::get_disk_usage(int64_t &free_size_byte, int64_t &total_
|
||||
CLOG_LOG(ERROR, "ObServerLogBlockMgr has not inited", K(ret), KPC(this));
|
||||
} else {
|
||||
total_size_byte = get_total_size_guarded_by_lock_();
|
||||
free_size_byte = get_free_size_guarded_by_lock_();
|
||||
in_use_size_byte = get_in_use_size_guarded_by_lock_();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@ -239,7 +241,7 @@ int ObServerLogBlockMgr::create_block_at(const FileDesc &dest_dir_fd,
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
CLOG_LOG(ERROR, "Invalid argument", K(ret), KPC(this), K(dest_dir_fd),
|
||||
K(dest_block_path), K(block_size));
|
||||
} else if (OB_FAIL(get_and_inc_min_block_id_guarded_by_lock_(src_block_id))) {
|
||||
} else if (OB_FAIL(get_and_inc_min_block_id_guarded_by_lock_(src_block_id, true))) {
|
||||
CLOG_LOG(WARN, "get_and_inc_min_block_id_guarded_by_lock_ failed", K(ret), KPC(this),
|
||||
K(dest_dir_fd), K(dest_block_path));
|
||||
} else if (OB_FAIL(block_id_to_string(src_block_id, src_block_path, OB_MAX_FILE_NAME_LENGTH))) {
|
||||
@ -277,7 +279,7 @@ int ObServerLogBlockMgr::remove_block_at(const FileDesc &src_dir_fd,
|
||||
if (IS_NOT_INIT) {
|
||||
ret = OB_NOT_INIT;
|
||||
CLOG_LOG(ERROR, "ObServerLogBlockMGR has not inited", K(ret), KPC(this));
|
||||
} else if (OB_FAIL(get_and_inc_max_block_id_guarded_by_lock_(dest_block_id))) {
|
||||
} else if (OB_FAIL(get_and_inc_max_block_id_guarded_by_lock_(dest_block_id, true))) {
|
||||
CLOG_LOG(ERROR, "get_and_inc_max_block_id_guarded_by_lock_ failed", K(ret), KPC(this),
|
||||
K(src_dir_fd), K(src_block_path));
|
||||
} else if (OB_FAIL(block_id_to_string(dest_block_id, dest_block_path, OB_MAX_FILE_NAME_LENGTH))) {
|
||||
@ -488,6 +490,7 @@ int ObServerLogBlockMgr::do_load_(const char *log_disk_path)
|
||||
CLOG_LOG(ERROR, "check_log_pool_whehter_is_integrity_ failed, unexpected error",
|
||||
K(ret), KPC(this), K(log_disk_path), K(has_allocated_block_cnt));
|
||||
} else {
|
||||
block_cnt_in_use_ = has_allocated_block_cnt;
|
||||
CLOG_LOG(INFO, "do_load_ success", K(ret), KPC(this), K(time_guard));
|
||||
}
|
||||
return ret;
|
||||
@ -721,6 +724,12 @@ int64_t ObServerLogBlockMgr::get_free_size_guarded_by_lock_()
|
||||
return BLOCK_SIZE * (max_block_id_ - min_block_id_);
|
||||
}
|
||||
|
||||
int64_t ObServerLogBlockMgr::get_in_use_size_guarded_by_lock_()
|
||||
{
|
||||
RLockGuard guard(block_id_range_lock_);
|
||||
return block_cnt_in_use_*BLOCK_SIZE;
|
||||
}
|
||||
|
||||
int ObServerLogBlockMgr::update_log_pool_meta_guarded_by_lock_(const LogPoolMeta &meta)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
@ -752,7 +761,8 @@ ObServerLogBlockMgr::get_log_pool_meta_guarded_by_lock_() const
|
||||
}
|
||||
|
||||
int ObServerLogBlockMgr::get_and_inc_max_block_id_guarded_by_lock_(
|
||||
block_id_t &out_block_id)
|
||||
block_id_t &out_block_id,
|
||||
const bool remove_block)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
WLockGuard guard(block_id_range_lock_);
|
||||
@ -763,12 +773,17 @@ int ObServerLogBlockMgr::get_and_inc_max_block_id_guarded_by_lock_(
|
||||
} else {
|
||||
// max_block_id_ is exclusive range
|
||||
out_block_id = max_block_id_++;
|
||||
if (remove_block) {
|
||||
block_cnt_in_use_--;
|
||||
}
|
||||
OB_ASSERT(block_cnt_in_use_ >= 0);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObServerLogBlockMgr::get_and_inc_min_block_id_guarded_by_lock_(
|
||||
block_id_t &out_block_id)
|
||||
block_id_t &out_block_id,
|
||||
const bool create_block)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
WLockGuard guard(block_id_range_lock_);
|
||||
@ -781,6 +796,9 @@ int ObServerLogBlockMgr::get_and_inc_min_block_id_guarded_by_lock_(
|
||||
K(ret), KPC(this));
|
||||
} else {
|
||||
out_block_id = min_block_id_++;
|
||||
if (create_block) {
|
||||
block_cnt_in_use_++;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -153,9 +153,9 @@ public:
|
||||
int try_resize();
|
||||
|
||||
// @brief get current disk usage.
|
||||
// @param[out] current available diskspace.
|
||||
// @param[out] current in used diskspace.
|
||||
// @param[out] current total diskspace.
|
||||
int get_disk_usage(int64_t &free_size_byte, int64_t &total_size_byte);
|
||||
int get_disk_usage(int64_t &in_use_size_byte, int64_t &total_size_byte);
|
||||
|
||||
// @brief allocate a new block, and move it to the specified directory with the specified
|
||||
// name.
|
||||
@ -238,8 +238,11 @@ private:
|
||||
const LogPoolMeta &get_log_pool_meta_guarded_by_lock_() const;
|
||||
int64_t get_total_size_guarded_by_lock_();
|
||||
int64_t get_free_size_guarded_by_lock_();
|
||||
int get_and_inc_max_block_id_guarded_by_lock_(palf::block_id_t &out_block_id);
|
||||
int get_and_inc_min_block_id_guarded_by_lock_(palf::block_id_t &out_block_id);
|
||||
int64_t get_in_use_size_guarded_by_lock_();
|
||||
int get_and_inc_max_block_id_guarded_by_lock_(palf::block_id_t &out_block_id,
|
||||
const bool remove_block=false);
|
||||
int get_and_inc_min_block_id_guarded_by_lock_(palf::block_id_t &out_block_id,
|
||||
const bool create_block=false);
|
||||
int move_block_not_guarded_by_lock_(const palf::FileDesc &dest_dir_fd,
|
||||
const char *dest_block_path,
|
||||
const palf::FileDesc &src_dir_fd,
|
||||
@ -323,6 +326,9 @@ private:
|
||||
// 'min_log_disk_size_for_all_tenants_' is 0.
|
||||
int64_t min_log_disk_size_for_all_tenants_;
|
||||
GetTenantsLogDiskSize get_tenants_log_disk_size_func_;
|
||||
// NB: in progress of expanding, the free size byte calcuated by BLOCK_SIZE * (max_block_id_ - min_block_id_) may be greater than
|
||||
// curr_total_size_, if we calcuated log disk in use by curr_total_size_ - 'free size byte', the resule may be negative.
|
||||
int64_t block_cnt_in_use_;
|
||||
bool is_inited_;
|
||||
|
||||
private:
|
||||
|
||||
@ -1831,9 +1831,9 @@ int ObServer::init_io()
|
||||
LOG_ERROR("cal_all_part_disk_size failed", KR(ret));
|
||||
} else {
|
||||
if (log_block_mgr_.is_reserved()) {
|
||||
int64_t clog_pool_free_size = 0;
|
||||
int64_t clog_pool_in_use = 0;
|
||||
int64_t clog_pool_total_size = 0;
|
||||
if (OB_FAIL(log_block_mgr_.get_disk_usage(clog_pool_free_size, clog_pool_total_size))) {
|
||||
if (OB_FAIL(log_block_mgr_.get_disk_usage(clog_pool_in_use, clog_pool_total_size))) {
|
||||
LOG_ERROR("get clog disk size failed", KR(ret));
|
||||
} else {
|
||||
log_disk_size = clog_pool_total_size;
|
||||
@ -2266,19 +2266,19 @@ int ObServer::init_storage()
|
||||
|
||||
if (OB_SUCC(ret)) {
|
||||
int64_t total_log_disk_size = 0;
|
||||
int64_t free_log_disk_size = 0;
|
||||
int64_t log_disk_in_use = 0;
|
||||
// Check if the clog directory is empty
|
||||
if (OB_FAIL(log_block_mgr_.get_disk_usage(
|
||||
free_log_disk_size, total_log_disk_size))) {
|
||||
log_disk_in_use, total_log_disk_size))) {
|
||||
LOG_ERROR("ObServerLogBlockMgr get_disk_usage failed", K(ret));
|
||||
} else if (0 == total_log_disk_size-free_log_disk_size
|
||||
} else if (0 == log_disk_in_use
|
||||
&& OB_FAIL(logservice::ObServerLogBlockMgr::check_clog_directory_is_empty(
|
||||
OB_FILE_SYSTEM_ROUTER.get_clog_dir(), clogdir_is_empty))) {
|
||||
LOG_ERROR("is_dir_empty fail", K(ret));
|
||||
} else if (clogdir_is_empty) {
|
||||
LOG_INFO("clog dir is empty");
|
||||
} else {
|
||||
clogdir_is_empty = total_log_disk_size == free_log_disk_size;
|
||||
clogdir_is_empty = log_disk_in_use == 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1560,7 +1560,7 @@ int ObService::get_server_resource_info(share::ObServerResourceInfo &resource_in
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
omt::ObTenantNodeBalancer::ServerResource svr_res_assigned;
|
||||
int64_t clog_free_size_byte = 0;
|
||||
int64_t clog_in_use_size_byte = 0;
|
||||
int64_t clog_total_size_byte = 0;
|
||||
logservice::ObServerLogBlockMgr *log_block_mgr = GCTX.log_block_mgr_;
|
||||
resource_info.reset();
|
||||
@ -1574,7 +1574,7 @@ int ObService::get_server_resource_info(share::ObServerResourceInfo &resource_in
|
||||
LOG_WARN("log_block_mgr is null", KR(ret), K(GCTX.log_block_mgr_));
|
||||
} else if (OB_FAIL(omt::ObTenantNodeBalancer::get_instance().get_server_allocated_resource(svr_res_assigned))) {
|
||||
LOG_WARN("fail to get server allocated resource", KR(ret));
|
||||
} else if (OB_FAIL(log_block_mgr->get_disk_usage(clog_free_size_byte, clog_total_size_byte))) {
|
||||
} else if (OB_FAIL(log_block_mgr->get_disk_usage(clog_in_use_size_byte, clog_total_size_byte))) {
|
||||
LOG_WARN("Failed to get clog stat ", KR(ret));
|
||||
} else if (OB_FAIL(SLOGGERMGR.get_reserved_size(reserved_size))) {
|
||||
LOG_WARN("Failed to get reserved size ", KR(ret));
|
||||
|
||||
@ -59,7 +59,7 @@ int ObAllVirtualServer::inner_get_next_row(ObNewRow *&row)
|
||||
int64_t data_disk_abnormal_time = 0;
|
||||
logservice::ObServerLogBlockMgr *log_block_mgr = GCTX.log_block_mgr_;
|
||||
|
||||
int64_t clog_free_size_byte = 0;
|
||||
int64_t clog_in_use_size_byte = 0;
|
||||
int64_t clog_total_size_byte = 0;
|
||||
|
||||
int64_t reserved_size = 4 * 1024 * 1024 * 1024L; // default RESERVED_DISK_SIZE -> 4G
|
||||
@ -74,7 +74,7 @@ int ObAllVirtualServer::inner_get_next_row(ObNewRow *&row)
|
||||
} else if (OB_ISNULL(GCTX.omt_) || OB_ISNULL(log_block_mgr)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
SERVER_LOG(ERROR, "omt is NULL", KR(ret), K(GCTX.omt_), K(log_block_mgr));
|
||||
} else if (OB_FAIL(log_block_mgr->get_disk_usage(clog_free_size_byte, clog_total_size_byte))) {
|
||||
} else if (OB_FAIL(log_block_mgr->get_disk_usage(clog_in_use_size_byte, clog_total_size_byte))) {
|
||||
SERVER_LOG(ERROR, "Failed to get clog stat ", KR(ret));
|
||||
} else if (OB_FAIL(ObIOManager::get_instance().get_device_health_status(dhs,
|
||||
data_disk_abnormal_time))) {
|
||||
@ -98,7 +98,7 @@ int ObAllVirtualServer::inner_get_next_row(ObNewRow *&row)
|
||||
const int64_t log_disk_capacity = clog_total_size_byte;
|
||||
const int64_t data_disk_in_use =
|
||||
OB_SERVER_BLOCK_MGR.get_used_macro_block_count() * OB_SERVER_BLOCK_MGR.get_macro_block_size();
|
||||
const int64_t clog_disk_in_use = clog_total_size_byte - clog_free_size_byte;
|
||||
const int64_t clog_disk_in_use = clog_in_use_size_byte;
|
||||
const char *data_disk_health_status = device_health_status_to_str(dhs);
|
||||
const int64_t ssl_cert_expired_time = GCTX.ssl_key_expired_time_;
|
||||
|
||||
|
||||
@ -384,18 +384,18 @@ int ObDiskUsageReportTask::count_server_clog()
|
||||
ObDiskUsageReportKey report_key;
|
||||
logservice::ObServerLogBlockMgr *log_block_mgr = GCTX.log_block_mgr_;
|
||||
|
||||
int64_t clog_free_size_byte = 0;
|
||||
int64_t clog_in_use_size_byte = 0;
|
||||
int64_t clog_total_size_byte = 0;
|
||||
|
||||
if (OB_ISNULL(log_block_mgr)) {
|
||||
ret = OB_NOT_INIT;
|
||||
SERVER_LOG(ERROR, "log_block_mgr is null", KR(ret), K(GCTX.log_block_mgr_));
|
||||
} else if (OB_FAIL(log_block_mgr->get_disk_usage(clog_free_size_byte, clog_total_size_byte))) {
|
||||
} else if (OB_FAIL(log_block_mgr->get_disk_usage(clog_in_use_size_byte, clog_total_size_byte))) {
|
||||
STORAGE_LOG(ERROR, "Failed to get clog stat ", KR(ret));
|
||||
} else {
|
||||
report_key.file_type_ = ObDiskReportFileType::OB_DISK_REPORT_TENANT_CLOG_DATA;
|
||||
report_key.tenant_id_ = OB_SERVER_TENANT_ID;
|
||||
int64_t clog_space = clog_total_size_byte - clog_free_size_byte;
|
||||
int64_t clog_space = clog_in_use_size_byte;
|
||||
if (OB_FAIL(result_map_.set_refactored(report_key, clog_space, 1))) {
|
||||
STORAGE_LOG(WARN, "failed to set result_map_", K(ret), K(report_key), K(clog_space));
|
||||
}
|
||||
|
||||
@ -279,7 +279,12 @@ TEST_F(TestServerLogBlockMgr, basic_func)
|
||||
|
||||
const int64_t ls_id = 1;
|
||||
EXPECT_EQ(OB_SUCCESS, create_new_blocks_at(ls_id, tenant_ls_fd_map_[ls_id], 0, 10));
|
||||
int64_t in_use_size_byte, total_size_byte;
|
||||
EXPECT_EQ(OB_SUCCESS, log_block_mgr_.get_disk_usage(in_use_size_byte, total_size_byte));
|
||||
EXPECT_EQ(10*ObServerLogBlockMgr::BLOCK_SIZE, in_use_size_byte);
|
||||
EXPECT_EQ(OB_SUCCESS, delete_blocks_at(ls_id, tenant_ls_fd_map_[ls_id], 0, 10));
|
||||
EXPECT_EQ(OB_SUCCESS, log_block_mgr_.get_disk_usage(in_use_size_byte, total_size_byte));
|
||||
EXPECT_EQ(0, in_use_size_byte);
|
||||
}
|
||||
|
||||
TEST_F(TestServerLogBlockMgr, restart_for_empty_log_disk)
|
||||
@ -287,9 +292,12 @@ TEST_F(TestServerLogBlockMgr, restart_for_empty_log_disk)
|
||||
log_block_mgr_.destroy();
|
||||
const int64_t reserved_size = 2 * ObServerLogBlockMgr::GB;
|
||||
const int64_t aligned_reserved_size = log_block_mgr_.lower_align_(reserved_size);
|
||||
int64_t in_use_size_byte, total_size_byte;
|
||||
EXPECT_EQ(OB_SUCCESS, log_block_mgr_.init(log_pool_base_path_));
|
||||
EXPECT_EQ(aligned_reserved_size, log_block_mgr_.log_pool_meta_.curr_total_size_);
|
||||
EXPECT_EQ(aligned_reserved_size, log_block_mgr_.log_pool_meta_.next_total_size_);
|
||||
EXPECT_EQ(OB_SUCCESS, log_block_mgr_.get_disk_usage(in_use_size_byte, total_size_byte));
|
||||
EXPECT_EQ(0, in_use_size_byte);
|
||||
EXPECT_EQ(0, log_block_mgr_.log_pool_meta_.status_);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user