diff --git a/src/PostgREST/AppState.hs b/src/PostgREST/AppState.hs index 3f60ef04a6..4f631091ba 100644 --- a/src/PostgREST/AppState.hs +++ b/src/PostgREST/AppState.hs @@ -315,8 +315,6 @@ retryingSchemaCacheLoad appState@AppState{stateObserver=observer, stateMainThrea let delay = fromMaybe 0 rsPreviousDelay `div` oneSecondInUs observer $ ConnectionRetryObs delay - flushPool appState - (,) <$> qPgVersion <*> (qInDbConfig *> qSchemaCache) ) where @@ -365,6 +363,10 @@ retryingSchemaCacheLoad appState@AppState{stateObserver=observer, stateMainThrea -- IORef on putSchemaCache. This is why schema cache status is marked as pending here to signal the Admin server (using isPending) that we're on a recovery state. markSchemaCachePending appState putSchemaCache appState $ Just sCache + -- Flush the pool after loading the schema cache to reset any stale session cache entries + -- We do it after successfully querying the schema cache + -- and after marking sCacheStatus as pending, + flushPool appState observer $ SchemaCacheQueriedObs resultTime observer . uncurry SchemaCacheLoadedObs =<< timeItT (evaluate $ showSummary sCache) markSchemaCacheLoaded appState diff --git a/test/io/test_io.py b/test/io/test_io.py index 392aa9b5c2..f51e90d15f 100644 --- a/test/io/test_io.py +++ b/test/io/test_io.py @@ -781,7 +781,7 @@ def test_log_level(level, defaultenv): response = postgrest.session.get("/") assert response.status_code == 200 - output = postgrest.read_stdout(nlines=7) + output = postgrest.read_stdout(nlines=9) if level == "crit": assert len(output) == 0 @@ -819,7 +819,7 @@ def test_log_level(level, defaultenv): r'- - postgrest_test_anonymous \[.+\] "GET / HTTP/1.1" 200 \d+ "" "python-requests/.+"', ], ) - assert len(output) == 7 + assert len(output) == 9 assert any("Connection" and "is available" in line for line in output) assert any("Connection" and "is used" in line for line in output) @@ -1456,7 +1456,7 @@ def test_db_error_logging_to_stderr(level, defaultenv, metapostgrest): assert response.status_code == 500 # ensure the message appears on the logs - output = postgrest.read_stdout(nlines=6) + output = postgrest.read_stdout(nlines=8) if level == "crit": assert len(output) == 0 @@ -1673,7 +1673,7 @@ def test_log_pool_req_observation(level, defaultenv): if level == "debug": output = postgrest.read_stdout(nlines=7) - assert len(output) == 6 + assert len(output) == 7 match_log(output, [pool_req, pool_req_fullfill]) elif level == "info": output = postgrest.read_stdout(nlines=4) diff --git a/test/observability/Observation/SchemaCacheSpec.hs b/test/observability/Observation/SchemaCacheSpec.hs index e3260271b8..318c2dba6b 100644 --- a/test/observability/Observation/SchemaCacheSpec.hs +++ b/test/observability/Observation/SchemaCacheSpec.hs @@ -27,7 +27,7 @@ spec = describe "Server started with metrics enabled" $ do waitFor (1 * sec) "SchemaCacheLoadedObs" $ \x -> [ o | o@SchemaCacheLoadedObs{} <- pure x ] - it "Should flush pool multiple times when schema reloading retries" $ do + it "Should flush pool once when schema reloading retries" $ do SpecState{specAppState = appState, specObsChan} <- getState let waitFor = waitForObs specObsChan @@ -36,16 +36,14 @@ spec = describe "Server started with metrics enabled" $ do AppState.putConfig appState $ cfg { configDbSchemas = pure "bad_schema" } AppState.schemaCacheLoader appState - waitFor (1 * sec) "PoolFlushed 1" $ \x -> [ o | o@PoolFlushed <- pure x ] waitFor (1 * sec) "SchemaCacheErrorObs" $ \x -> [ o | o@SchemaCacheErrorObs{} <- pure x ] -- Restore configuration AppState.putConfig appState cfg -- Wait for 2 seconds so that retry can happen - waitFor (2 * sec) "PoolFlushed 2" $ \x -> [ o | o@PoolFlushed <- pure x ] + waitFor (2 * sec) "PoolFlushed" $ \x -> [ o | o@PoolFlushed <- pure x ] waitFor (1 * sec) "SchemaCacheQueriedObs" $ \x -> [ o | o@SchemaCacheQueriedObs{} <- pure x ] waitFor (1 * sec) "SchemaCacheLoadedObs" $ \x -> [ o | o@SchemaCacheLoadedObs{} <- pure x ] - where sec = 1000000