carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

Overall verdict: ACCEPT — reviewed c8dbe3de..eb942159 against spec §7.2.

Finding 1: ADDRESSED. internal/edge/genproxy.go:158 validates the sampled generation while holding GenPools.mu, before returning or creating a pool. Retire takes that same lock at line 179. Retirement therefore either removes the published pool or precedes validation that refuses to recreate it.

New findings: none.

  • Lock order and deadlock: ServingGen takes only the activator lock. Retirement releases that lock before invoking hooks (activator.go:2423); hook dispatch also releases retiredMu first. No reverse lock order found.
  • Bounded reselection: genproxy.go:269 permits three reselections and exits on the fourth refusal. These do not consume the separate two dial retries. Exhaustion returns the current generation in genMovedError, or errNoGeneration when absent. Earlier disappearance enters the existing context-aware, bounded wait.
  • Body release: the new exhaustion path releases the held body before either error return. Reselection itself neither reads nor closes it; the existing no-generation timeout also releases it.
  • Flag-off behavior: unchanged. Both edge and scheduled delivery still gate generation proxies on GenerationsOn; the fix changes neither gate.
  • Test determinism: genproxy_test.go:446 forces each retirement synchronously during the initial sample. sync.Once prevents retirement from firing again inside the pool lock. The flapping source deterministically changes its number on every call; its test verifies termination, zero retained pools and one body close.

git diff --check and formatting checks passed. I reviewed the supplied RED/GREEN evidence but did not rerun builds or tests, preserving the read-only scope. No files changed.

Out of scope: no additional observations.