[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