Skip to content

Commit f0f1d41

Browse files
maxmoehlhoffmaen
andcommitted
refactor: unregister logic for route registry
Resolves: cloudfoundry#468 Co-Authored-By: Clemens Hoffmann <[email protected]>
1 parent e553e9e commit f0f1d41

File tree

2 files changed

+45
-29
lines changed

2 files changed

+45
-29
lines changed

src/code.cloudfoundry.org/gorouter/registry/registry.go

+38-24
Original file line numberDiff line numberDiff line change
@@ -172,43 +172,57 @@ func (r *RouteRegistry) Unregister(uri route.Uri, endpoint *route.Endpoint) {
172172
return
173173
}
174174

175-
r.unregister(uri, endpoint)
175+
endpointRemoved, routeRemoved := r.unregister(uri, endpoint)
176176

177177
r.reporter.CaptureUnregistryMessage(endpoint)
178178

179+
// WARNING: this only works because there are only info log statements after this point. If you
180+
// extend this function, this probably needs to be refactored.
181+
if !r.logger.Enabled(context.Background(), slog.LevelInfo) {
182+
return
183+
}
184+
185+
if endpointRemoved {
186+
r.logger.Info("endpoint-unregistered", buildSlogAttrs(uri, endpoint)...)
187+
} else {
188+
r.logger.Info("endpoint-not-unregistered", buildSlogAttrs(uri, endpoint)...)
189+
}
190+
191+
if routeRemoved {
192+
r.logger.Info("route-unregistered", slog.Any("uri", uri))
193+
} else {
194+
r.logger.Info("route-not-unregistered", slog.Any("uri", uri))
195+
}
179196
}
180197

181-
func (r *RouteRegistry) unregister(uri route.Uri, endpoint *route.Endpoint) {
198+
func (r *RouteRegistry) unregister(uri route.Uri, endpoint *route.Endpoint) (endpointRemoved, routeRemoved bool) {
182199
r.Lock()
183200
defer r.Unlock()
184201

185202
uri = uri.RouteKey()
186203

187204
pool := r.byURI.Find(uri)
188-
if pool != nil {
189-
endpointRemoved := pool.Remove(endpoint)
190-
if endpointRemoved {
191-
if r.logger.Enabled(context.Background(), slog.LevelInfo) {
192-
r.logger.Info("endpoint-unregistered", buildSlogAttrs(uri, endpoint)...)
193-
}
194-
} else {
195-
if r.logger.Enabled(context.Background(), slog.LevelInfo) {
196-
r.logger.Info("endpoint-not-unregistered", buildSlogAttrs(uri, endpoint)...)
197-
}
198-
}
205+
if pool == nil {
206+
return false, false
207+
}
199208

200-
if pool.IsEmpty() {
201-
if r.EmptyPoolResponseCode503 && r.EmptyPoolTimeout > 0 {
202-
if time.Since(pool.LastUpdated()) > r.EmptyPoolTimeout {
203-
r.byURI.Delete(uri)
204-
r.logger.Info("route-unregistered", slog.Any("uri", uri))
205-
}
206-
} else {
207-
r.byURI.Delete(uri)
208-
r.logger.Info("route-unregistered", slog.Any("uri", uri))
209-
}
210-
}
209+
endpointRemoved = pool.Remove(endpoint)
210+
if !endpointRemoved {
211+
return false, false
211212
}
213+
214+
if !pool.IsEmpty() {
215+
return true, false
216+
}
217+
218+
// If we have empty pool responses, the timeout for empty pools is greater than zero and the
219+
// timeout of this pool has not yet expired, don't remove it yet.
220+
if r.EmptyPoolResponseCode503 && r.EmptyPoolTimeout > 0 && time.Since(pool.LastUpdated()) <= r.EmptyPoolTimeout {
221+
return true, false
222+
}
223+
224+
r.byURI.Delete(uri)
225+
return true, true
212226
}
213227

214228
func (r *RouteRegistry) Lookup(uri route.Uri) *route.EndpointPool {

src/code.cloudfoundry.org/gorouter/registry/registry_test.go

+7-5
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,12 @@ var _ = Describe("RouteRegistry", func() {
650650
Context("EmptyPoolResponseCode503 is true and EmptyPoolTimeout greater than 0", func() {
651651
JustBeforeEach(func() {
652652
r.EmptyPoolResponseCode503 = true
653-
r.EmptyPoolTimeout = 5 * time.Second
653+
r.EmptyPoolTimeout = 1 * time.Second
654+
r.StartPruningCycle()
655+
})
656+
657+
JustAfterEach(func() {
658+
r.StopPruningCycle()
654659
})
655660

656661
It("Removes the route after EmptyPoolTimeout period of time is passed", func() {
@@ -659,10 +664,7 @@ var _ = Describe("RouteRegistry", func() {
659664

660665
r.Unregister("bar", barEndpoint)
661666
Expect(r.NumUris()).To(Equal(1))
662-
time.Sleep(r.EmptyPoolTimeout)
663-
r.Unregister("bar", barEndpoint)
664-
Expect(r.NumUris()).To(Equal(0))
665-
667+
Eventually(r.NumUris).WithTimeout(r.EmptyPoolTimeout + time.Second).Should(Equal(0))
666668
})
667669
})
668670

0 commit comments

Comments
 (0)