From 096dd0f4c91d59d67a294255dcd3179bc781870f Mon Sep 17 00:00:00 2001 From: meiyi Date: Wed, 2 Sep 2026 18:41:20 +0800 Subject: [PATCH] [fix](fe) Return transaction insert execution errors (#67386) 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. Set the INSERT error state when no earlier error exists so the failure reaches the client while preserving errors already reported by ErrorReport. --- .../CloudGlobalTransactionMgr.java | 2 +- .../insert/OlapGroupCommitInsertExecutor.java | 17 +-------- .../commands/insert/OlapInsertExecutor.java | 6 +++- .../insert/OlapTxnInsertExecutor.java | 1 + .../transaction/txn_insert_inject_case.groovy | 35 +++++++++++++------ 5 files changed, 33 insertions(+), 28 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 df0e193b0e4eae..1c49b3c11b2447 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 @@ -2681,7 +2681,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"""