X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/2179ac7db0b30640db18e03660cbfe26b19c9d77..8090581c645f62fec8337b3a2b9f72448fc24431:/lib/controller/handler_test.go diff --git a/lib/controller/handler_test.go b/lib/controller/handler_test.go index 0cb0e15009..0c50a6c4be 100644 --- a/lib/controller/handler_test.go +++ b/lib/controller/handler_test.go @@ -147,12 +147,18 @@ func (s *HandlerSuite) TestDiscoveryDocCache(c *check.C) { defer ent.mtx.Unlock() } } - expireCache := func() { + refreshNow := func() { waitPendingUpdates() for _, ent := range s.handler.cache { ent.refreshAfter = time.Now() } } + expireNow := func() { + waitPendingUpdates() + for _, ent := range s.handler.cache { + ent.expireAfter = time.Now() + } + } // Easy path: first req fetches, subsequent reqs use cache. c.Check(countRailsReqs(), check.Equals, 0) @@ -182,7 +188,7 @@ func (s *HandlerSuite) TestDiscoveryDocCache(c *check.C) { // Race after expiry: concurrent reqs return the cached data // but initiate a new fetch in the background. - expireCache() + refreshNow() holdReqs = make(chan struct{}) wg = getDDConcurrently(5, http.StatusOK, check.Commentf("race after expiry")) reqsBefore = countRailsReqs() @@ -237,20 +243,20 @@ func (s *HandlerSuite) TestDiscoveryDocCache(c *check.C) { getDDConcurrently(5, http.StatusOK, check.Commentf("error with warm cache")).Wait() c.Check(countRailsReqs(), check.Equals, reqsBefore) - // Error with expired cache => caller gets OK with stale data + // Error with stale cache => caller gets OK with stale data // while the re-fetch is attempted in the background - expireCache() + refreshNow() wantError, wantBadContent = true, false reqsBefore = countRailsReqs() holdReqs = make(chan struct{}) - getDDConcurrently(5, http.StatusOK, check.Commentf("error with expired cache")).Wait() + getDDConcurrently(5, http.StatusOK, check.Commentf("error with stale cache")).Wait() close(holdReqs) // Only one attempt to re-fetch (holdReqs ensured the first // update took long enough for the last incoming request to // arrive) c.Check(countRailsReqs(), check.Equals, reqsBefore+1) - expireCache() + refreshNow() wantError, wantBadContent = false, false reqsBefore = countRailsReqs() holdReqs = make(chan struct{}) @@ -258,6 +264,35 @@ func (s *HandlerSuite) TestDiscoveryDocCache(c *check.C) { close(holdReqs) waitPendingUpdates() c.Check(countRailsReqs(), check.Equals, reqsBefore+1) + + // Make sure expireAfter is getting set + waitPendingUpdates() + exp := s.handler.cache["/discovery/v1/apis/arvados/v1/rest"].expireAfter.Sub(time.Now()) + c.Check(exp > cacheTTL, check.Equals, true) + c.Check(exp < cacheExpire, check.Equals, true) + + // After the cache *expires* it behaves as if uninitialized: + // each incoming request does a new upstream request until one + // succeeds. + // + // First check failure after expiry: + expireNow() + wantError, wantBadContent = true, false + reqsBefore = countRailsReqs() + holdReqs = make(chan struct{}) + wg = getDDConcurrently(5, http.StatusBadGateway, check.Commentf("error after expiry")) + close(holdReqs) + wg.Wait() + c.Check(countRailsReqs(), check.Equals, reqsBefore+5) + + // Success after expiry: + wantError, wantBadContent = false, false + reqsBefore = countRailsReqs() + holdReqs = make(chan struct{}) + wg = getDDConcurrently(5, http.StatusOK, check.Commentf("success after expiry")) + close(holdReqs) + wg.Wait() + c.Check(countRailsReqs(), check.Equals, reqsBefore+1) } func (s *HandlerSuite) TestVocabularyExport(c *check.C) { @@ -604,7 +639,7 @@ func (s *HandlerSuite) TestGetObjects(c *check.C) { testCases := map[string]map[string]bool{ "api_clients/" + arvadostest.TrustedWorkbenchAPIClientUUID: nil, "api_client_authorizations/" + auth.UUID: {"href": true, "modified_by_client_uuid": true, "modified_by_user_uuid": true}, - "authorized_keys/" + arvadostest.AdminAuthorizedKeysUUID: nil, + "authorized_keys/" + arvadostest.AdminAuthorizedKeysUUID: {"href": true}, "collections/" + arvadostest.CollectionWithUniqueWordsUUID: {"href": true}, "containers/" + arvadostest.RunningContainerUUID: nil, "container_requests/" + arvadostest.QueuedContainerRequestUUID: nil,