Skip to content

efs-proof: re-run on main — 9/9 + clean soak with link() fences and OFD locks on EFS - #309

Merged
jaredLunde merged 1 commit into
mainfrom
jared/efs-proof-rerun
Oct 17, 2026
Merged

jaredLunde merged 1 commit into
mainfrom
jared/efs-proof-rerun

Conversation

@jaredLunde

Copy link
Copy Markdown
Contributor

Re-runs the real-AWS proof of service mode (#104) against current main (f902044e). The point was the two storage primitives that changed since then and had never run on EFS: #297, where the epoch-1 fence is now a temp file link()ed into place, and #144, where a session lock is an OFD lock on .beyond-lock plus the legacy flock on lock.

Results (Fargate + EFS Elastic, us-west-2, one AZ)

#104 (2026-09-22) this run
Matrix 9/9 9/9
Partitioned takeover 88.4 s 88.4 s
Hard-kill takeover 73.1 s 66.6 s
/readyz under hung mount 1.0028 s 1.0026 s, 0 threads leaked
Soak (1800 s, seed 7, 30 sessions / 5 tenants) 145,244 turns, 13 deploys, 7 kills 142,755 turns, 12 deploys, 7 kills
Placements refused / lost writes 0 / 0 0 / 0
Turns/s per session vs local NFS (3.18) 2.69 (85%) 2.64 (83%)

Lock quota (#144: two lock files per live session)

  • Live, mid-soak: a replica holding 30 live sessions had 60 locks (30 OFDLCK + 30 FLOCK), so two per session as intended.
  • Ceiling: one process on one EFS mount held 65,532 locks at once (32,766 two-lock sessions) and EFS refused none. It stopped only because it hit Fargate's 65,535 nofile limit, which is right at AWS's documented quota of 65,536 locks per mount.
  • Takeaway: the lock quota doesn't bind at the --max-live-sessions default, which needs 40,000 locks (61% of the quota). File descriptors are the tighter limit: about 3 per live session, so roughly 60k at the default against 65,535. The --max-live-sessions help text and FLEET.md's sizing row said "2 descriptors per session"; both are corrected here. Dropping the legacy flock, as planned, brings it back to about 2.

Rig fixes this run needed

  • The driver now creates s2 at startup. Without it, all 9 scenarios fail at attach.
  • The driver start retries while a new mount target's DNS name propagates. The first up hit ResourceInitializationError: Failed to resolve fs-….
  • down.sh now deletes security groups in two passes. The EFS group references the tasks group, so the tasks group can't go first; the gate caught the leaked SG and VPC, and a rerun cleared them.
  • The checker's C1 message no longer says O_EXCL.

Results moved to deploy/efs-proof/results/<date>/, with locks.txt added. (The 2026-09-22 soak.txt was already truncated in #104.)

Teardown verified: no ECS tasks running (cluster INACTIVE), no EFS, NAT, EIP, VPC, log group, ECR repo or IAM role left. Rig up 1 h 42 min, about $0.60.

🤖 Generated with Claude Code

https://claude.ai/code/session_01JimHGjsfk2Ktm5GxyZJKKk

…fences and OFD locks

The two storage primitives that changed since #104 had never run on EFS: the
epoch-1 fence is a temp file link()ed into place (#297), and a session lock is
an OFD lock on .beyond-lock plus the legacy flock on lock (#144). Both hold on
real Fargate + EFS:

- matrix 9/9; partitioned takeover 88.4 s (88.4 s in #104), hard-kill
  takeover 66.6 s (73.1 s), /readyz under a hung mount 1.0026 s, 0 threads
  leaked
- 30-min soak: 142,755 turns, 12 deploys, 7 hard kills, 0 placements refused,
  every acknowledged write present; 2.64 turns/s/session (83% of local NFS)
- a replica with 30 live sessions held 60 locks (30 OFDLCK + 30 FLOCK); one
  EFS mount held 65,532 locks with none refused, stopped by Fargate's 65,535
  nofile limit at AWS's 65,536-locks-per-mount quota. The lock quota does not
  bind at the 20,000 default; descriptors (~3 per live session) are tighter,
  so the --max-live-sessions help and FLEET.md's sizing row now say so.

Rig fixes the run needed: the driver creates s2 (every scenario failed attach
without it), the driver start retries through a fresh mount target's DNS lag,
and down.sh deletes security groups in two passes (the EFS group references
the tasks group; the gate caught the leak). The checker's C1 message no longer
says O_EXCL. Results move to results/<date>/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JimHGjsfk2Ktm5GxyZJKKk
@jaredLunde
jaredLunde enabled auto-merge October 17, 2026 01:40
@jaredLunde
jaredLunde added this pull request to the merge queue Oct 17, 2026
Merged via the queue into main with commit 15191a9 Oct 17, 2026
13 checks passed
@jaredLunde
jaredLunde deleted the jared/efs-proof-rerun branch October 17, 2026 01:58
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

Successfully merging this pull request may close these issues.

1 participant