diff options
author | Edward Wang <[email protected]> | 2024-11-11 18:09:55 -0800 |
---|---|---|
committer | Edward Wang <[email protected]> | 2024-11-22 16:03:16 -0800 |
commit | e309436319ed5cbc3aaf53221070a1fd070b8bcf (patch) | |
tree | 17ae9b6fb9b00f2ba1304b95f48cd5ec4dbe2c83 /pingora-proxy/src/proxy_cache.rs | |
parent | 1756948df77d257bddf7ab798cc3fddf348a91c8 (diff) | |
download | pingora-e309436319ed5cbc3aaf53221070a1fd070b8bcf.tar.gz pingora-e309436319ed5cbc3aaf53221070a1fd070b8bcf.zip |
Release cache lock after proxy upstream filter, serve stale
The cache locks may be held after serving stale, proxy upstream filter,
or revalidate uncacheable resulting in dangling cache locks.
Also only disable cache on final error if cache was not already
disabled, and add DeclinedToUpstream / UpstreamError no cache reasons.
Diffstat (limited to 'pingora-proxy/src/proxy_cache.rs')
-rw-r--r-- | pingora-proxy/src/proxy_cache.rs | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/pingora-proxy/src/proxy_cache.rs b/pingora-proxy/src/proxy_cache.rs index 4369ec8..8957bc7 100644 --- a/pingora-proxy/src/proxy_cache.rs +++ b/pingora-proxy/src/proxy_cache.rs @@ -667,8 +667,18 @@ impl<SV> HttpProxy<SV> { None, None, ); - self.inner + if self + .inner .should_serve_stale(session, ctx, Some(&http_status_error)) + { + // no more need to keep the write lock + session + .cache + .release_write_lock(NoCacheReason::UpstreamError); + true + } else { + false + } } else { false // not 304, not stale if error status code } @@ -712,6 +722,11 @@ impl<SV> HttpProxy<SV> { self.inner.request_summary(session, ctx) ); + // no more need to hang onto the cache lock + session + .cache + .release_write_lock(NoCacheReason::UpstreamError); + Some(self.proxy_cache_hit(session, ctx).await) } |