[CP] [MDS] deserialize buffer_ctx by multi_data_source id
This commit is contained in:
		@ -26,6 +26,7 @@
 | 
				
			|||||||
#include "storage/multi_data_source/runtime_utility/mds_tenant_service.h"
 | 
					#include "storage/multi_data_source/runtime_utility/mds_tenant_service.h"
 | 
				
			||||||
#include "storage/tx/ob_trans_define.h"
 | 
					#include "storage/tx/ob_trans_define.h"
 | 
				
			||||||
#include "storage/multi_data_source/runtime_utility/mds_tenant_service.h"
 | 
					#include "storage/multi_data_source/runtime_utility/mds_tenant_service.h"
 | 
				
			||||||
 | 
					#include "storage/tx/ob_trans_define.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace oceanbase
 | 
					namespace oceanbase
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -117,17 +118,65 @@ int deserialize_<BufferCtxTupleHelper::get_element_size()>(BufferCtx *&ctx_,
 | 
				
			|||||||
  return ret;
 | 
					  return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/****************************************************for compat********************************************************/
 | 
				
			||||||
 | 
					transaction::ObTxBufferNode *get_current_tx_buffer_node() {
 | 
				
			||||||
 | 
					  transaction::ObTxBufferNode *tx_buffer_node = nullptr;
 | 
				
			||||||
 | 
					  if (transaction::TLOCAL_P_TX_BUFFER_NODE_ARRAY) {
 | 
				
			||||||
 | 
					    transaction::ObTxBufferNodeArray &array = *transaction::TLOCAL_P_TX_BUFFER_NODE_ARRAY;
 | 
				
			||||||
 | 
					    for (int64_t idx = 0; idx < array.count(); ++idx) {
 | 
				
			||||||
 | 
					      if (!array[idx].has_deserialized_buffer_ctx()) {
 | 
				
			||||||
 | 
					        tx_buffer_node = &array[idx];
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return tx_buffer_node;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					int get_ctx_type_id_by_multi_data_source_type_idx(const transaction::ObTxDataSourceType multi_data_source_type, int64_t &ctx_type_idx) {
 | 
				
			||||||
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
 | 
					  switch (multi_data_source_type) {
 | 
				
			||||||
 | 
					    #define NEED_GENERATE_MDS_FRAME_CODE_FOR_TRANSACTION
 | 
				
			||||||
 | 
					    #define _GENERATE_MDS_FRAME_CODE_FOR_TRANSACTION_(HELPER_CLASS, BUFFER_CTX_TYPE, ID, ENUM_NAME) \
 | 
				
			||||||
 | 
					    case transaction::ObTxDataSourceType::ENUM_NAME:\
 | 
				
			||||||
 | 
					    {\
 | 
				
			||||||
 | 
					      ctx_type_idx = TupleTypeIdx<BufferCtxTupleHelper, BUFFER_CTX_TYPE>::value;\
 | 
				
			||||||
 | 
					    }\
 | 
				
			||||||
 | 
					    break;
 | 
				
			||||||
 | 
					    #include "storage/multi_data_source/compile_utility/mds_register.h"
 | 
				
			||||||
 | 
					    #undef _GENERATE_MDS_FRAME_CODE_FOR_TRANSACTION_
 | 
				
			||||||
 | 
					    #undef NEED_GENERATE_MDS_FRAME_CODE_FOR_TRANSACTION
 | 
				
			||||||
 | 
					    default:// this is an old MDS out of FRAME code, for example: table lock
 | 
				
			||||||
 | 
					    MDS_LOG(INFO, "this multi data source is out of frame", KR(ret), K(ctx_type_idx), K(multi_data_source_type));
 | 
				
			||||||
 | 
					    break;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/**********************************************************************************************************************/
 | 
				
			||||||
int BufferCtxNode::deserialize(const char *buf, const int64_t buf_len, int64_t &pos, ObIAllocator &allocator)
 | 
					int BufferCtxNode::deserialize(const char *buf, const int64_t buf_len, int64_t &pos, ObIAllocator &allocator)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  MDS_TG(10_ms);
 | 
					  MDS_TG(10_ms);
 | 
				
			||||||
  int64_t type_idx = INVALID_VALUE;
 | 
					  int64_t ctx_type_idx = INVALID_VALUE;
 | 
				
			||||||
  if (MDS_FAIL(serialization::decode(buf, buf_len, pos, type_idx))) {
 | 
					  transaction::ObTxBufferNode *tx_buffer_node = get_current_tx_buffer_node();
 | 
				
			||||||
    MDS_LOG(ERROR, "fail to deserialize buffer ctx id", KR(ret), K(type_idx));
 | 
					  if (MDS_FAIL(serialization::decode(buf, buf_len, pos, ctx_type_idx))) {
 | 
				
			||||||
  } else if (INVALID_VALUE == type_idx) {
 | 
					    MDS_LOG(ERROR, "fail to deserialize buffer ctx id", KR(ret), K(ctx_type_idx));
 | 
				
			||||||
    MDS_LOG(DEBUG, "deserialized INVALD buffer ctx", KR(ret), K(type_idx), K(buf_len), K(pos));
 | 
					  } else if (INVALID_VALUE == ctx_type_idx) {
 | 
				
			||||||
  } else if (MDS_FAIL(deserialize_<0>(ctx_, type_idx, buf, buf_len, pos, allocator))) {
 | 
					    MDS_LOG(DEBUG, "deserialized INVALD buffer ctx", KR(ret), K(ctx_type_idx), K(buf_len), K(pos));
 | 
				
			||||||
    MDS_LOG(WARN, "deserialized buffer ctx failed", KR(ret), K(type_idx));
 | 
					  } else {
 | 
				
			||||||
 | 
					    if (tx_buffer_node) {
 | 
				
			||||||
 | 
					      if (OB_FAIL(get_ctx_type_id_by_multi_data_source_type_idx(tx_buffer_node->get_data_source_type(), ctx_type_idx))) {
 | 
				
			||||||
 | 
					        MDS_LOG(ERROR, "fail get_ctx_type_id_by_multi_data_source_type_idx", KR(ret), K(ctx_type_idx));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (OB_FAIL(ret)) {
 | 
				
			||||||
 | 
					    } else if (MDS_FAIL(deserialize_<0>(ctx_, ctx_type_idx, buf, buf_len, pos, allocator))) {
 | 
				
			||||||
 | 
					      MDS_LOG(WARN, "deserialized buffer ctx failed", KR(ret), K(ctx_type_idx));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (OB_SUCC(ret)) {
 | 
				
			||||||
 | 
					    if (tx_buffer_node) {
 | 
				
			||||||
 | 
					      tx_buffer_node->set_has_deserialized_buffer_ctx();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return ret;
 | 
					  return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -88,6 +88,7 @@ int ObTabletCreateMdsCtx::serialize(char *buf, const int64_t buf_len, int64_t &p
 | 
				
			|||||||
int ObTabletCreateMdsCtx::deserialize(const char *buf, const int64_t buf_len, int64_t &pos)
 | 
					int ObTabletCreateMdsCtx::deserialize(const char *buf, const int64_t buf_len, int64_t &pos)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
 | 
					  int64_t origin_pos = pos;
 | 
				
			||||||
  int64_t tmp_pos = pos;
 | 
					  int64_t tmp_pos = pos;
 | 
				
			||||||
  int32_t magic = -1;
 | 
					  int32_t magic = -1;
 | 
				
			||||||
  int32_t version = -1;
 | 
					  int32_t version = -1;
 | 
				
			||||||
@ -100,13 +101,19 @@ int ObTabletCreateMdsCtx::deserialize(const char *buf, const int64_t buf_len, in
 | 
				
			|||||||
    LOG_WARN("invalid args", K(ret), K(buf), K(buf_len), K(pos));
 | 
					    LOG_WARN("invalid args", K(ret), K(buf), K(buf_len), K(pos));
 | 
				
			||||||
  } else if (OB_FAIL(MdsCtx::deserialize(buf, buf_len, tmp_pos))) {
 | 
					  } else if (OB_FAIL(MdsCtx::deserialize(buf, buf_len, tmp_pos))) {
 | 
				
			||||||
    LOG_WARN("fail to deserialize mds ctx", K(ret), K(buf_len), K(tmp_pos));
 | 
					    LOG_WARN("fail to deserialize mds ctx", K(ret), K(buf_len), K(tmp_pos));
 | 
				
			||||||
  } else if (OB_FAIL(serialization::decode(buf, buf_len, tmp_pos, magic))) {
 | 
					  } else {
 | 
				
			||||||
    LOG_WARN("failed to deserialize magic", K(ret), K(buf_len), K(tmp_pos));
 | 
					    int tmp_ret = OB_SUCCESS;
 | 
				
			||||||
  } else if (OB_UNLIKELY(magic != MAGIC)) {
 | 
					 | 
				
			||||||
    FLOG_INFO("magic does not match, maybe this is old version data", K(ret), K(magic), LITERAL_K(MAGIC));
 | 
					 | 
				
			||||||
    version_ = VERSION;
 | 
					 | 
				
			||||||
    ls_id_ = ObLSID::INVALID_LS_ID;
 | 
					 | 
				
			||||||
    pos = tmp_pos;
 | 
					    pos = tmp_pos;
 | 
				
			||||||
 | 
					    bool is_old_data = false;
 | 
				
			||||||
 | 
					    if (tmp_pos == buf_len) {
 | 
				
			||||||
 | 
					      LOG_WARN("buffer is not enough for magic deserialize", K(ret), K(buf_len), K(tmp_pos));
 | 
				
			||||||
 | 
					      is_old_data = true;
 | 
				
			||||||
 | 
					    } else if (OB_TMP_FAIL(serialization::decode(buf, buf_len, tmp_pos, magic))) {
 | 
				
			||||||
 | 
					      LOG_WARN("decode magic from buffer failed", K(tmp_ret), K(ret), K(buf_len), K(tmp_pos));
 | 
				
			||||||
 | 
					      is_old_data = true;
 | 
				
			||||||
 | 
					    } else if (magic != MAGIC) {
 | 
				
			||||||
 | 
					      LOG_WARN("magic not match", K(tmp_ret), K(ret), K(buf_len), K(tmp_pos));
 | 
				
			||||||
 | 
					      is_old_data = true;
 | 
				
			||||||
    } else if (OB_FAIL(serialization::decode(buf, buf_len, tmp_pos, version))) {
 | 
					    } else if (OB_FAIL(serialization::decode(buf, buf_len, tmp_pos, version))) {
 | 
				
			||||||
      LOG_WARN("failed to deserialize version", K(ret), K(buf_len), K(tmp_pos));
 | 
					      LOG_WARN("failed to deserialize version", K(ret), K(buf_len), K(tmp_pos));
 | 
				
			||||||
    } else if (OB_UNLIKELY(VERSION != version)) {
 | 
					    } else if (OB_UNLIKELY(VERSION != version)) {
 | 
				
			||||||
@ -114,9 +121,9 @@ int ObTabletCreateMdsCtx::deserialize(const char *buf, const int64_t buf_len, in
 | 
				
			|||||||
      LOG_WARN("version does not match", K(ret), K(version));
 | 
					      LOG_WARN("version does not match", K(ret), K(version));
 | 
				
			||||||
    } else if (OB_FAIL(serialization::decode_i64(buf, buf_len, tmp_pos, &serialize_size))) {
 | 
					    } else if (OB_FAIL(serialization::decode_i64(buf, buf_len, tmp_pos, &serialize_size))) {
 | 
				
			||||||
      LOG_WARN("failed to deserialize serialize size", K(ret), K(buf_len), K(tmp_pos));
 | 
					      LOG_WARN("failed to deserialize serialize size", K(ret), K(buf_len), K(tmp_pos));
 | 
				
			||||||
  } else if (tmp_pos - pos < serialize_size && OB_FAIL(ls_id_.deserialize(buf, buf_len, tmp_pos))) {
 | 
					    } else if (tmp_pos - origin_pos < serialize_size && OB_FAIL(ls_id_.deserialize(buf, buf_len, tmp_pos))) {
 | 
				
			||||||
      LOG_WARN("failed to deserialize ls id", K(ret), K(buf_len), K(tmp_pos));
 | 
					      LOG_WARN("failed to deserialize ls id", K(ret), K(buf_len), K(tmp_pos));
 | 
				
			||||||
  } else if (OB_UNLIKELY(tmp_pos - pos != serialize_size)) {
 | 
					    } else if (OB_UNLIKELY(tmp_pos - origin_pos != serialize_size)) {
 | 
				
			||||||
      ret = OB_ERR_UNEXPECTED;
 | 
					      ret = OB_ERR_UNEXPECTED;
 | 
				
			||||||
      LOG_WARN("deserialize length does not match", K(ret), K(buf_len), K(pos), K(tmp_pos), K(serialize_size));
 | 
					      LOG_WARN("deserialize length does not match", K(ret), K(buf_len), K(pos), K(tmp_pos), K(serialize_size));
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
@ -124,6 +131,13 @@ int ObTabletCreateMdsCtx::deserialize(const char *buf, const int64_t buf_len, in
 | 
				
			|||||||
      pos = tmp_pos;
 | 
					      pos = tmp_pos;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (is_old_data) {
 | 
				
			||||||
 | 
					      FLOG_INFO("maybe meet old version data", K(ret), K(magic), LITERAL_K(MAGIC));
 | 
				
			||||||
 | 
					      version_ = VERSION;
 | 
				
			||||||
 | 
					      ls_id_ = ObLSID::INVALID_LS_ID;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return ret;
 | 
					  return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -24,6 +24,8 @@ namespace oceanbase
 | 
				
			|||||||
namespace transaction
 | 
					namespace transaction
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					thread_local ObTxBufferNodeArray *TLOCAL_P_TX_BUFFER_NODE_ARRAY = nullptr;// FIXME: for compat issue, should be removed after barrier version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ObTxBufferNode::ObTxBufferNode()
 | 
					ObTxBufferNode::ObTxBufferNode()
 | 
				
			||||||
  : seq_no_(),
 | 
					  : seq_no_(),
 | 
				
			||||||
    type_(ObTxDataSourceType::UNKNOWN),
 | 
					    type_(ObTxDataSourceType::UNKNOWN),
 | 
				
			||||||
@ -72,6 +74,7 @@ void ObTxBufferNode::reset()
 | 
				
			|||||||
  has_submitted_ = false;
 | 
					  has_submitted_ = false;
 | 
				
			||||||
  has_synced_ = false;
 | 
					  has_synced_ = false;
 | 
				
			||||||
  mds_base_scn_.reset();
 | 
					  mds_base_scn_.reset();
 | 
				
			||||||
 | 
					  has_deserialized_buffer_ctx_ = false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ObTxBufferNode::set_mds_register_no(const uint64_t register_no)
 | 
					int ObTxBufferNode::set_mds_register_no(const uint64_t register_no)
 | 
				
			||||||
 | 
				
			|||||||
@ -77,6 +77,9 @@ public:
 | 
				
			|||||||
  void set_synced() { has_synced_ = true; }
 | 
					  void set_synced() { has_synced_ = true; }
 | 
				
			||||||
  bool is_synced() const { return has_synced_; }
 | 
					  bool is_synced() const { return has_synced_; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void set_has_deserialized_buffer_ctx() { has_deserialized_buffer_ctx_ = true; }
 | 
				
			||||||
 | 
					  bool has_deserialized_buffer_ctx() const { return has_deserialized_buffer_ctx_; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const share::SCN &get_base_scn() { return mds_base_scn_; }
 | 
					  const share::SCN &get_base_scn() { return mds_base_scn_; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bool operator==(const ObTxBufferNode &buffer_node) const;
 | 
					  bool operator==(const ObTxBufferNode &buffer_node) const;
 | 
				
			||||||
@ -92,12 +95,14 @@ public:
 | 
				
			|||||||
               K(has_submitted_),
 | 
					               K(has_submitted_),
 | 
				
			||||||
               K(has_synced_),
 | 
					               K(has_synced_),
 | 
				
			||||||
               "type", ObMultiDataSourcePrinter::to_str_mds_type(type_),
 | 
					               "type", ObMultiDataSourcePrinter::to_str_mds_type(type_),
 | 
				
			||||||
               K(data_.length()));
 | 
					               K(data_.length()),
 | 
				
			||||||
 | 
					               K(has_deserialized_buffer_ctx_));
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
  uint64_t register_no_;
 | 
					  uint64_t register_no_;
 | 
				
			||||||
  ObTxSEQ seq_no_;
 | 
					  ObTxSEQ seq_no_;
 | 
				
			||||||
  bool has_submitted_;
 | 
					  bool has_submitted_;
 | 
				
			||||||
  bool has_synced_;
 | 
					  bool has_synced_;
 | 
				
			||||||
 | 
					  bool has_deserialized_buffer_ctx_;// FIXME: for compat issue, should be removed after barrier version
 | 
				
			||||||
  share::SCN mds_base_scn_;
 | 
					  share::SCN mds_base_scn_;
 | 
				
			||||||
  ObTxDataSourceType type_;
 | 
					  ObTxDataSourceType type_;
 | 
				
			||||||
  common::ObString data_;
 | 
					  common::ObString data_;
 | 
				
			||||||
@ -128,6 +133,7 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef common::ObSEArray<ObTxBufferNode, 1> ObTxBufferNodeArray;
 | 
					typedef common::ObSEArray<ObTxBufferNode, 1> ObTxBufferNodeArray;
 | 
				
			||||||
typedef common::ObSEArray<storage::mds::BufferCtxNode , 1> ObTxBufferCtxArray;
 | 
					typedef common::ObSEArray<storage::mds::BufferCtxNode , 1> ObTxBufferCtxArray;
 | 
				
			||||||
 | 
					extern thread_local ObTxBufferNodeArray *TLOCAL_P_TX_BUFFER_NODE_ARRAY;// FIXME: for compat issue, should be removed after barrier version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -217,8 +217,11 @@ int ObTxCtxTableRecoverHelper::recover(const blocksstable::ObDatumRow &row,
 | 
				
			|||||||
    int64_t pos = 0;
 | 
					    int64_t pos = 0;
 | 
				
			||||||
    bool tx_ctx_existed = true;
 | 
					    bool tx_ctx_existed = true;
 | 
				
			||||||
    ctx_info_.set_compatible_version(curr_meta.get_version());
 | 
					    ctx_info_.set_compatible_version(curr_meta.get_version());
 | 
				
			||||||
    if (OB_FAIL(ctx_info_.deserialize(deserialize_buf, deserialize_buf_length, pos, tx_data_table))) {
 | 
					    if (FALSE_IT(TLOCAL_P_TX_BUFFER_NODE_ARRAY = &ctx_info_.exec_info_.multi_data_source_)) {// FIXME: for compat issue, should be removed after barrier version
 | 
				
			||||||
 | 
					    } else if (OB_FAIL(ctx_info_.deserialize(deserialize_buf, deserialize_buf_length, pos, tx_data_table))) {
 | 
				
			||||||
      STORAGE_LOG(WARN, "failed to deserialize status_info", K(ret), K_(ctx_info));
 | 
					      STORAGE_LOG(WARN, "failed to deserialize status_info", K(ret), K_(ctx_info));
 | 
				
			||||||
 | 
					      TLOCAL_P_TX_BUFFER_NODE_ARRAY = nullptr;// FIXME: for compat issue, should be removed after barrier version
 | 
				
			||||||
 | 
					    } else if (FALSE_IT(TLOCAL_P_TX_BUFFER_NODE_ARRAY = nullptr)) {// FIXME: for compat issue, should be removed after barrier version
 | 
				
			||||||
    } else if (FALSE_IT(ctx_info_.exec_info_.mrege_buffer_ctx_array_to_multi_data_source())) {
 | 
					    } else if (FALSE_IT(ctx_info_.exec_info_.mrege_buffer_ctx_array_to_multi_data_source())) {
 | 
				
			||||||
    } else if (OB_FAIL(recover_one_tx_ctx_(ls_tx_ctx_mgr, ctx_info_))) {
 | 
					    } else if (OB_FAIL(recover_one_tx_ctx_(ls_tx_ctx_mgr, ctx_info_))) {
 | 
				
			||||||
      // heap memory needed be freed, but can not do this in destruction, cause tx_buffer_node has no value sematics
 | 
					      // heap memory needed be freed, but can not do this in destruction, cause tx_buffer_node has no value sematics
 | 
				
			||||||
 | 
				
			|||||||
@ -68,6 +68,7 @@ storage_unittest(test_mvcc_callback memtable/mvcc/test_mvcc_callback.cpp)
 | 
				
			|||||||
# storage_unittest(test_mds_compile multi_data_source/test_mds_compile.cpp)
 | 
					# storage_unittest(test_mds_compile multi_data_source/test_mds_compile.cpp)
 | 
				
			||||||
storage_unittest(test_mds_list multi_data_source/test_mds_list.cpp)
 | 
					storage_unittest(test_mds_list multi_data_source/test_mds_list.cpp)
 | 
				
			||||||
storage_unittest(test_mds_node multi_data_source/test_mds_node.cpp)
 | 
					storage_unittest(test_mds_node multi_data_source/test_mds_node.cpp)
 | 
				
			||||||
 | 
					storage_unittest(test_mds_new_ctx_deserialized multi_data_source/test_mds_new_ctx_deserialized.cpp)
 | 
				
			||||||
# storage_unittest(test_mds_row multi_data_source/test_mds_row.cpp)
 | 
					# storage_unittest(test_mds_row multi_data_source/test_mds_row.cpp)
 | 
				
			||||||
# storage_unittest(test_mds_unit multi_data_source/test_mds_unit.cpp)
 | 
					# storage_unittest(test_mds_unit multi_data_source/test_mds_unit.cpp)
 | 
				
			||||||
storage_unittest(test_mds_table multi_data_source/test_mds_table.cpp)
 | 
					storage_unittest(test_mds_table multi_data_source/test_mds_table.cpp)
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,122 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Copyright (c) 2021 OceanBase
 | 
				
			||||||
 | 
					 * OceanBase CE is licensed under Mulan PubL v2.
 | 
				
			||||||
 | 
					 * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | 
				
			||||||
 | 
					 * You may obtain a copy of Mulan PubL v2 at:
 | 
				
			||||||
 | 
					 *          http://license.coscl.org.cn/MulanPubL-2.0
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | 
				
			||||||
 | 
					 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | 
				
			||||||
 | 
					 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | 
				
			||||||
 | 
					 * See the Mulan PubL v2 for more details.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#include "storage/multi_data_source/compile_utility/compile_mapper.h"
 | 
				
			||||||
 | 
					#include "storage/multi_data_source/mds_ctx.h"
 | 
				
			||||||
 | 
					#include "storage/multi_data_source/mds_writer.h"
 | 
				
			||||||
 | 
					#include "storage/multi_data_source/ob_tablet_create_mds_ctx.h"
 | 
				
			||||||
 | 
					#include "storage/tx/ob_trans_define.h"
 | 
				
			||||||
 | 
					#define UNITTEST_DEBUG
 | 
				
			||||||
 | 
					#include "lib/utility/utility.h"
 | 
				
			||||||
 | 
					#include <atomic>
 | 
				
			||||||
 | 
					#include <gtest/gtest.h>
 | 
				
			||||||
 | 
					#define private public
 | 
				
			||||||
 | 
					#define protected public
 | 
				
			||||||
 | 
					#include "storage/multi_data_source/compile_utility/mds_dummy_key.h"
 | 
				
			||||||
 | 
					#include "storage/multi_data_source/runtime_utility/common_define.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <thread>
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					#include <chrono>
 | 
				
			||||||
 | 
					#include "storage/multi_data_source/runtime_utility/mds_factory.h"
 | 
				
			||||||
 | 
					#include "common/ob_clock_generator.h"
 | 
				
			||||||
 | 
					#include "storage/multi_data_source/mds_node.h"
 | 
				
			||||||
 | 
					#include "common/meta_programming/ob_type_traits.h"
 | 
				
			||||||
 | 
					#include "storage/multi_data_source/mds_row.h"
 | 
				
			||||||
 | 
					namespace oceanbase {
 | 
				
			||||||
 | 
					namespace storage
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					namespace mds
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					void *MdsAllocator::alloc(const int64_t size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  void *ptr = ob_malloc(size, "MDS");
 | 
				
			||||||
 | 
					  ATOMIC_INC(&alloc_times_);
 | 
				
			||||||
 | 
					  MDS_LOG(DEBUG, "alloc obj", KP(ptr), K(size), K(lbt()));
 | 
				
			||||||
 | 
					  return ptr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					void MdsAllocator::free(void *ptr) {
 | 
				
			||||||
 | 
					  ATOMIC_INC(&free_times_);
 | 
				
			||||||
 | 
					  MDS_LOG(DEBUG, "free obj", KP(ptr), K(lbt()));
 | 
				
			||||||
 | 
					  ob_free(ptr);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					namespace unittest {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using namespace common;
 | 
				
			||||||
 | 
					using namespace std;
 | 
				
			||||||
 | 
					using namespace storage;
 | 
				
			||||||
 | 
					using namespace mds;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestMdsNewCtxDeserialized: public ::testing::Test
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  TestMdsNewCtxDeserialized() {};
 | 
				
			||||||
 | 
					  virtual ~TestMdsNewCtxDeserialized() {};
 | 
				
			||||||
 | 
					  virtual void SetUp() {
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  virtual void TearDown() {
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					  // disallow copy
 | 
				
			||||||
 | 
					  DISALLOW_COPY_AND_ASSIGN(TestMdsNewCtxDeserialized);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST_F(TestMdsNewCtxDeserialized, deserialized_from_mds_ctx) {
 | 
				
			||||||
 | 
					  MdsCtx old_ctx;
 | 
				
			||||||
 | 
					  old_ctx.set_writer(MdsWriter(transaction::ObTransID(1)));
 | 
				
			||||||
 | 
					  old_ctx.set_binding_type_id(TupleTypeIdx<mds::BufferCtxTupleHelper, MdsCtx>::value);
 | 
				
			||||||
 | 
					  char buffer[1024];
 | 
				
			||||||
 | 
					  for (auto &ch : buffer)
 | 
				
			||||||
 | 
					    ch = 0xff;
 | 
				
			||||||
 | 
					  int64_t pos = 0;
 | 
				
			||||||
 | 
					  ASSERT_EQ(OB_SUCCESS, old_ctx.serialize(buffer, 1024, pos));
 | 
				
			||||||
 | 
					  int64_t buffer_len = pos;
 | 
				
			||||||
 | 
					  pos = 0;
 | 
				
			||||||
 | 
					  ObTabletCreateMdsCtx new_ctx1;
 | 
				
			||||||
 | 
					  ASSERT_EQ(OB_SUCCESS, new_ctx1.deserialize(buffer, buffer_len, pos));
 | 
				
			||||||
 | 
					  pos = 0;
 | 
				
			||||||
 | 
					  ASSERT_EQ(OB_SUCCESS, new_ctx1.deserialize(buffer, buffer_len + 1, pos));
 | 
				
			||||||
 | 
					  pos = 0;
 | 
				
			||||||
 | 
					  for (int idx = buffer_len; idx < 1024; ++idx)
 | 
				
			||||||
 | 
					    buffer[idx] = 0;
 | 
				
			||||||
 | 
					  ASSERT_EQ(OB_SUCCESS, new_ctx1.deserialize(buffer, buffer_len + 10, pos));
 | 
				
			||||||
 | 
					  pos = 0;
 | 
				
			||||||
 | 
					  ObStartTransferInMdsCtx new_ctx2;
 | 
				
			||||||
 | 
					  ASSERT_EQ(OB_SUCCESS, new_ctx2.deserialize(buffer, buffer_len, pos));
 | 
				
			||||||
 | 
					  pos = 0;
 | 
				
			||||||
 | 
					  ObFinishTransferInMdsCtx new_ctx3;
 | 
				
			||||||
 | 
					  ASSERT_EQ(OB_SUCCESS, new_ctx3.deserialize(buffer, buffer_len, pos));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char **argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  system("rm -rf test_mds_new_ctx_deserialized.log");
 | 
				
			||||||
 | 
					  oceanbase::common::ObLogger &logger = oceanbase::common::ObLogger::get_logger();
 | 
				
			||||||
 | 
					  logger.set_file_name("test_mds_new_ctx_deserialized.log", false);
 | 
				
			||||||
 | 
					  logger.set_log_level(OB_LOG_LEVEL_DEBUG);
 | 
				
			||||||
 | 
					  testing::InitGoogleTest(&argc, argv);
 | 
				
			||||||
 | 
					  int ret = RUN_ALL_TESTS();
 | 
				
			||||||
 | 
					  int64_t alloc_times = oceanbase::storage::mds::MdsAllocator::get_alloc_times();
 | 
				
			||||||
 | 
					  int64_t free_times = oceanbase::storage::mds::MdsAllocator::get_free_times();
 | 
				
			||||||
 | 
					  if (alloc_times != free_times) {
 | 
				
			||||||
 | 
					    MDS_LOG(ERROR, "memory may leak", K(free_times), K(alloc_times));
 | 
				
			||||||
 | 
					    ret = -1;
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    MDS_LOG(INFO, "all memory released", K(free_times), K(alloc_times));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user