This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.2
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.2 by this push:
     new da70e9097f Fix alibaba AbstractLoadBalance compact (#12394)
da70e9097f is described below

commit da70e9097f8c4c796f4f3546f8f1e4699e9880b1
Author: Albumen Kevin <[email protected]>
AuthorDate: Wed May 24 20:19:25 2023 +0800

    Fix alibaba AbstractLoadBalance compact (#12394)
---
 .../cluster/loadbalance/AbstractLoadBalance.java   | 41 +++++++++++++++++++++-
 1 file changed, 40 insertions(+), 1 deletion(-)

diff --git 
a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/cluster/loadbalance/AbstractLoadBalance.java
 
b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/cluster/loadbalance/AbstractLoadBalance.java
index 3ec1c78522..f4aa339403 100644
--- 
a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/cluster/loadbalance/AbstractLoadBalance.java
+++ 
b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/cluster/loadbalance/AbstractLoadBalance.java
@@ -17,6 +17,45 @@
 
 package com.alibaba.dubbo.rpc.cluster.loadbalance;
 
+import com.alibaba.dubbo.common.Constants;
+import com.alibaba.dubbo.common.URL;
+import com.alibaba.dubbo.rpc.Invocation;
+import com.alibaba.dubbo.rpc.Invoker;
+import com.alibaba.dubbo.rpc.cluster.LoadBalance;
+
+import java.util.List;
+
 @Deprecated
-public abstract class AbstractLoadBalance extends 
org.apache.dubbo.rpc.cluster.loadbalance.AbstractLoadBalance {
+public abstract class AbstractLoadBalance extends 
org.apache.dubbo.rpc.cluster.loadbalance.AbstractLoadBalance implements 
LoadBalance {
+
+    @Override
+    public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, 
Invocation invocation) {
+        if (invokers == null || invokers.size() == 0)
+            return null;
+        if (invokers.size() == 1)
+            return invokers.get(0);
+        return doSelect(invokers, url, invocation);
+    }
+
+    protected abstract <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL 
url, Invocation invocation);
+
+    protected int getWeight(Invoker<?> invoker, Invocation invocation) {
+        int weight = 
invoker.getUrl().getMethodParameter(invocation.getMethodName(), 
Constants.WEIGHT_KEY, Constants.DEFAULT_WEIGHT);
+        if (weight > 0) {
+            long timestamp = 
invoker.getUrl().getParameter(Constants.TIMESTAMP_KEY, 0L);
+            if (timestamp > 0L) {
+                int uptime = (int) (System.currentTimeMillis() - timestamp);
+                int warmup = 
invoker.getUrl().getParameter(Constants.WARMUP_KEY, Constants.DEFAULT_WARMUP);
+                if (uptime > 0 && uptime < warmup) {
+                    weight = calculateWarmupWeight(uptime, warmup, weight);
+                }
+            }
+        }
+        return weight;
+    }
+
+    static int calculateWarmupWeight(int uptime, int warmup, int weight) {
+        int ww = (int) ( (float) uptime / ( (float) warmup / (float) weight ) 
);
+        return ww < 1 ? 1 : (ww > weight ? weight : ww);
+    }
 }

Reply via email to