From f3c42a8d5a796bb16557043b83591b9b41053534 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 9 Feb 2024 14:43:32 +0000 Subject: [PATCH] [CP] build_version buffer_size --- src/observer/ob_heartbeat.cpp | 5 +++-- src/observer/ob_service.cpp | 10 ++++++---- src/share/ob_server_table_operator.cpp | 10 +++++++++- src/share/ob_version.cpp.in | 14 +++++++++++--- src/share/ob_version.h | 2 +- src/sql/ob_optimizer_trace_impl.cpp | 5 +++-- 6 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/observer/ob_heartbeat.cpp b/src/observer/ob_heartbeat.cpp index 4d31ca240f..86b05db29f 100644 --- a/src/observer/ob_heartbeat.cpp +++ b/src/observer/ob_heartbeat.cpp @@ -119,7 +119,7 @@ int ObHeartBeatProcess::init_lease_request(ObLeaseRequest &lease_request) { int ret = OB_SUCCESS; common::ObArray > max_stored_versions; - + lease_request.reset(); if (OB_UNLIKELY(!inited_)) { ret = OB_NOT_INIT; LOG_WARN("not init", KR(ret), K(inited_)); @@ -135,13 +135,14 @@ int ObHeartBeatProcess::init_lease_request(ObLeaseRequest &lease_request) LOG_WARN("fail to set lease request max stored key versions", KR(ret), K(lease_request), K(max_stored_versions)); #endif + } else if (OB_FAIL(get_package_and_svn(lease_request.build_version_, sizeof(lease_request.build_version_)))) { + LOG_WARN("fail to get build_version", KR(ret)); } else { lease_request.request_lease_time_ = 0; // this is not a valid member lease_request.version_ = ObLeaseRequest::LEASE_VERSION; lease_request.zone_ = gctx_.config_->zone.str(); lease_request.server_ = gctx_.self_addr(); lease_request.sql_port_ = gctx_.config_->mysql_port; - get_package_and_svn(lease_request.build_version_, sizeof(lease_request.build_version_)); OTC_MGR.get_lease_request(lease_request); lease_request.start_service_time_ = gctx_.start_service_time_; lease_request.ssl_key_expired_time_ = gctx_.ssl_key_expired_time_; diff --git a/src/observer/ob_service.cpp b/src/observer/ob_service.cpp index 892f9d74fd..2f9ee341e4 100644 --- a/src/observer/ob_service.cpp +++ b/src/observer/ob_service.cpp @@ -1536,14 +1536,15 @@ int ObService::check_server_for_adding_server( KR(ret), K(arg), K(sys_tenant_data_version), K(arg.get_sys_tenant_data_version())); } else { bool server_empty = false; + char build_version[common::OB_SERVER_VERSION_LENGTH] = {'\0'}; if (OB_FAIL(check_server_empty(server_empty))) { LOG_WARN("check_server_empty failed", KR(ret)); + } else if (OB_FAIL(get_package_and_svn(build_version, sizeof(build_version)))) { + LOG_WARN("fail to get build_version", KR(ret)); } else { - char build_version[common::OB_SERVER_VERSION_LENGTH] = {0}; ObServerInfoInTable::ObBuildVersion build_version_string; ObZone zone; int64_t sql_port = GCONF.mysql_port; - get_package_and_svn(build_version, sizeof(build_version)); if (OB_SUCC(ret) && server_empty) { uint64_t server_id = arg.get_server_id(); @@ -1641,8 +1642,9 @@ int ObService::get_build_version(share::ObServerInfoInTable::ObBuildVersion &bui int ret = OB_SUCCESS; char build_version_char_array[common::OB_SERVER_VERSION_LENGTH] = {0}; build_version.reset(); - get_package_and_svn(build_version_char_array, sizeof(build_version)); - if (OB_FAIL(build_version.assign(build_version_char_array))) { + if (OB_FAIL(get_package_and_svn(build_version_char_array, sizeof(build_version_char_array)))) { + LOG_WARN("fail to get build_version", KR(ret)); + } else if (OB_FAIL(build_version.assign(build_version_char_array))) { LOG_WARN("fail to assign build_version", KR(ret), K(build_version_char_array)); } return ret; diff --git a/src/share/ob_server_table_operator.cpp b/src/share/ob_server_table_operator.cpp index 04da1f228a..bb021e5673 100644 --- a/src/share/ob_server_table_operator.cpp +++ b/src/share/ob_server_table_operator.cpp @@ -163,17 +163,21 @@ int ObServerInfoInTable::build_server_status(share::ObServerStatus &server_statu int ret = OB_SUCCESS; const int64_t now = ::oceanbase::common::ObTimeUtility::current_time(); server_status.reset(); + int64_t build_version_len = build_version_.size(); if (OB_UNLIKELY(!is_valid())) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid server info", KR(ret), KPC(this)); } else if (OB_FAIL(server_status.zone_.assign(zone_))) { LOG_WARN("fail to assign zone", KR(ret), K(zone_)); + } else if (build_version_len >= OB_SERVER_VERSION_LENGTH) { + ret = OB_SIZE_OVERFLOW; + LOG_WARN("build_version is too long", KR(ret), K(build_version_len)); } else { server_status.server_ = server_; server_status.id_ = server_id_; server_status.sql_port_ = sql_port_; server_status.with_rootserver_ = with_rootserver_; - strncpy(server_status.build_version_, build_version_.ptr(), OB_SERVER_VERSION_LENGTH); + strncpy(server_status.build_version_, build_version_.ptr(), build_version_len); server_status.stop_time_ = stop_time_; server_status.start_service_time_ = start_service_time_; server_status.last_offline_time_ = last_offline_time_; @@ -993,6 +997,7 @@ int ObServerTableOperator::insert_dml_builder( char svr_ip[OB_MAX_SERVER_ADDR_SIZE] = ""; const char *display_status_str = NULL; dml.reset(); + int64_t build_version_len = strlen(server_status.build_version_); if (OB_UNLIKELY(!server_status.is_valid() || !server_status.server_.ip_to_string(svr_ip, sizeof(svr_ip)))) { ret = OB_INVALID_ARGUMENT; @@ -1004,6 +1009,9 @@ int ObServerTableOperator::insert_dml_builder( } else if (OB_ISNULL(display_status_str)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("null display status string", KR(ret), KP(display_status_str)); + } else if (OB_UNLIKELY(build_version_len >= OB_SERVER_VERSION_LENGTH)) { + ret = OB_SIZE_OVERFLOW; + LOG_WARN("build_version is too long", KR(ret), K(build_version_len)); } else { if (OB_FAIL(dml.add_pk_column(K(svr_ip))) || OB_FAIL(dml.add_pk_column("svr_port", server_status.server_.get_port())) diff --git a/src/share/ob_version.cpp.in b/src/share/ob_version.cpp.in index f8f4f744e7..4b1458ffd8 100644 --- a/src/share/ob_version.cpp.in +++ b/src/share/ob_version.cpp.in @@ -6,17 +6,25 @@ #include #include "share/ob_version.h" #include "lib/utility/ob_macro_utils.h" +#include "lib/utility/ob_print_utils.h" +#include "lib/oblog/ob_log_module.h" namespace oceanbase { namespace share { -void get_package_and_svn(char *server_version, int64_t buf_len) +int get_package_and_svn(char *server_version, int64_t buf_len) { + int ret = OB_SUCCESS; const char *server_version_template = "%s_%s(%s %s)"; - (void) snprintf(server_version, buf_len, server_version_template, PACKAGE_VERSION, - build_version(), build_date(), build_time()); + int64_t pos = 0; + if (OB_FAIL(databuff_printf(server_version, buf_len, pos, server_version_template, PACKAGE_VERSION, + build_version(), build_date(), build_time()))) { + SHARE_LOG(WARN, "fail to build server version", K(ret), K(buf_len), K(pos), K(PACKAGE_VERSION), + K(build_version()), K(build_date()), K(build_time())); + } + return ret; } } diff --git a/src/share/ob_version.h b/src/share/ob_version.h index b0457342b8..a0d128a006 100644 --- a/src/share/ob_version.h +++ b/src/share/ob_version.h @@ -32,7 +32,7 @@ namespace oceanbase { namespace share { -void get_package_and_svn(char *server_version, int64_t buf_len); +int get_package_and_svn(char *server_version, int64_t buf_len); } } diff --git a/src/sql/ob_optimizer_trace_impl.cpp b/src/sql/ob_optimizer_trace_impl.cpp index b1672efc11..b161b01593 100644 --- a/src/sql/ob_optimizer_trace_impl.cpp +++ b/src/sql/ob_optimizer_trace_impl.cpp @@ -871,8 +871,9 @@ int ObOptimizerTraceImpl::trace_env() int ret = OB_SUCCESS; char buf[1024+1] = {0}; int64_t buf_len = 1024; - get_package_and_svn(buf, buf_len); - if (OB_FAIL(new_line())) { + if (OB_FAIL(get_package_and_svn(buf, buf_len))) { + LOG_WARN("fail to get build_version", KR(ret)); + } else if (OB_FAIL(new_line())) { LOG_WARN("failed to append msg", K(ret)); } else if (OB_FAIL(append_key_value("Version", ObString(strlen(buf), buf)))) { LOG_WARN("failed to append msg", K(ret));