[PALF] fix GET_MIN_DATA_VERSION may return -4018

This commit is contained in:
BinChenn
2023-04-26 15:09:35 +00:00
committed by ob-robot
parent 3514f929b6
commit ef51ca80f8
9 changed files with 39 additions and 61 deletions

View File

@ -279,8 +279,9 @@ int LogConfigMgr::set_initial_config_info_(const LogConfigInfo &config_info,
if (false == check_need_update_memberlist_without_lock_(init_config_version)) {
PALF_LOG(INFO, "persistent_config_version_ has been greater than or equal to config_version, \
no need set_initial_config_info_", K(ret), K_(palf_id), K_(self), K_(log_ms_meta), K_(persistent_config_version), K(init_config_version));
} else if (OB_FAIL(log_ms_meta_.generate(proposal_id, init_config_info, init_config_info, proposal_id, LSN(PALF_INITIAL_LSN_VAL), proposal_id))) {
PALF_LOG(ERROR, "generate LogConfigMeta failed", KR(ret), K_(palf_id), K(proposal_id), K(initial_config_seq));
} else if (OB_FAIL(log_ms_meta_.generate(proposal_id, init_config_info, init_config_info,
proposal_id, LSN(PALF_INITIAL_LSN_VAL), proposal_id))) {
PALF_LOG(WARN, "generate LogConfigMeta failed", KR(ret), K_(palf_id), K(proposal_id), K(initial_config_seq));
} else {
config_meta_ = log_ms_meta_;
FlushMetaCbCtx cb_ctx;

View File

@ -64,37 +64,6 @@ int LogMeta::generate_by_palf_base_info(const PalfBaseInfo &palf_base_info,
return ret;
}
int LogMeta::generate_by_palf_base_info_in_arb(const PalfBaseInfo &palf_base_info,
const AccessMode &access_mode,
const LogReplicaType &replica_type)
{
int ret = OB_SUCCESS;
if (false == is_valid_access_mode(access_mode) || false == palf_base_info.is_valid()) {
ret = OB_INVALID_ARGUMENT;
PALF_LOG(INFO, "invalid argument", KPC(this), K(access_mode), K(palf_base_info));
} else if (OB_FAIL(log_snapshot_meta_.generate(palf_base_info.curr_lsn_, palf_base_info.prev_log_info_))) {
PALF_LOG(WARN, "generate snapshot_meta failed", K(ret), K(palf_base_info));
} else {
const int64_t prev_log_proposal_id = palf_base_info.prev_log_info_.log_proposal_id_;
const SCN &prev_scn = palf_base_info.prev_log_info_.scn_;
const int64_t init_log_proposal_id = (prev_log_proposal_id != INVALID_PROPOSAL_ID)? \
prev_log_proposal_id: PALF_INITIAL_PROPOSAL_ID;
const SCN init_ref_scn = (prev_scn.is_valid() ? prev_scn: SCN::min_scn());
LogConfigInfo init_config_info;
LogConfigVersion init_config_version;
init_config_version.generate(init_log_proposal_id, 0);
init_config_info.config_version_ = init_config_version;
version_ = LOG_META_VERSION;
log_prepare_meta_.generate(LogVotedFor(), init_log_proposal_id);
log_config_meta_.generate_for_default_in_arb(init_log_proposal_id, init_config_info, init_config_info);
log_mode_meta_.generate(init_log_proposal_id, init_log_proposal_id, access_mode, init_ref_scn);
const bool allow_vote = (replica_type != ARBITRATION_REPLICA);
log_replica_property_meta_.generate(allow_vote, replica_type);
PALF_LOG(INFO, "generate_by_palf_base_info success", KPC(this));
}
return ret;
}
int LogMeta::load(const char *buf, int64_t buf_len)
{
int ret = OB_SUCCESS;

View File

@ -34,9 +34,6 @@ public:
int generate_by_palf_base_info(const PalfBaseInfo &palf_base_info,
const AccessMode &access_mode,
const LogReplicaType &replica_type);
int generate_by_palf_base_info_in_arb(const PalfBaseInfo &palf_base_info,
const AccessMode &access_mode,
const LogReplicaType &replica_type);
int load(const char *buf, int64_t buf_len);
bool is_valid() const;

View File

@ -567,33 +567,15 @@ int LogConfigMeta::generate_for_default(
const int64_t proposal_id,
const LogConfigInfo &prev_config_info,
const LogConfigInfo &curr_config_info)
{
int ret = OB_SUCCESS;
uint64_t tenant_data_version = 0;
if (INVALID_PROPOSAL_ID == proposal_id) {
ret = OB_INVALID_ARGUMENT;
} else if (OB_FAIL(GET_MIN_DATA_VERSION(MTL_ID(), tenant_data_version))) {
PALF_LOG(WARN, "get tenant data version failed", K(ret));
} else {
const bool is_cluster_already_4100 = (tenant_data_version >= DATA_VERSION_4_1_0_0);
version_ = (is_cluster_already_4100)? LOG_CONFIG_META_VERSION_INC: LOG_CONFIG_META_VERSION;
proposal_id_ = proposal_id;
prev_ = prev_config_info;
curr_ = curr_config_info;
}
return ret;
}
// generate a mock ConfigMeta for arb server
int LogConfigMeta::generate_for_default_in_arb(
const int64_t proposal_id,
const LogConfigInfo &prev_config_info,
const LogConfigInfo &curr_config_info)
{
int ret = OB_SUCCESS;
if (INVALID_PROPOSAL_ID == proposal_id) {
ret = OB_INVALID_ARGUMENT;
} else {
// Note: we generate a default META_VERSION rather than according to DATA_VERSION,
// because DATA_VERSION of the tenant may be empty it the server is just added
// to the cluster. It's fine because real LogConfigMeta will be set by the
// set_initial_member_list interface.
version_ = LOG_CONFIG_META_VERSION_INC;
proposal_id_ = proposal_id;
prev_ = prev_config_info;

View File

@ -162,12 +162,10 @@ public:
~LogConfigMeta();
public:
// Note: the function will generate a default version_.
int generate_for_default(const int64_t proposal_id,
const LogConfigInfo &prev_config_info,
const LogConfigInfo &curr_config_info);
int generate_for_default_in_arb(const int64_t proposal_id,
const LogConfigInfo &prev_config_info,
const LogConfigInfo &curr_config_info);
int generate(const int64_t proposal_id,
const LogConfigInfo &prev_config_info,
const LogConfigInfo &curr_config_info,

View File

@ -450,6 +450,7 @@ int LogRequestHandler::handle_sync_request<LogGetMCStReq, LogGetMCStResp>(
IPalfHandleImplGuard guard;
if (false == palf_env_impl_->check_disk_space_enough()) {
resp.is_normal_replica_ = false;
PALF_LOG(WARN, "check_disk_space_enough returns false", K(req), K(resp));
} else if (OB_FAIL(palf_env_impl_->get_palf_handle_impl(palf_id, guard))) {
PALF_LOG(WARN, "PalfEnvImpl get_palf_handle_impl failed", K(ret), K(palf_id));
} else if (OB_FAIL(guard.get_palf_handle_impl()->config_change_pre_check(server, req, resp))) {

View File

@ -522,9 +522,16 @@ int PalfHandleImpl::config_change_pre_check(const ObAddr &server,
LogGetMCStResp &resp)
{
int ret = OB_SUCCESS;
uint64_t tenant_data_version = 0;
int tmp_ret = common::OB_SUCCESS;
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
PALF_LOG(ERROR, "PalfHandleImpl has not inited", K(ret), K_(palf_id));
} else if (OB_TMP_FAIL(GET_MIN_DATA_VERSION(MTL_ID(), tenant_data_version))) {
// Note: if the DATA_VERSION in the replica is empty, it is not allowed
// to be added in the Paxos group. Check PalfHandleImpl only
resp.is_normal_replica_ = false;
PALF_LOG(WARN, "get tenant data version failed", K(tmp_ret), K(req), K(resp));
} else {
RLockGuard guard(lock_);
int64_t curr_proposal_id = state_mgr_.get_proposal_id();

View File

@ -1287,6 +1287,21 @@ TEST_F(TestLogConfigMgr, test_handle_retire_msg)
PALF_LOG(INFO, "test_handle_retire_msg end case");
}
TEST_F(TestLogConfigMgr, test_init_by_default_config_meta)
{
const int64_t init_log_proposal_id = 0;
LogConfigInfo init_config_info;
LogConfigVersion init_config_version;
init_config_version.generate(init_log_proposal_id, 0);
init_config_info.config_version_ = init_config_version;
LogConfigMeta log_config_meta;
LogConfigMgr cm;
EXPECT_EQ(OB_SUCCESS, log_config_meta.generate_for_default(init_log_proposal_id,
init_config_info, init_config_info));
EXPECT_EQ(OB_SUCCESS, cm.init(1, addr1, log_config_meta, mock_log_engine_,
mock_sw_, mock_state_mgr_, mock_election_,
mock_mode_mgr_, mock_reconfirm_, mock_plugins_));
}
} // end namespace unittest
} // end namespace oceanbase

View File

@ -21,6 +21,8 @@ namespace oceanbase
{
using namespace common;
using namespace palf;
constexpr int64_t palf::LogConfigMeta::LOG_CONFIG_META_VERSION;
constexpr int64_t palf::LogConfigMeta::LOG_CONFIG_META_VERSION_INC;
namespace unittest
{
@ -120,6 +122,12 @@ TEST(TestLogMetaInfos, test_log_config_meta)
const LSN barrier_lsn = LSN(300);
const int64_t barrier_mode_pid = 4;
// Test default version
LogConfigMeta default_config_meta;
EXPECT_EQ(OB_SUCCESS, default_config_meta.generate_for_default(curr_log_proposal_id, prev_config_info, curr_config_info));
EXPECT_TRUE(default_config_meta.is_valid());
EXPECT_EQ(palf::LogConfigMeta::LOG_CONFIG_META_VERSION_INC, default_config_meta.version_);
// Test invalid argument
LogConfigMeta log_config_meta;
EXPECT_EQ(OB_INVALID_ARGUMENT, log_config_meta.generate(curr_log_proposal_id, prev_config_info, curr_config_info,