Fix missing checksum after ddl major generated
This commit is contained in:
@ -225,14 +225,14 @@ int ObComplementDataContext::init(const ObComplementDataParam ¶m, const ObDa
|
|||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
void *builder_buf = nullptr;
|
void *builder_buf = nullptr;
|
||||||
const ObSSTable *latest_major_sstable = nullptr;
|
const ObSSTable *first_major_sstable = nullptr;
|
||||||
if (OB_UNLIKELY(is_inited_)) {
|
if (OB_UNLIKELY(is_inited_)) {
|
||||||
ret = OB_INIT_TWICE;
|
ret = OB_INIT_TWICE;
|
||||||
LOG_WARN("ObComplementDataContext has already been inited", K(ret));
|
LOG_WARN("ObComplementDataContext has already been inited", K(ret));
|
||||||
} else if (OB_UNLIKELY(!param.is_valid() || !desc.is_valid())) {
|
} else if (OB_UNLIKELY(!param.is_valid() || !desc.is_valid())) {
|
||||||
ret = OB_INVALID_ARGUMENT;
|
ret = OB_INVALID_ARGUMENT;
|
||||||
LOG_WARN("invalid arguments", K(ret), K(param), K(desc));
|
LOG_WARN("invalid arguments", K(ret), K(param), K(desc));
|
||||||
} else if (OB_FAIL(ObTabletDDLUtil::check_and_get_major_sstable(param.ls_id_, param.dest_tablet_id_, latest_major_sstable))) {
|
} else if (OB_FAIL(ObTabletDDLUtil::check_and_get_major_sstable(param.ls_id_, param.dest_tablet_id_, first_major_sstable))) {
|
||||||
LOG_WARN("check if major sstable exist failed", K(ret), K(param));
|
LOG_WARN("check if major sstable exist failed", K(ret), K(param));
|
||||||
} else if (OB_FAIL(data_sstable_redo_writer_.init(param.ls_id_,
|
} else if (OB_FAIL(data_sstable_redo_writer_.init(param.ls_id_,
|
||||||
param.dest_tablet_id_))) {
|
param.dest_tablet_id_))) {
|
||||||
@ -250,7 +250,7 @@ int ObComplementDataContext::init(const ObComplementDataParam ¶m, const ObDa
|
|||||||
ObSSTableIndexBuilder::DISABLE))) {
|
ObSSTableIndexBuilder::DISABLE))) {
|
||||||
LOG_WARN("failed to init index builder", K(ret), K(desc));
|
LOG_WARN("failed to init index builder", K(ret), K(desc));
|
||||||
} else {
|
} else {
|
||||||
is_major_sstable_exist_ = nullptr != latest_major_sstable ? true : false;
|
is_major_sstable_exist_ = nullptr != first_major_sstable ? true : false;
|
||||||
concurrent_cnt_ = param.concurrent_cnt_;
|
concurrent_cnt_ = param.concurrent_cnt_;
|
||||||
is_inited_ = true;
|
is_inited_ = true;
|
||||||
}
|
}
|
||||||
@ -1204,10 +1204,10 @@ int ObComplementMergeTask::process()
|
|||||||
} else if (OB_FAIL(guard.switch_to(param_->tenant_id_))) {
|
} else if (OB_FAIL(guard.switch_to(param_->tenant_id_))) {
|
||||||
LOG_WARN("switch to tenant failed", K(ret), K(param_->tenant_id_));
|
LOG_WARN("switch to tenant failed", K(ret), K(param_->tenant_id_));
|
||||||
} else if (context_->is_major_sstable_exist_) {
|
} else if (context_->is_major_sstable_exist_) {
|
||||||
const ObSSTable *latest_major_sstable = nullptr;
|
const ObSSTable *first_major_sstable = nullptr;
|
||||||
if (OB_FAIL(ObTabletDDLUtil::check_and_get_major_sstable(param_->ls_id_, param_->dest_tablet_id_, latest_major_sstable))) {
|
if (OB_FAIL(ObTabletDDLUtil::check_and_get_major_sstable(param_->ls_id_, param_->dest_tablet_id_, first_major_sstable))) {
|
||||||
LOG_WARN("check if major sstable exist failed", K(ret), K(*param_));
|
LOG_WARN("check if major sstable exist failed", K(ret), K(*param_));
|
||||||
} else if (OB_ISNULL(latest_major_sstable)) {
|
} else if (OB_ISNULL(first_major_sstable)) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("unexpected error, major sstable shoud not be null", K(ret), K(*param_));
|
LOG_WARN("unexpected error, major sstable shoud not be null", K(ret), K(*param_));
|
||||||
} else if (OB_FAIL(ObTabletDDLUtil::report_ddl_checksum(param_->ls_id_,
|
} else if (OB_FAIL(ObTabletDDLUtil::report_ddl_checksum(param_->ls_id_,
|
||||||
@ -1215,7 +1215,7 @@ int ObComplementMergeTask::process()
|
|||||||
param_->dest_table_id_,
|
param_->dest_table_id_,
|
||||||
1 /* execution_id */,
|
1 /* execution_id */,
|
||||||
param_->task_id_,
|
param_->task_id_,
|
||||||
latest_major_sstable->get_meta().get_col_checksum()))) {
|
first_major_sstable->get_meta().get_col_checksum()))) {
|
||||||
LOG_WARN("report ddl column checksum failed", K(ret), K(*param_));
|
LOG_WARN("report ddl column checksum failed", K(ret), K(*param_));
|
||||||
} else if (OB_FAIL(GCTX.ob_service_->submit_tablet_update_task(param_->tenant_id_, param_->ls_id_, param_->dest_tablet_id_))) {
|
} else if (OB_FAIL(GCTX.ob_service_->submit_tablet_update_task(param_->tenant_id_, param_->ls_id_, param_->dest_tablet_id_))) {
|
||||||
LOG_WARN("fail to submit tablet update task", K(ret), K(*param_));
|
LOG_WARN("fail to submit tablet update task", K(ret), K(*param_));
|
||||||
|
|||||||
@ -363,10 +363,10 @@ int ObDDLTableMergeTask::process()
|
|||||||
ObTabletDDLParam ddl_param;
|
ObTabletDDLParam ddl_param;
|
||||||
ObTableHandleV2 table_handle;
|
ObTableHandleV2 table_handle;
|
||||||
bool is_data_complete = false;
|
bool is_data_complete = false;
|
||||||
const ObSSTable *latest_major_sstable = nullptr;
|
const ObSSTable *first_major_sstable = nullptr;
|
||||||
if (OB_FAIL(ObTabletDDLUtil::check_and_get_major_sstable(merge_param_.ls_id_, merge_param_.tablet_id_, latest_major_sstable))) {
|
if (OB_FAIL(ObTabletDDLUtil::check_and_get_major_sstable(merge_param_.ls_id_, merge_param_.tablet_id_, first_major_sstable))) {
|
||||||
LOG_WARN("check if major sstable exist failed", K(ret));
|
LOG_WARN("check if major sstable exist failed", K(ret));
|
||||||
} else if (nullptr != latest_major_sstable) {
|
} else if (nullptr != first_major_sstable) {
|
||||||
LOG_INFO("major sstable has been created before", K(merge_param_), K(ddl_param.table_key_));
|
LOG_INFO("major sstable has been created before", K(merge_param_), K(ddl_param.table_key_));
|
||||||
sstable = static_cast<ObSSTable *>(tablet_handle.get_obj()->get_table_store().get_major_sstables().get_boundary_table(false/*first*/));
|
sstable = static_cast<ObSSTable *>(tablet_handle.get_obj()->get_table_store().get_major_sstables().get_boundary_table(false/*first*/));
|
||||||
} else if (tablet_handle.get_obj()->get_tablet_meta().table_store_flag_.with_major_sstable()) {
|
} else if (tablet_handle.get_obj()->get_tablet_meta().table_store_flag_.with_major_sstable()) {
|
||||||
@ -404,15 +404,6 @@ int ObDDLTableMergeTask::process()
|
|||||||
} else if (OB_ISNULL(sstable)) {
|
} else if (OB_ISNULL(sstable)) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("ddl major sstable is null", K(ret), K(ddl_param));
|
LOG_WARN("ddl major sstable is null", K(ret), K(ddl_param));
|
||||||
} else if (merge_param_.table_id_ > 0
|
|
||||||
&& merge_param_.execution_id_ >= 0
|
|
||||||
&& OB_FAIL(ObTabletDDLUtil::report_ddl_checksum(merge_param_.ls_id_,
|
|
||||||
merge_param_.tablet_id_,
|
|
||||||
merge_param_.table_id_,
|
|
||||||
merge_param_.execution_id_,
|
|
||||||
merge_param_.ddl_task_id_,
|
|
||||||
sstable->get_meta().get_col_checksum()))) {
|
|
||||||
LOG_WARN("report ddl column checksum failed", K(ret), K(merge_param_));
|
|
||||||
} else if (OB_FAIL(GCTX.ob_service_->submit_tablet_update_task(tenant_id, merge_param_.ls_id_, merge_param_.tablet_id_))) {
|
} else if (OB_FAIL(GCTX.ob_service_->submit_tablet_update_task(tenant_id, merge_param_.ls_id_, merge_param_.tablet_id_))) {
|
||||||
LOG_WARN("fail to submit tablet update task", K(ret), K(tenant_id), K(merge_param_));
|
LOG_WARN("fail to submit tablet update task", K(ret), K(tenant_id), K(merge_param_));
|
||||||
}
|
}
|
||||||
@ -971,12 +962,12 @@ int ObTabletDDLUtil::report_ddl_checksum(const share::ObLSID &ls_id,
|
|||||||
|
|
||||||
int ObTabletDDLUtil::check_and_get_major_sstable(const share::ObLSID &ls_id,
|
int ObTabletDDLUtil::check_and_get_major_sstable(const share::ObLSID &ls_id,
|
||||||
const ObTabletID &tablet_id,
|
const ObTabletID &tablet_id,
|
||||||
const ObSSTable *&latest_major_sstable)
|
const ObSSTable *&first_major_sstable)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
ObLSHandle ls_handle;
|
ObLSHandle ls_handle;
|
||||||
ObTabletHandle tablet_handle;
|
ObTabletHandle tablet_handle;
|
||||||
latest_major_sstable = nullptr;
|
first_major_sstable = nullptr;
|
||||||
if (OB_UNLIKELY(!ls_id.is_valid() || !tablet_id.is_valid())) {
|
if (OB_UNLIKELY(!ls_id.is_valid() || !tablet_id.is_valid())) {
|
||||||
ret = OB_INVALID_ARGUMENT;
|
ret = OB_INVALID_ARGUMENT;
|
||||||
LOG_WARN("invalid argument", K(ret), K(ls_id), K(tablet_id));
|
LOG_WARN("invalid argument", K(ret), K(ls_id), K(tablet_id));
|
||||||
@ -991,8 +982,8 @@ int ObTabletDDLUtil::check_and_get_major_sstable(const share::ObLSID &ls_id,
|
|||||||
ret = OB_ERR_SYS;
|
ret = OB_ERR_SYS;
|
||||||
LOG_WARN("tablet handle is null", K(ret), K(ls_id), K(tablet_id));
|
LOG_WARN("tablet handle is null", K(ret), K(ls_id), K(tablet_id));
|
||||||
} else {
|
} else {
|
||||||
latest_major_sstable = static_cast<ObSSTable *>(
|
first_major_sstable = static_cast<ObSSTable *>(
|
||||||
tablet_handle.get_obj()->get_table_store().get_major_sstables().get_boundary_table(true/*last*/));
|
tablet_handle.get_obj()->get_table_store().get_major_sstables().get_boundary_table(false/*first*/));
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -182,7 +182,7 @@ public:
|
|||||||
const ObIArray<int64_t> &column_checksums);
|
const ObIArray<int64_t> &column_checksums);
|
||||||
static int check_and_get_major_sstable(const share::ObLSID &ls_id,
|
static int check_and_get_major_sstable(const share::ObLSID &ls_id,
|
||||||
const ObTabletID &tablet_id,
|
const ObTabletID &tablet_id,
|
||||||
const blocksstable::ObSSTable *&latest_major_sstable);
|
const blocksstable::ObSSTable *&first_major_sstable);
|
||||||
|
|
||||||
static int check_data_integrity(const ObTablesHandleArray &ddl_sstables,
|
static int check_data_integrity(const ObTablesHandleArray &ddl_sstables,
|
||||||
const share::SCN &start_scn,
|
const share::SCN &start_scn,
|
||||||
|
|||||||
@ -23,6 +23,7 @@
|
|||||||
#include "storage/ls/ob_ls.h"
|
#include "storage/ls/ob_ls.h"
|
||||||
#include "storage/tx_storage/ob_ls_service.h"
|
#include "storage/tx_storage/ob_ls_service.h"
|
||||||
#include "storage/tx/ob_ts_mgr.h"
|
#include "storage/tx/ob_ts_mgr.h"
|
||||||
|
#include "storage/ddl/ob_ddl_merge_task.h"
|
||||||
#include "storage/ddl/ob_tablet_ddl_kv_mgr.h"
|
#include "storage/ddl/ob_tablet_ddl_kv_mgr.h"
|
||||||
#include "storage/blocksstable/ob_logic_macro_id.h"
|
#include "storage/blocksstable/ob_logic_macro_id.h"
|
||||||
#include "observer/ob_server_event_history_table_operator.h"
|
#include "observer/ob_server_event_history_table_operator.h"
|
||||||
@ -1202,6 +1203,31 @@ int ObDDLSSTableRedoWriter::end_ddl_redo_and_create_ddl_sstable(
|
|||||||
} else {
|
} else {
|
||||||
LOG_WARN("failed to wait ddl merge", K(ret), K(ddl_start_scn));
|
LOG_WARN("failed to wait ddl merge", K(ret), K(ddl_start_scn));
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
const ObSSTable *first_major_sstable = nullptr;
|
||||||
|
if (OB_FAIL(ObTabletDDLUtil::check_and_get_major_sstable(ls_id, tablet_id, first_major_sstable))) {
|
||||||
|
LOG_WARN("failed to get first major sstable", K(ret), K(ls_id), K(tablet_id));
|
||||||
|
} else if (OB_ISNULL(first_major_sstable)) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("no major after wait merge success", K(ret), K(ls_id), K(tablet_id));
|
||||||
|
} else if (OB_UNLIKELY(first_major_sstable->get_key() != table_key)) {
|
||||||
|
ret = OB_SNAPSHOT_DISCARDED;
|
||||||
|
LOG_WARN("ddl major sstable dropped, snapshot holding may have bug", K(ret), KPC(first_major_sstable), K(table_key), K(tablet_id), K(execution_id), K(ddl_task_id));
|
||||||
|
} else {
|
||||||
|
for (int64_t retry_cnt = 10; retry_cnt > 0; retry_cnt--) { // overwrite ret
|
||||||
|
if (OB_FAIL(ObTabletDDLUtil::report_ddl_checksum(ls_id,
|
||||||
|
tablet_id,
|
||||||
|
table_id,
|
||||||
|
execution_id,
|
||||||
|
ddl_task_id,
|
||||||
|
first_major_sstable->get_meta().get_col_checksum()))) {
|
||||||
|
LOG_WARN("report ddl column checksum failed", K(ret), K(ls_id), K(tablet_id), K(execution_id), K(ddl_task_id));
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ob_usleep(100L * 1000L);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user