This is an automated email from the ASF dual-hosted git repository.
liaoxin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 9443e31683e [opt](load) disable enable_strict_consistency_dml by
default in cloud mode (#61814)
9443e31683e is described below
commit 9443e31683ea5a206bd3fad8a9535601fd8b1ee9
Author: hui lai <[email protected]>
AuthorDate: Mon Mar 30 16:47:59 2026 +0800
[opt](load) disable enable_strict_consistency_dml by default in cloud mode
(#61814)
## Problem
`enable_strict_consistency_dml` is designed to handle multi-replica
consistency for DML
operations. In cloud mode (store-compute separation), data has only a
single copy, so
there is no multi-replica consistency concern. Keeping this variable
`true` in cloud mode
causes unnecessary data shuffling overhead.
## Solution
Override `isEnableStrictConsistencyDml()` to return `false` when running
in cloud mode
(`Config.isCloudMode()`), regardless of the session variable's value.
This follows the
same pattern as `isDisableFileCache()`.
Update all call sites in `RequestPropertyDeriver` to use the getter
instead of direct
field access so the cloud-mode check takes effect.
## Tests
Added two unit tests in `SessionVariablesTest`:
- Verify `isEnableStrictConsistencyDml()` returns `false` in cloud mode
(even when field is `true`)
- Verify `isEnableStrictConsistencyDml()` follows the field value in
non-cloud mode
---
.../nereids/properties/RequestPropertyDeriver.java | 8 ++---
.../java/org/apache/doris/qe/SessionVariable.java | 5 +++
.../org/apache/doris/qe/SessionVariablesTest.java | 36 ++++++++++++++++++++++
.../insert_p0/test_insert_tablet_sink.groovy | 10 ++++--
4 files changed, 52 insertions(+), 7 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java
index eb13293b932..acdbb2dbac2 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/RequestPropertyDeriver.java
@@ -148,7 +148,7 @@ public class RequestPropertyDeriver extends
PlanVisitor<Void, PlanContext> {
@Override
public Void visitPhysicalOlapTableSink(PhysicalOlapTableSink<? extends
Plan> olapTableSink, PlanContext context) {
- if (connectContext != null &&
!connectContext.getSessionVariable().enableStrictConsistencyDml) {
+ if (connectContext != null &&
!connectContext.getSessionVariable().isEnableStrictConsistencyDml()) {
addRequestPropertyToChildren(PhysicalProperties.ANY);
} else {
addRequestPropertyToChildren(olapTableSink.getRequirePhysicalProperties());
@@ -158,7 +158,7 @@ public class RequestPropertyDeriver extends
PlanVisitor<Void, PlanContext> {
@Override
public Void visitPhysicalHiveTableSink(PhysicalHiveTableSink<? extends
Plan> hiveTableSink, PlanContext context) {
- if (connectContext != null &&
!connectContext.getSessionVariable().enableStrictConsistencyDml) {
+ if (connectContext != null &&
!connectContext.getSessionVariable().isEnableStrictConsistencyDml()) {
addRequestPropertyToChildren(PhysicalProperties.ANY);
} else {
addRequestPropertyToChildren(hiveTableSink.getRequirePhysicalProperties());
@@ -169,7 +169,7 @@ public class RequestPropertyDeriver extends
PlanVisitor<Void, PlanContext> {
@Override
public Void visitPhysicalIcebergTableSink(
PhysicalIcebergTableSink<? extends Plan> icebergTableSink,
PlanContext context) {
- if (connectContext != null &&
!connectContext.getSessionVariable().enableStrictConsistencyDml) {
+ if (connectContext != null &&
!connectContext.getSessionVariable().isEnableStrictConsistencyDml()) {
addRequestPropertyToChildren(PhysicalProperties.ANY);
} else {
addRequestPropertyToChildren(icebergTableSink.getRequirePhysicalProperties());
@@ -180,7 +180,7 @@ public class RequestPropertyDeriver extends
PlanVisitor<Void, PlanContext> {
@Override
public Void visitPhysicalMaxComputeTableSink(
PhysicalMaxComputeTableSink<? extends Plan> mcTableSink,
PlanContext context) {
- if (connectContext != null &&
!connectContext.getSessionVariable().enableStrictConsistencyDml) {
+ if (connectContext != null &&
!connectContext.getSessionVariable().isEnableStrictConsistencyDml()) {
addRequestPropertyToChildren(PhysicalProperties.ANY);
} else {
addRequestPropertyToChildren(mcTableSink.getRequirePhysicalProperties());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
index 13d269f4a68..f5c80600178 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
@@ -5779,6 +5779,11 @@ public class SessionVariable implements Serializable,
Writable {
}
public boolean isEnableStrictConsistencyDml() {
+ // In cloud mode (store-compute separation), there is only a single
copy of data,
+ // so multi-replica consistency is not a concern. Default to false.
+ if (Config.isCloudMode()) {
+ return false;
+ }
return this.enableStrictConsistencyDml;
}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/qe/SessionVariablesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/qe/SessionVariablesTest.java
index 4b3c307e818..25fd823abb3 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/qe/SessionVariablesTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/qe/SessionVariablesTest.java
@@ -17,10 +17,13 @@
package org.apache.doris.qe;
+import org.apache.doris.common.Config;
import org.apache.doris.common.FeConstants;
import org.apache.doris.nereids.parser.NereidsParser;
import org.apache.doris.utframe.TestWithFeService;
+import mockit.Mock;
+import mockit.MockUp;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -136,4 +139,37 @@ public class SessionVariablesTest extends
TestWithFeService {
Assertions.assertTrue(sv.isMorValuePredicatePushdownEnabled("db1",
"tbl1"));
Assertions.assertFalse(sv.isMorValuePredicatePushdownEnabled("db2",
"tbl1"));
}
+
+ @Test
+ public void testEnableStrictConsistencyDmlDefaultsToFalseInCloudMode() {
+ new MockUp<Config>() {
+ @Mock
+ public boolean isCloudMode() {
+ return true;
+ }
+ };
+ SessionVariable sv = new SessionVariable();
+ // In cloud mode, enable_strict_consistency_dml should always return
false
+ // because store-compute separation has no multi-replica consistency
concern.
+ Assertions.assertFalse(sv.isEnableStrictConsistencyDml());
+ // Even if the field is set to true, cloud mode overrides it.
+ sv.enableStrictConsistencyDml = true;
+ Assertions.assertFalse(sv.isEnableStrictConsistencyDml());
+ }
+
+ @Test
+ public void testEnableStrictConsistencyDmlDefaultsTrueInNonCloudMode() {
+ new MockUp<Config>() {
+ @Mock
+ public boolean isCloudMode() {
+ return false;
+ }
+ };
+ SessionVariable sv = new SessionVariable();
+ // In non-cloud mode, default is true (multi-replica consistency is
needed).
+ Assertions.assertTrue(sv.isEnableStrictConsistencyDml());
+ // Users can disable it.
+ sv.enableStrictConsistencyDml = false;
+ Assertions.assertFalse(sv.isEnableStrictConsistencyDml());
+ }
}
diff --git a/regression-test/suites/insert_p0/test_insert_tablet_sink.groovy
b/regression-test/suites/insert_p0/test_insert_tablet_sink.groovy
index 009175ae805..7bf79f3a7a5 100644
--- a/regression-test/suites/insert_p0/test_insert_tablet_sink.groovy
+++ b/regression-test/suites/insert_p0/test_insert_tablet_sink.groovy
@@ -60,9 +60,13 @@ suite("test_insert_tablet_sink") {
sql """ insert into table_largeint select k1,c_varchar,cast(rand() *
50000000 as bigint) from tmp_varchar where k1>=3; """
- explain {
- sql "insert into table_largeint select k1,c_varchar,cast(rand() *
50000000 as bigint) from tmp_varchar;"
- contains "OLAP_TABLE_SINK_HASH_PARTITIONED"
+ // In cloud mode (store-compute separation), enable_strict_consistency_dml
defaults to false,
+ // so no hash-partitioned sink is required for multi-replica consistency.
+ if (!isCloudMode()) {
+ explain {
+ sql "insert into table_largeint select k1,c_varchar,cast(rand() *
50000000 as bigint) from tmp_varchar;"
+ contains "OLAP_TABLE_SINK_HASH_PARTITIONED"
+ }
}
sql """ insert into table_largeint select k1,c_varchar,cast(rand() *
50000000 as bigint) from tmp_varchar; """
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]