Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dirty tiles cached for 7 days #1096

Open
nrenner opened this issue Jun 9, 2024 · 5 comments
Open

Dirty tiles cached for 7 days #1096

nrenner opened this issue Jun 9, 2024 · 5 comments

Comments

@nrenner
Copy link

nrenner commented Jun 9, 2024

Actual

When expired tiles can't be rerendered on-the-fly, the old (dirty) version is returned.

Currently, these dirty tiles get a Cache-Control: max-age=604800 and a corresponding Expires response header, that will cache them for seven days.

Expected

I would have expected dirty tiles to be cached for a very short time frame only, as described in #959:

Tiles which are known to be dirty when served are given a randomised expiry up to ModTileCacheDurationDirty which we have as 15 minutes.

Probably implemented in mod_tile.c and configured in tile.conf.erb?

Examples

Browser

Test case: z13 tile in a dense region with a very recent edit.

  1. Tile is clean. Last rendered at Tue Jun 08 10:38:36 2004. Last accessed at Sat Jun 08 10:38:36 2024
  2. Browser tile requests returned after 2 seconds with Cache-Control: max-age=604800:
    screenshot-browser-requests
    • screenshot with custom response headers, called with network tab open and "Disable cache" activated
  3. Tile is clean. Last rendered at Sat Jun 08 10:40:49 2024. Last accessed at Sat Jun 08 10:40:49 2024
    • rendering took 16 seconds (Last rendered 10:40:49 - request started / Expires time 10:40:33),
      confirming that we indeed got dirty tiles
  • example headers (shortened):
    • General
      Request URL: https://tile.openstreetmap.org/13/4260/2729.png
      Status Code: 200 OK
      
    • Response Headers
      Age: 0
      Cache-Control: max-age=604800, stale-while-revalidate=604800, stale-if-error=604800
      Date: Sat, 08 Jun 2024 10:40:35 GMT
      Expires: Sat, 15 Jun 2024 10:40:33 GMT
      X-Cache: MISS
      X-Cache-Hits: 0
      X-Served-By: cache-muc13944-MUC
      X-Tilerender: nidhogg.openstreetmap.org
      

Script

Script requesting tile status and headers every minute, for an active HOT task with ongoing edits.

  • cache-control: max-age=604800 when expired
  • got dirty tile for those: etag stayed the same and only changed with next call,
    rendering times around 30 s and 21 s (next Last rendered - response date)

Example sequence:

Tile is clean. Last rendered at Fri Jun 07 12:46:34 2024. Last accessed at Fri Jun 07 12:47:25 2024
HTTP/2 200 
etag: "2a2d2b6d5ffc3ee6aaefcdad689469ab"
cache-control: max-age=12579, stale-while-revalidate=604800, stale-if-error=604800
x-tilerender: ysera.openstreetmap.org
date: Fri, 07 Jun 2024 15:29:10 GMT
x-served-by: cache-muc13959-MUC
x-cache: MISS

Tile is clean. Last rendered at Mon Jun 07 12:46:34 2004. Last accessed at Fri Jun 07 12:47:25 2024
HTTP/2 200 
etag: "2a2d2b6d5ffc3ee6aaefcdad689469ab"
cache-control: max-age=604800, stale-while-revalidate=604800, stale-if-error=604800
x-tilerender: ysera.openstreetmap.org
date: Fri, 07 Jun 2024 15:30:13 GMT
x-served-by: cache-muc13978-MUC
x-cache: MISS

Tile is clean. Last rendered at Fri Jun 07 15:30:43 2024. Last accessed at Fri Jun 07 15:30:43 2024
HTTP/2 200 
etag: "cf80c42b67a6618d80f8fbb3b6ac0fce"
cache-control: max-age=6991, stale-while-revalidate=604800, stale-if-error=604800
x-tilerender: ysera.openstreetmap.org
date: Fri, 07 Jun 2024 15:31:13 GMT
x-served-by: cache-muc13945-MUC
x-cache: MISS

Tile is clean. Last rendered at Mon Jun 07 15:30:43 2004. Last accessed at Fri Jun 07 15:31:13 2024
HTTP/2 200 
etag: "cf80c42b67a6618d80f8fbb3b6ac0fce"
cache-control: max-age=604800, stale-while-revalidate=604800, stale-if-error=604800
x-tilerender: ysera.openstreetmap.org
date: Fri, 07 Jun 2024 15:32:16 GMT
x-served-by: cache-muc13977-MUC
x-cache: MISS

Tile is clean. Last rendered at Fri Jun 07 15:32:37 2024. Last accessed at Fri Jun 07 15:32:37 2024
HTTP/2 200 
etag: "04a889c787d54d0f7bbfe0c190136d38"
cache-control: max-age=5173, stale-while-revalidate=604800, stale-if-error=604800
x-tilerender: ysera.openstreetmap.org
date: Fri, 07 Jun 2024 15:33:17 GMT
x-served-by: cache-muc13928-MUC
x-cache: MISS
@tomhughes
Copy link
Member

No, dirty tiles do not get that cache age, at least not from upstream which is what we control. The expiry time for dirty tiles is 900s:

https://github.com/openstreetmap/chef/blob/d15475a0ad553d8a25888589158651850d638376/cookbooks/tile/templates/default/tile.conf.erb#L23

@tomhughes
Copy link
Member

It's unclear to me what exactly you think you're showing in your extremely verbose report - as far as I can see there is no indication of whether a returned tile is dirty or not so are you trying to match a tile status call and a tile call and hoping nothing changes in between?

@tomhughes
Copy link
Member

Ah I've seen the script now but that is useless because it makes a status call (which may well say the tile is dirty) and then a tile call, which may well re-render the tile and return a clean version and hence not return the dirty expiry.

@nrenner
Copy link
Author

nrenner commented Jun 9, 2024

as far as I can see there is no indication of whether a returned tile is dirty or not

That's why this is so verbose, as I'm trying to reason about it using indirect hints.

so are you trying to match a tile status call and a tile call and hoping nothing changes in between?

In the browser example I ran a loop to check the status every second while making the call and it didn't change until 16 seconds after (browser request started time 10:40:33; or 17 seconds according to Last accessed):

2024-06-08T10:40:31+00:00
Tile is clean. Last rendered at Tue Jun 08 10:38:36 2004. Last accessed at Sat Jun 08 10:38:36 2024
2024-06-08T10:40:32+00:00
Tile is clean. Last rendered at Tue Jun 08 10:38:36 2004. Last accessed at Sat Jun 08 10:40:32 2024
...
2024-06-08T10:40:48+00:00
Tile is clean. Last rendered at Tue Jun 08 10:38:36 2004. Last accessed at Sat Jun 08 10:40:32 2024
2024-06-08T10:40:49+00:00
Tile is clean. Last rendered at Sat Jun 08 10:40:49 2024. Last accessed at Sat Jun 08 10:40:49 2024

Ah I've seen the script now but that is useless because it makes a status call (which may well say the tile is dirty) and then a tile call, which may well re-render the tile and return a clean version and hence not return the dirty expiry.

Could be, but unlikely because minimum time per tile for z13 on ysera was > 6 seconds, and timeout to wait for rendering seems to be 2 seconds?

What else would be the reason for those cache-control: max-age=604800, when last rendered time in these examples was only minutes or a few hours before?

@Spiekerooger
Copy link

This is a mod_tile issue as nrenner rightfully found out. The 900s ModTileCacheDurationDirty config setting never gets applied in mod_tile for tiles that are marked dirty by the expiry mechanisms. And by that the dirty tiles returned by the tilerenderers have the way-too-high expiry time for the cdn edge server caches.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants