diff --git a/src/storage/ls/ob_ls_tablet_service.cpp b/src/storage/ls/ob_ls_tablet_service.cpp index 644e1210f50ea3bdd9037a0d51d1d650a4042174..c1ae1c422431c233aa757e77165c263db388ee26 100644 --- a/src/storage/ls/ob_ls_tablet_service.cpp +++ b/src/storage/ls/ob_ls_tablet_service.cpp @@ -3265,6 +3265,39 @@ int ObLSTabletService::insert_lob_col( return ret; } +int ObLSTabletService::check_lob_tablet_valid(ObTabletHandle &data_tablet) +{ + int ret = OB_SUCCESS; + bool is_valid_aux_lob_table = false; + ObTabletBindingInfo ddl_data; + if (OB_FAIL(data_tablet.get_obj()->get_ddl_data(ddl_data))) { + LOG_WARN("failed to get ddl data from tablet", K(ret), K(data_tablet)); + } else { + is_valid_aux_lob_table = ddl_data.lob_meta_tablet_id_.is_valid() && ddl_data.lob_piece_tablet_id_.is_valid(); + if (!is_valid_aux_lob_table) { + ObTabletTxMultiSourceDataUnit tx_data; + if (OB_FAIL(data_tablet.get_obj()->get_tx_data(tx_data))) { + LOG_WARN("fail to get tx data", K(ret), K(data_tablet)); + } else if (tx_data.is_in_tx()) { + ret = OB_SCHEMA_EAGAIN; + LOG_WARN("do retry for data tablet is in tx, maybe wait for lob tablet finish", K(ret), K(ddl_data)); + } else { + // maybe has committed, refresh binding info and check once + if (OB_FAIL(data_tablet.get_obj()->get_ddl_data(ddl_data))) { + LOG_WARN("failed to get ddl data from tablet", K(ret), K(data_tablet)); + } else { + is_valid_aux_lob_table = ddl_data.lob_meta_tablet_id_.is_valid() && ddl_data.lob_piece_tablet_id_.is_valid(); + if (!is_valid_aux_lob_table) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("aux lob table must valid when lob column exist", K(ret), K(ddl_data)); + } + } + } + } + } + return ret; +} + int ObLSTabletService::insert_lob_tablet_row( ObTabletHandle &data_tablet, ObDMLRunningCtx &run_ctx, @@ -3273,7 +3306,7 @@ int ObLSTabletService::insert_lob_tablet_row( int ret = OB_SUCCESS; int64_t col_cnt = run_ctx.col_descs_->count(); ObLobManager *lob_mngr = MTL(ObLobManager*); - bool check_ddl_data = false; + bool check_lob = false; if (OB_ISNULL(lob_mngr)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("[STORAGE_LOB]failed to get lob manager handle.", K(ret)); @@ -3281,27 +3314,20 @@ int ObLSTabletService::insert_lob_tablet_row( ret = OB_ERR_UNEXPECTED; LOG_WARN("[STORAGE_LOB]column count invalid", K(ret), K(col_cnt), K(row.row_val_.count_)); } else { - bool is_valid_aux_lob_table = false; for (int64_t i = 0; OB_SUCC(ret) && i < col_cnt; ++i) { const ObColDesc &column = run_ctx.col_descs_->at(i); - if (column.col_type_.is_lob_v2()) { - if (!check_ddl_data) { - ObTabletBindingInfo ddl_data; - if (OB_FAIL(data_tablet.get_obj()->get_ddl_data(ddl_data))) { - LOG_WARN("failed to get ddl data from tablet", K(ret), K(data_tablet)); + ObObj &obj = row.row_val_.get_cell(i); + if (!column.col_type_.is_lob_v2() || obj.is_null() || obj.is_nop_value()) { + // do nothing + } else { + if (!check_lob) { + if (OB_FAIL(check_lob_tablet_valid(data_tablet))) { + LOG_WARN("failed to check_lob_tablet_valid", K(ret), K(data_tablet)); } else { - check_ddl_data = true; - const common::ObTabletID &data_tablet_id = data_tablet.get_obj()->tablet_meta_.tablet_id_; - const common::ObTabletID &lob_meta_tablet_id = ddl_data.lob_meta_tablet_id_; - const common::ObTabletID &lob_piece_tablet_id = ddl_data.lob_piece_tablet_id_; - is_valid_aux_lob_table = lob_meta_tablet_id.is_valid() && lob_piece_tablet_id.is_valid(); + check_lob = true; } } - ObObj &obj = row.row_val_.get_cell(i); if (OB_FAIL(ret)) { - } else if (!is_valid_aux_lob_table) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("aux lob table must valid when lob column exist", K(ret), K(data_tablet)); } else if(OB_FAIL(insert_lob_col(run_ctx, column, obj, nullptr, nullptr))) { LOG_WARN("[STORAGE_LOB]failed to insert lob col.", K(ret), K(row), K(i)); } @@ -3540,8 +3566,7 @@ int ObLSTabletService::process_lob_row( ObStoreRow &new_row) { int ret = OB_SUCCESS; - bool is_valid_aux_lob_table = false; - bool check_ddl_data = false; + bool check_lob = false; if (OB_UNLIKELY(old_row.row_val_.get_count() != new_row.row_val_.get_count())) { ret = OB_INVALID_ARGUMENT; LOG_WARN("[STORAGE_LOB]invalid args", K(old_row), K(new_row), K(ret)); @@ -3564,20 +3589,12 @@ int ObLSTabletService::process_lob_row( ObLobCommon *lob_common = nullptr; ObLobAccessParam lob_param; lob_param.update_len_ = new_obj.get_string_len(); - if (!check_ddl_data) { + if (!check_lob) { ObTabletBindingInfo ddl_data; - if (OB_FAIL(tablet_handle.get_obj()->get_ddl_data(ddl_data))) { - LOG_WARN("failed to get ddl data from tablet", K(ret), K(tablet_handle)); + if (OB_FAIL(check_lob_tablet_valid(tablet_handle))) { + LOG_WARN("failed to check_lob_tablet_valid", K(ret), K(tablet_handle)); } else { - check_ddl_data = true; - const common::ObTabletID &data_tablet_id = tablet_handle.get_obj()->tablet_meta_.tablet_id_; - const common::ObTabletID &lob_meta_tablet_id = ddl_data.lob_meta_tablet_id_; - const common::ObTabletID &lob_piece_tablet_id = ddl_data.lob_piece_tablet_id_; - is_valid_aux_lob_table = lob_meta_tablet_id.is_valid() && lob_piece_tablet_id.is_valid(); - if (!is_valid_aux_lob_table) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("aux lob table must valid when lob column exist", K(ret), K(lob_meta_tablet_id), K(lob_piece_tablet_id)); - } + check_lob = true; } } if (OB_FAIL(ret)) { diff --git a/src/storage/ls/ob_ls_tablet_service.h b/src/storage/ls/ob_ls_tablet_service.h index 78354dfd9cae97655e0129c590e50476d983e3df..2a90465a57604dff97787b6f2393a5261e97bceb 100644 --- a/src/storage/ls/ob_ls_tablet_service.h +++ b/src/storage/ls/ob_ls_tablet_service.h @@ -555,6 +555,8 @@ private: ObObj &obj, ObLobAccessParam *del_param, ObLobCommon *lob_common); + static int check_lob_tablet_valid( + ObTabletHandle &data_tablet); static int insert_lob_tablet_row( ObTabletHandle &data_tablet, ObDMLRunningCtx &run_ctx,