Skip to content

Deadline-heavy repos get a permanently blank OG card and one full traversal per minute after #144 #156

Description

@lukaso-bot

Found reviewing PR #144 (round 10). Not a defect in that PR's diff — a cost its correctness fix makes permanent for one class of repo, worth fixing in a PR that is about it.

What #144 does

/internal/* refuses to serve any partial and 503s instead. The rationale is right: a partial with firstRelease: null renders as a definite "not yet released", and a partial with a firstRelease carries the gallop hit whose bisect confirmation the deadline cut short. Neither may be pinned into a 24h OG card, and an OG card cannot render the best-effort caveat the result card does.

The cost

gitlab.gnome.org/GNOME/gimp (large tag set, relayed through the single-instance Anubis container) routinely returns partial with a gallop firstRelease. After #144:

  1. unfurl → 503 → web-og renders the neutral placeholder at max-age=60
  2. 60s later the crawler retries; the recorded partial has just aged past HARD_TTL_PARTIAL (resolve.ts:38 — also 60), so unpinnable forces a recompute
  3. another full findRelease out to the 28s hard deadline, another partial, another 503

HARD_TTL_PARTIAL and web-og's placeholder max-age are both 60 seconds, so the two cadences coincide: the "throttled to one traversal per 60s per key" property internal.ts claims is real but buys nothing against a crawler asking once a minute. Net effect for a deadline-heavy repo:

  • the OG card never converges — permanently the neutral placeholder
  • upstream load for that key goes from ~0 to one full traversal per minute, for as long as the URL is being unfurled, on the shared token and through a max_instances = 1 relay DO

Before #144 the route cached the gallop tag flat for 30 minutes, so the card rendered something.

Sketch of a fix

Serve the gallop-hit shape but have web-og short-cache it rather than long-cache it. The pin duration is web-og's result ? longCache : shortCache; /internal/* could influence it with a response header (e.g. an explicit cache-control or an x-released-partial: 1 web-og keys off). That restores a card with content while keeping it revalidatable, instead of trading a possibly-wrong 24h pin for a permanently blank one.

Adjacent to #151 (the OG card's cache policy for non-terminal answers) — likely the same change. The firstRelease: null shape should keep 503ing regardless; only the gallop-hit shape is in question.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions