This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-1.2-lts by this push:
new 7c58c966f0 [cherry-pick](session-variable)add a use_fix_replica
session variable to fix query replica (#17217)
7c58c966f0 is described below
commit 7c58c966f0737caa78567d45e537d3280c7dd766
Author: WenYao <[email protected]>
AuthorDate: Tue Feb 28 11:30:36 2023 +0800
[cherry-pick](session-variable)add a use_fix_replica session variable to
fix query replica (#17217)
cherry-pick #17101
---
docs/en/docs/advanced/variables.md | 4 ++++
docs/zh-CN/docs/advanced/variables.md | 4 ++++
.../src/main/java/org/apache/doris/catalog/Replica.java | 17 +++++++++++++++++
.../java/org/apache/doris/planner/OlapScanNode.java | 15 ++++++++++++++-
.../main/java/org/apache/doris/qe/SessionVariable.java | 7 +++++++
5 files changed, 46 insertions(+), 1 deletion(-)
diff --git a/docs/en/docs/advanced/variables.md
b/docs/en/docs/advanced/variables.md
index d59b959f75..5cff9cda93 100644
--- a/docs/en/docs/advanced/variables.md
+++ b/docs/en/docs/advanced/variables.md
@@ -565,3 +565,7 @@ Translated with www.DeepL.com/Translator (free version)
* `group_by_and_having_use_alias_first`
Specifies whether group by and having clauses use column aliases rather
than searching for column name in From clause. The default value is false.
+
+* `use_fix_replica`
+
+ Use a fixed replica to query. If use_fix_replica is 1, the smallest one is
used, if use_fix_replica is 2, the second smallest one is used, and so on. The
default value is -1, which means it is not enabled.
diff --git a/docs/zh-CN/docs/advanced/variables.md
b/docs/zh-CN/docs/advanced/variables.md
index a314e63b93..2699d51163 100644
--- a/docs/zh-CN/docs/advanced/variables.md
+++ b/docs/zh-CN/docs/advanced/variables.md
@@ -553,3 +553,7 @@ SELECT /*+ SET_VAR(query_timeout = 1,
enable_partition_cache=true) */ sleep(3);
* `group_by_and_having_use_alias_first`
指定group by和having语句是否优先使用列的别名,而非从From语句里寻找列的名字。默认为false。
+
+* `use_fix_replica`
+
+ 使用固定的replica进行查询,该值表示固定使用第几小的replica,默认为-1表示不启用。
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java
index b65eb91486..da845d2cd6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java
@@ -35,6 +35,7 @@ import java.util.Comparator;
public class Replica implements Writable {
private static final Logger LOG = LogManager.getLogger(Replica.class);
public static final VersionComparator<Replica> VERSION_DESC_COMPARATOR =
new VersionComparator<Replica>();
+ public static final IdComparator<Replica> ID_COMPARATOR = new
IdComparator<Replica>();
public enum ReplicaState {
NORMAL,
@@ -527,6 +528,22 @@ public class Replica implements Writable {
}
}
+ private static class IdComparator<T extends Replica> implements
Comparator<T> {
+ public IdComparator() {
+ }
+
+ @Override
+ public int compare(T replica1, T replica2) {
+ if (replica1.getId() < replica2.getId()) {
+ return -1;
+ } else if (replica1.getId() == replica2.getId()) {
+ return 0;
+ } else {
+ return 1;
+ }
+ }
+ }
+
public void setWatermarkTxnId(long watermarkTxnId) {
this.watermarkTxnId = watermarkTxnId;
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
index 4cf8e1354c..14577c1967 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
@@ -654,7 +654,20 @@ public class OlapScanNode extends ScanNode {
throw new UserException("Failed to get scan range, no
queryable replica found in tablet: " + tabletId);
}
- Collections.shuffle(replicas);
+ int useFixReplica = -1;
+ if (ConnectContext.get() != null) {
+ useFixReplica =
ConnectContext.get().getSessionVariable().useFixReplica;
+ }
+ if (useFixReplica == -1) {
+ Collections.shuffle(replicas);
+ } else {
+ LOG.debug("use fix replica, value: {}, replica num: {}",
useFixReplica, replicas.size());
+ // sort by replica id
+ replicas.sort(Replica.ID_COMPARATOR);
+ Replica replica = replicas.get(useFixReplica >=
replicas.size() ? replicas.size() - 1 : useFixReplica);
+ replicas.clear();
+ replicas.add(replica);
+ }
boolean tabletIsNull = true;
boolean collectedStat = false;
List<String> errs = Lists.newArrayList();
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 5226911e5d..cb07e4d6e8 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
@@ -255,6 +255,9 @@ public class SessionVariable implements Serializable,
Writable {
public static final String GROUP_BY_AND_HAVING_USE_ALIAS_FIRST =
"group_by_and_having_use_alias_first";
+ // fix replica to query. If num = 1, query the smallest replica, if 2 is
the second smallest replica.
+ public static final String USE_FIX_REPLICA = "use_fix_replica";
+
// session origin value
public Map<Field, String> sessionOriginValue = new HashMap<Field,
String>();
// check stmt is or not [select /*+ SET_VAR(...)*/ ...]
@@ -669,6 +672,10 @@ public class SessionVariable implements Serializable,
Writable {
@VariableMgr.VarAttr(name = GROUP_BY_AND_HAVING_USE_ALIAS_FIRST)
public boolean groupByAndHavingUseAliasFirst = false;
+ // Default value is -1, which means not fix replica
+ @VariableMgr.VarAttr(name = USE_FIX_REPLICA)
+ public int useFixReplica = -1;
+
// If this fe is in fuzzy mode, then will use initFuzzyModeVariables to
generate some variables,
// not the default value set in the code.
public void initFuzzyModeVariables() {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]