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]

Reply via email to