From 75d329f7471399313718a17f5c1f4d505a602850 Mon Sep 17 00:00:00 2001 From: YoungYang0820 Date: Mon, 14 Nov 2022 05:38:26 +0000 Subject: [PATCH] acquire snapshot for lob tablet when doing ddl --- .../ddl_task/ob_constraint_task.cpp | 32 +++++++ .../ddl_task/ob_ddl_redefinition_task.cpp | 50 +++++++++++ .../ddl_task/ob_index_build_task.cpp | 87 ++++++++++++++++++- src/rootserver/ddl_task/ob_index_build_task.h | 3 + .../engine/expr/ob_expr_to_outfile_row.cpp | 6 +- 5 files changed, 174 insertions(+), 4 deletions(-) diff --git a/src/rootserver/ddl_task/ob_constraint_task.cpp b/src/rootserver/ddl_task/ob_constraint_task.cpp index bcc9366cd1..6f1fba2e00 100644 --- a/src/rootserver/ddl_task/ob_constraint_task.cpp +++ b/src/rootserver/ddl_task/ob_constraint_task.cpp @@ -600,14 +600,30 @@ int ObConstraintTask::hold_snapshot(const int64_t snapshot_version) int ret = OB_SUCCESS; ObDDLService &ddl_service = root_service_->get_ddl_service(); ObSEArray tablet_ids; + ObSchemaGetterGuard schema_guard; + const ObTableSchema *table_schema = nullptr; + ObMultiVersionSchemaService &schema_service = ObMultiVersionSchemaService::get_instance(); if (OB_UNLIKELY(!is_inited_)) { ret = OB_NOT_INIT; LOG_WARN("ObConstraintTask has not been inited", K(ret)); } else if (OB_UNLIKELY(snapshot_version < 0)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid arguments", K(ret), K(snapshot_version)); + } else if (OB_FAIL(schema_service.get_tenant_schema_guard(tenant_id_, schema_guard))) { + LOG_WARN("get tenant schema guard failed", K(ret)); + } else if (OB_FAIL(schema_guard.get_table_schema(tenant_id_, object_id_, table_schema))) { + LOG_WARN("get table schema failed", K(ret), K(object_id_)); + } else if (OB_ISNULL(table_schema)) { + ret = OB_TABLE_NOT_EXIST; + LOG_WARN("table not exist", K(ret), K(object_id_), K(target_object_id_), KP(table_schema)); } else if (OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, object_id_, tablet_ids))) { LOG_WARN("failed to get tablet snapshots", K(ret)); + } else if (table_schema->get_aux_lob_meta_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, table_schema->get_aux_lob_meta_tid(), tablet_ids))) { + LOG_WARN("failed to get data lob meta table snapshot", K(ret)); + } else if (table_schema->get_aux_lob_piece_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, table_schema->get_aux_lob_piece_tid(), tablet_ids))) { + LOG_WARN("failed to get data lob piece table snapshot", K(ret)); } else if (OB_FAIL(ddl_service.get_snapshot_mgr().batch_acquire_snapshot( ddl_service.get_sql_proxy(), SNAPSHOT_FOR_DDL, tenant_id_, schema_version_, snapshot_version, nullptr, tablet_ids))) { LOG_WARN("acquire snapshot failed", K(ret), K(tablet_ids)); @@ -622,15 +638,31 @@ int ObConstraintTask::release_snapshot(const int64_t snapshot_version) int ret = OB_SUCCESS; ObDDLService &ddl_service = root_service_->get_ddl_service(); ObSEArray tablet_ids; + ObSchemaGetterGuard schema_guard; + const ObTableSchema *table_schema = nullptr; + ObMultiVersionSchemaService &schema_service = ObMultiVersionSchemaService::get_instance(); if (OB_UNLIKELY(!is_inited_)) { ret = OB_NOT_INIT; LOG_WARN("ObConstraintTask has not been inited", K(ret)); + } else if (OB_FAIL(schema_service.get_tenant_schema_guard(tenant_id_, schema_guard))) { + LOG_WARN("get tenant schema guard failed", K(ret)); + } else if (OB_FAIL(schema_guard.get_table_schema(tenant_id_, object_id_, table_schema))) { + LOG_WARN("get table schema failed", K(ret), K(object_id_)); + } else if (OB_ISNULL(table_schema)) { + ret = OB_TABLE_NOT_EXIST; + LOG_WARN("table not exist", K(ret), K(object_id_), K(target_object_id_), KP(table_schema)); } else if (OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, object_id_, tablet_ids))) { if (OB_TABLE_NOT_EXIST == ret) { ret = OB_SUCCESS; } else { LOG_WARN("failed to get tablet snapshots", K(ret)); } + } else if (table_schema->get_aux_lob_meta_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, table_schema->get_aux_lob_meta_tid(), tablet_ids))) { + LOG_WARN("failed to get data lob meta table snapshot", K(ret)); + } else if (table_schema->get_aux_lob_piece_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, table_schema->get_aux_lob_piece_tid(), tablet_ids))) { + LOG_WARN("failed to get data lob piece table snapshot", K(ret)); } else if (OB_FAIL(batch_release_snapshot(snapshot_version, tablet_ids))) { LOG_WARN("failed to release snapshots", K(ret)); } diff --git a/src/rootserver/ddl_task/ob_ddl_redefinition_task.cpp b/src/rootserver/ddl_task/ob_ddl_redefinition_task.cpp index b935e74686..099c58b70a 100644 --- a/src/rootserver/ddl_task/ob_ddl_redefinition_task.cpp +++ b/src/rootserver/ddl_task/ob_ddl_redefinition_task.cpp @@ -312,6 +312,10 @@ int ObDDLRedefinitionTask::hold_snapshot(const int64_t snapshot_version) int ret = OB_SUCCESS; ObRootService *root_service = GCTX.root_service_; ObSEArray tablet_ids; + ObSchemaGetterGuard schema_guard; + const ObTableSchema *data_table_schema = nullptr; + const ObTableSchema *dest_table_schema = nullptr; + ObMultiVersionSchemaService &schema_service = ObMultiVersionSchemaService::get_instance(); if (OB_UNLIKELY(!is_inited_)) { ret = OB_NOT_INIT; LOG_WARN("ObDDLRedefinitionTask has not been inited", K(ret)); @@ -321,10 +325,31 @@ int ObDDLRedefinitionTask::hold_snapshot(const int64_t snapshot_version) } else if (OB_UNLIKELY(snapshot_version < 0)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid arguments", K(ret), K(snapshot_version)); + } else if (OB_FAIL(schema_service.get_tenant_schema_guard(tenant_id_, schema_guard))) { + LOG_WARN("get tenant schema guard failed", K(ret)); + } else if (OB_FAIL(schema_guard.get_table_schema(tenant_id_, object_id_, data_table_schema))) { + LOG_WARN("get table schema failed", K(ret), K(object_id_)); + } else if (OB_FAIL(schema_guard.get_table_schema(tenant_id_, target_object_id_, dest_table_schema))) { + LOG_WARN("get table schema failed", K(ret), K(target_object_id_)); + } else if (OB_ISNULL(data_table_schema) || OB_ISNULL(dest_table_schema)) { + ret = OB_TABLE_NOT_EXIST; + LOG_WARN("table not exist", K(ret), K(object_id_), K(target_object_id_), KP(data_table_schema), KP(dest_table_schema)); } else if (OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, object_id_, tablet_ids))) { LOG_WARN("failed to get data table snapshot", K(ret)); } else if (OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, target_object_id_, tablet_ids))) { LOG_WARN("failed to get dest table snapshot", K(ret)); + } else if (data_table_schema->get_aux_lob_meta_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, data_table_schema->get_aux_lob_meta_tid(), tablet_ids))) { + LOG_WARN("failed to get data lob meta table snapshot", K(ret)); + } else if (data_table_schema->get_aux_lob_piece_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, data_table_schema->get_aux_lob_piece_tid(), tablet_ids))) { + LOG_WARN("failed to get data lob piece table snapshot", K(ret)); + } else if (dest_table_schema->get_aux_lob_meta_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, dest_table_schema->get_aux_lob_meta_tid(), tablet_ids))) { + LOG_WARN("failed to get dest lob meta table snapshot", K(ret)); + } else if (dest_table_schema->get_aux_lob_piece_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, dest_table_schema->get_aux_lob_piece_tid(), tablet_ids))) { + LOG_WARN("failed to get dest lob piece table snapshot", K(ret)); } else { ObDDLService &ddl_service = root_service->get_ddl_service(); if (OB_FAIL(ddl_service.get_snapshot_mgr().batch_acquire_snapshot( @@ -341,16 +366,41 @@ int ObDDLRedefinitionTask::release_snapshot(const int64_t snapshot_version) int ret = OB_SUCCESS; ObRootService *root_service = GCTX.root_service_; ObSEArray tablet_ids; + ObSchemaGetterGuard schema_guard; + const ObTableSchema *data_table_schema = nullptr; + const ObTableSchema *dest_table_schema = nullptr; + ObMultiVersionSchemaService &schema_service = ObMultiVersionSchemaService::get_instance(); if (OB_UNLIKELY(!is_inited_)) { ret = OB_NOT_INIT; LOG_WARN("not init", K(ret)); } else if (OB_ISNULL(root_service)) { ret = OB_ERR_SYS; LOG_WARN("error sys, root service must not be nullptr", K(ret)); + } else if (OB_FAIL(schema_service.get_tenant_schema_guard(tenant_id_, schema_guard))) { + LOG_WARN("get tenant schema guard failed", K(ret)); + } else if (OB_FAIL(schema_guard.get_table_schema(tenant_id_, object_id_, data_table_schema))) { + LOG_WARN("get table schema failed", K(ret), K(object_id_)); + } else if (OB_FAIL(schema_guard.get_table_schema(tenant_id_, target_object_id_, dest_table_schema))) { + LOG_WARN("get table schema failed", K(ret), K(target_object_id_)); + } else if (OB_ISNULL(data_table_schema) || OB_ISNULL(dest_table_schema)) { + ret = OB_TABLE_NOT_EXIST; + LOG_WARN("table not exist", K(ret), K(object_id_), K(target_object_id_), KP(data_table_schema), KP(dest_table_schema)); } else if (OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, object_id_, tablet_ids))) { LOG_WARN("failed to get data table snapshot", K(ret)); } else if (OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, target_object_id_, tablet_ids))) { LOG_WARN("failed to get dest table snapshot", K(ret)); + } else if (data_table_schema->get_aux_lob_meta_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, data_table_schema->get_aux_lob_meta_tid(), tablet_ids))) { + LOG_WARN("failed to get data lob meta table snapshot", K(ret)); + } else if (data_table_schema->get_aux_lob_piece_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, data_table_schema->get_aux_lob_piece_tid(), tablet_ids))) { + LOG_WARN("failed to get data lob piece table snapshot", K(ret)); + } else if (dest_table_schema->get_aux_lob_meta_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, dest_table_schema->get_aux_lob_meta_tid(), tablet_ids))) { + LOG_WARN("failed to get dest lob meta table snapshot", K(ret)); + } else if (dest_table_schema->get_aux_lob_piece_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, dest_table_schema->get_aux_lob_piece_tid(), tablet_ids))) { + LOG_WARN("failed to get dest lob piece table snapshot", K(ret)); } else if (OB_FAIL(batch_release_snapshot(snapshot_version, tablet_ids))) { LOG_WARN("failed to release snapshot", K(ret)); } diff --git a/src/rootserver/ddl_task/ob_index_build_task.cpp b/src/rootserver/ddl_task/ob_index_build_task.cpp index 9d72c6b807..6b19f3ff19 100644 --- a/src/rootserver/ddl_task/ob_index_build_task.cpp +++ b/src/rootserver/ddl_task/ob_index_build_task.cpp @@ -532,10 +532,32 @@ int ObIndexBuildTask::hold_snapshot(const int64_t snapshot) } else { ObDDLService &ddl_service = root_service_->get_ddl_service(); ObSEArray tablet_ids; - if (OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, object_id_, tablet_ids))) { + ObSchemaGetterGuard schema_guard; + const ObTableSchema *data_table_schema = nullptr; + const ObTableSchema *index_table_schema = nullptr; + ObMultiVersionSchemaService &schema_service = ObMultiVersionSchemaService::get_instance(); + bool need_acquire_lob = false; + if (OB_FAIL(schema_service.get_tenant_schema_guard(tenant_id_, schema_guard))) { + LOG_WARN("get tenant schema guard failed", K(ret)); + } else if (OB_FAIL(schema_guard.get_table_schema(tenant_id_, object_id_, data_table_schema))) { + LOG_WARN("get table schema failed", K(ret), K(object_id_)); + } else if (OB_FAIL(schema_guard.get_table_schema(tenant_id_, target_object_id_, index_table_schema))) { + LOG_WARN("get table schema failed", K(ret), K(target_object_id_)); + } else if (OB_ISNULL(data_table_schema) || OB_ISNULL(index_table_schema)) { + ret = OB_TABLE_NOT_EXIST; + LOG_WARN("table not exist", K(ret), K(object_id_), K(target_object_id_), KP(data_table_schema), KP(index_table_schema)); + } else if (OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, object_id_, tablet_ids))) { LOG_WARN("failed to get data table snapshot", K(ret)); } else if (OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, target_object_id_, tablet_ids))) { LOG_WARN("failed to get dest table snapshot", K(ret)); + } else if (OB_FAIL(check_need_acquire_lob_snapshot(data_table_schema, index_table_schema, need_acquire_lob))) { + LOG_WARN("failed to check if need to acquire lob snapshot", K(ret)); + } else if (need_acquire_lob && data_table_schema->get_aux_lob_meta_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, data_table_schema->get_aux_lob_meta_tid(), tablet_ids))) { + LOG_WARN("failed to get data lob meta table snapshot", K(ret)); + } else if (need_acquire_lob && data_table_schema->get_aux_lob_piece_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, data_table_schema->get_aux_lob_piece_tid(), tablet_ids))) { + LOG_WARN("failed to get data lob piece table snapshot", K(ret)); } else if (OB_FAIL(ddl_service.get_snapshot_mgr().batch_acquire_snapshot( ddl_service.get_sql_proxy(), SNAPSHOT_FOR_DDL, tenant_id_, schema_version_, snapshot, nullptr, tablet_ids))) { LOG_WARN("batch acquire snapshot failed", K(ret), K(tablet_ids)); @@ -554,6 +576,9 @@ int ObIndexBuildTask::release_snapshot(const int64_t snapshot) } else { ObDDLService &ddl_service = root_service_->get_ddl_service(); ObSEArray tablet_ids; + ObSchemaGetterGuard schema_guard; + const ObTableSchema *data_table_schema = nullptr; + ObMultiVersionSchemaService &schema_service = ObMultiVersionSchemaService::get_instance(); if (OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, object_id_, tablet_ids))) { if (OB_TABLE_NOT_EXIST == ret) { ret = OB_SUCCESS; @@ -567,6 +592,29 @@ int ObIndexBuildTask::release_snapshot(const int64_t snapshot) LOG_WARN("failed to get dest table snapshot", K(ret)); } } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(schema_service.get_tenant_schema_guard(tenant_id_, schema_guard))) { + LOG_WARN("get tenant schema guard failed", K(ret)); + } else if (OB_FAIL(schema_guard.get_table_schema(tenant_id_, object_id_, data_table_schema))) { + LOG_WARN("get table schema failed", K(ret), K(object_id_)); + } else if (OB_ISNULL(data_table_schema)) { + LOG_INFO("table not exist", K(ret), K(object_id_), K(target_object_id_), KP(data_table_schema)); + } else if (data_table_schema->get_aux_lob_meta_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, data_table_schema->get_aux_lob_meta_tid(), tablet_ids))) { + if (OB_TABLE_NOT_EXIST == ret) { + ret = OB_SUCCESS; + } else { + LOG_WARN("failed to get data lob meta table snapshot", K(ret)); + } + } else if ( data_table_schema->get_aux_lob_piece_tid() != OB_INVALID_ID && + OB_FAIL(ObDDLUtil::get_tablets(tenant_id_, data_table_schema->get_aux_lob_piece_tid(), tablet_ids))) { + if (OB_TABLE_NOT_EXIST == ret) { + ret = OB_SUCCESS; + } else { + LOG_WARN("failed to get data lob piece table snapshot", K(ret)); + } + } + if (OB_SUCC(ret) && tablet_ids.count() > 0 && OB_FAIL(batch_release_snapshot(snapshot, tablet_ids))) { LOG_WARN("batch relase snapshot failed", K(ret), K(tablet_ids)); } @@ -738,6 +786,43 @@ int ObIndexBuildTask::check_need_verify_checksum(bool &need_verify) return ret; } +int ObIndexBuildTask::check_need_acquire_lob_snapshot(const ObTableSchema *data_table_schema, + const ObTableSchema *index_table_schema, + bool &need_acquire) +{ + int ret = OB_SUCCESS; + need_acquire = false; + ObTableSchema::const_column_iterator iter = index_table_schema->column_begin(); + ObTableSchema::const_column_iterator iter_end = index_table_schema->column_end(); + for (; OB_SUCC(ret) && !need_acquire && iter != iter_end; iter++) { + const ObColumnSchemaV2 *index_col = *iter; + if (OB_ISNULL(index_col)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("column schema is null", K(ret)); + } else { + const ObColumnSchemaV2 *col = data_table_schema->get_column_schema(index_col->get_column_id()); + if (OB_ISNULL(col)) { + } else if (col->is_generated_column()) { + ObSEArray ref_columns; + if (OB_FAIL(col->get_cascaded_column_ids(ref_columns))) { + STORAGE_LOG(WARN, "Failed to get cascaded column ids", K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && !need_acquire && i < ref_columns.count(); i++) { + const ObColumnSchemaV2 *data_table_col = data_table_schema->get_column_schema(ref_columns.at(i)); + if (OB_ISNULL(data_table_col)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("column schema is null", K(ret)); + } else if (is_lob_v2(data_table_col->get_data_type())) { + need_acquire = true; + } + } + } + } + } + } + return ret; +} + // verify column checksum between data table and index table int ObIndexBuildTask::verify_checksum() { diff --git a/src/rootserver/ddl_task/ob_index_build_task.h b/src/rootserver/ddl_task/ob_index_build_task.h index 303123da7a..54e44d9eb4 100644 --- a/src/rootserver/ddl_task/ob_index_build_task.h +++ b/src/rootserver/ddl_task/ob_index_build_task.h @@ -123,6 +123,9 @@ private: int send_build_single_replica_request(); int check_build_single_replica(bool &is_end); int check_need_verify_checksum(bool &need_verify); + int check_need_acquire_lob_snapshot(const ObTableSchema *data_table_schema, + const ObTableSchema *index_table_schema, + bool &need_acquire); private: static const int64_t OB_INDEX_BUILD_TASK_VERSION = 1; using ObDDLTask::is_inited_; diff --git a/src/sql/engine/expr/ob_expr_to_outfile_row.cpp b/src/sql/engine/expr/ob_expr_to_outfile_row.cpp index efd4aca4e2..c82cdbd087 100644 --- a/src/sql/engine/expr/ob_expr_to_outfile_row.cpp +++ b/src/sql/engine/expr/ob_expr_to_outfile_row.cpp @@ -187,9 +187,9 @@ int ObExprToOutfileRow::to_outfile_str(const ObExpr &expr, ObEvalCtx &ctx, ObDat } } OZ(out_info->line_.print_plain_str_literal(buf, buf_len, pos, out_info->print_params_)); - if (OB_SUCC(ret)) { - char *res_buf = NULL; - if (OB_ISNULL(res_buf = expr.get_str_res_mem(ctx, pos))) { + if (OB_SUCC(ret)) { + char *res_buf = NULL; + if (OB_ISNULL(res_buf = expr.get_str_res_mem(ctx, pos))) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("allocate memory failed", K(ret), K(pos)); } else { -- GitLab