Browse Source

Fixed all fallback origins setting bug

Toby Chui 8 months ago
parent
commit
c643db034a
1 changed files with 19 additions and 3 deletions
  1. 19 3
      mod/dynamicproxy/loadbalance/originPicker.go

+ 19 - 3
mod/dynamicproxy/loadbalance/originPicker.go

@@ -47,10 +47,11 @@ func (m *RouteManager) GetRequestUpstreamTarget(w http.ResponseWriter, r *http.R
 			log.Println(err)
 			targetOrigin = origins[0]
 		}
+
 	}
 
-	fmt.Println("DEBUG: Picking origin " + targetOrigin.OriginIpOrDomain)
-	return origins[0], nil
+	//fmt.Println("DEBUG: Picking origin " + targetOrigin.OriginIpOrDomain)
+	return targetOrigin, nil
 }
 
 /* Features related to session access */
@@ -118,7 +119,22 @@ func getRandomUpstreamByWeight(upstreams []*Upstream) (*Upstream, int, error) {
 		}
 		counter++
 	}
-	return ret, -1, err
+
+	if ret == nil {
+		//All fallback
+		//use the first one that is with weight = 0
+		fallbackUpstreams := []*Upstream{}
+		fallbackUpstreamsOriginalID := []int{}
+		for ix, upstream := range upstreams {
+			if upstream.Weight == 0 {
+				fallbackUpstreams = append(fallbackUpstreams, upstream)
+				fallbackUpstreamsOriginalID = append(fallbackUpstreamsOriginalID, ix)
+			}
+		}
+		upstreamID := rand.Intn(len(fallbackUpstreams))
+		return fallbackUpstreams[upstreamID], fallbackUpstreamsOriginalID[upstreamID], nil
+	}
+	return ret, -1, errors.New("failed to pick an upstream origin server")
 }
 
 // IntRange returns a random integer in the range from min to max.