From 756d7b76a7808764bf9f9bfd60f11a3e37e935f0 Mon Sep 17 00:00:00 2001 From: meiyi Date: Wed, 2 Sep 2026 11:14:22 +0800 Subject: [PATCH] [fix](fe) Return transaction insert execution errors ### What problem does this PR solve? Issue Number: None Related PR: None Problem Summary: Transaction INSERT execution failures raised directly while dispatching fragments bypass ErrorReport. OlapTxnInsertExecutor catches these failures and aborts the subtransaction, but previously left QueryState successful, causing the client to receive Query OK. In cloud mode, abortSubTxn also populated AbortSubTxnRequest.sub_txn_num with the subtransaction ID instead of the subtransaction count, causing meta-service cleanup to reject the request. Set the INSERT error state using the same final error formatting as other insert executors, and pass the correct subtransaction count during cloud cleanup. Add regression coverage using the BE FragmentMgr.exec_plan_fragment.failed debug point and verify the transaction can still commit after the failed statement. ### Release note Transaction INSERT execution failures are now returned to clients instead of reporting success. ### Check List (For Author) - Test: Regression test added; not run per request - Behavior changed: Yes, transaction INSERT execution failures are returned to the client and cloud cleanup uses the correct subtransaction count - Does this need documentation: No --- .../CloudGlobalTransactionMgr.java | 2 +- .../insert/OlapGroupCommitInsertExecutor.java | 17 +-------- .../commands/insert/OlapInsertExecutor.java | 6 +++- .../insert/OlapTxnInsertExecutor.java | 1 + .../insert/RemoteOlapInsertExecutor.java | 19 +--------- .../transaction/txn_insert_inject_case.groovy | 35 +++++++++++++------ 6 files changed, 34 insertions(+), 46 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/cloud/transaction/CloudGlobalTransactionMgr.java b/fe/fe-core/src/main/java/org/apache/doris/cloud/transaction/CloudGlobalTransactionMgr.java index d0b97593ceca53..fa2fd8bcf08257 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/cloud/transaction/CloudGlobalTransactionMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/cloud/transaction/CloudGlobalTransactionMgr.java @@ -2777,7 +2777,7 @@ public TransactionState abortSubTxn(long txnId, long subTxnId, long dbId, Set + def enableDebugPoint = { debugPoint -> ipList.each { beid, ip -> - DebugPoint.enableDebugPoint(ip, portList[beid] as int, NodeType.BE, "FlushToken.submit_flush_error") + DebugPoint.enableDebugPoint(ip, portList[beid] as int, NodeType.BE, debugPoint) } } - def disableDebugPoint = { -> + def disableDebugPoint = { debugPoint -> ipList.each { beid, ip -> - DebugPoint.disableDebugPoint(ip, portList[beid] as int, NodeType.BE, "FlushToken.submit_flush_error") + DebugPoint.disableDebugPoint(ip, portList[beid] as int, NodeType.BE, debugPoint) } } try { - enableDebugPoint() + enableDebugPoint("FlushToken.submit_flush_error") sql """ begin """ try { sql """ insert into ${table}_0 select * from ${table}_1; """ @@ -78,10 +79,10 @@ suite("txn_insert_inject_case", "nonConcurrent") { assertTrue(e.getMessage().contains("dbug_be_memtable_submit_flush_error")) } - disableDebugPoint() + disableDebugPoint("FlushToken.submit_flush_error") sql """ insert into ${table}_0 select * from ${table}_1; """ - enableDebugPoint() + enableDebugPoint("FlushToken.submit_flush_error") try { sql """ insert into ${table}_0 select * from ${table}_1; """ assertTrue(false, "insert should fail") @@ -90,16 +91,30 @@ suite("txn_insert_inject_case", "nonConcurrent") { assertTrue(e.getMessage().contains("dbug_be_memtable_submit_flush_error")) } - disableDebugPoint() - sql """ insert into ${table}_0 select * from ${table}_1; """ + disableDebugPoint("FlushToken.submit_flush_error") sql """ commit""" } catch (Exception e) { logger.error("failed", e) } finally { sql """ rollback """ - disableDebugPoint() + disableDebugPoint("FlushToken.submit_flush_error") GetDebugPoint().disableDebugPointForAllBEs("FlushToken.submit_flush_error") } + + try { + enableDebugPoint("FragmentMgr.exec_plan_fragment.failed") + sql """ begin """ + test { + sql """ insert into ${table}_0 select * from ${table}_1; """ + exception "FragmentMgr.exec_plan_fragment.failed" + } + disableDebugPoint("FragmentMgr.exec_plan_fragment.failed") + sql """ insert into ${table}_0 select * from ${table}_1; """ + sql """ commit """ + } finally { + sql """ rollback """ + disableDebugPoint("FragmentMgr.exec_plan_fragment.failed") + } sql "sync" order_qt_select1 """select * from ${table}_0"""