func (r *RouteRegistry) LookupWithInstance(uri route.Uri, appId string, appIndex string) *route.Pool { uri = uri.RouteKey() p := r.Lookup(uri) var surgicalPool *route.Pool p.Each(func(e *route.Endpoint) { if (e.ApplicationId == appId) && (e.PrivateInstanceIndex == appIndex) { surgicalPool = route.NewPool(0, "") surgicalPool.Put(e) } }) return surgicalPool }
}) Context("when pool has endpoints", func() { var ( endpoints []*route.Endpoint total int ) BeforeEach(func() { total = 5 endpoints = make([]*route.Endpoint, 0) for i := 0; i < total; i++ { ip := fmt.Sprintf("10.0.1.%d", i) e := route.NewEndpoint("", ip, 60000, "", "", nil, -1, "", models.ModificationTag{}) endpoints = append(endpoints, e) pool.Put(e) } // 10.0.1.0:6000 // 10.0.1.1:6000 // 10.0.1.2:6000 // 10.0.1.3:6000 // 10.0.1.4:6000 }) Context("when all endpoints have no statistics", func() { It("selects a random endpoint", func() { iter := route.NewLeastConnection(pool, "") n := iter.Next() Expect(n).NotTo(BeNil()) }) })
var modTag models.ModificationTag BeforeEach(func() { pool = route.NewPool(2*time.Minute, "") modTag = models.ModificationTag{} }) Describe("Next", func() { It("performs round-robin through the endpoints", func() { e1 := route.NewEndpoint("", "1.2.3.4", 5678, "", "", nil, -1, "", modTag) e2 := route.NewEndpoint("", "5.6.7.8", 1234, "", "", nil, -1, "", modTag) e3 := route.NewEndpoint("", "1.2.7.8", 1234, "", "", nil, -1, "", modTag) endpoints := []*route.Endpoint{e1, e2, e3} for _, e := range endpoints { pool.Put(e) } counts := make([]int, len(endpoints)) iter := route.NewRoundRobin(pool, "") loops := 50 for i := 0; i < len(endpoints)*loops; i += 1 { n := iter.Next() for j, e := range endpoints { if e == n { counts[j]++ break } }
) var _ = Describe("Pool", func() { var pool *route.Pool var modTag models.ModificationTag BeforeEach(func() { pool = route.NewPool(2*time.Minute, "") modTag = models.ModificationTag{} }) Context("Put", func() { It("adds endpoints", func() { endpoint := &route.Endpoint{} b := pool.Put(endpoint) Expect(b).To(BeTrue()) }) It("handles duplicate endpoints", func() { endpoint := route.NewEndpoint("", "1.2.3.4", 5678, "", "", nil, 1, "", modTag) pool.Put(endpoint) pool.MarkUpdated(time.Now().Add(-(10 * time.Minute))) b := pool.Put(endpoint) Expect(b).To(BeTrue()) prunedEndpoints := pool.PruneEndpoints(time.Second) Expect(prunedEndpoints).To(BeEmpty()) })