[PALF] fix GET_MIN_DATA_VERSION may return -4018
This commit is contained in:
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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))) {
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
Reference in New Issue
Block a user