Repository navigation
refactor(gitlimit): hold a shared lease in every git child of a cache repository - #768
Conversation
… repository Every git that serve starts in a cache repository now inherits a shared flock on <repo>/codestorage.gitlease.lock as its descriptor 3. The lock lives as long as the git process tree, so a later exclusive try proves that no git serve started is alive in that repository. Nothing takes the exclusive lock yet (#490). The call sites that run git in a cache repository move to gitlimit.StartIn, RunIn, OutputIn and CombinedOutputIn, or attach a lease themselves (repack, lfsscan). TestEveryGitStartTakesTheLease fails on a git start without a lease that is not listed with a reason, and a binary built with openstorage_viewcheck panics on one that runs in a repository. Signed-off-by: Thomas Kosiewski <tk@coder.com> --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-sonnet-5-5` • Thinking: `xhigh`_ Change-Id: I0fe3fd8bf9a454177b2578fa824fa5a85cbd2a98
TestEnsureCacheRepoCtx_PartialInitialization re-inits a repository that holds HEAD and objects, so the viewcheck build refused the unleased `git init --bare`. EnsureCacheRepoCtx creates the directory before it runs git, so the init takes the lease like every other git in the repository, and the audit allow-list loses its runGitCtx entry. The lease test also runs git behind the heap-cap shell wrapper, and the viewcheck panic text names the command once. Signed-off-by: Thomas Kosiewski <tk@coder.com> --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-sonnet-5-5` • Thinking: `xhigh`_ Change-Id: I0c7173de74fe72e4d30dd118beb3e80cb3a37e3b
…tarters The covered functions that start git changed only in the starter they call (StartIn, RunIn, OutputIn, CombinedOutputIn) and in the new runGitLeased helper: none of them changes push-lane scheduling, the ordering of a hold, a claim or a publication, which the model describes. check.sh --record passed with every property true and the probe failing. Signed-off-by: Thomas Kosiewski <tk@coder.com> --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-sonnet-5-5` • Thinking: `xhigh`_ Change-Id: Ifbd9576c03e2cb8b507066286b74aa7bbe53a42f
Change-Id: I7b806b92e8d4551bc44623822a35db0c5199c452 Signed-off-by: Thomas Kosiewski <tk@coder.com>
Main landed #760 and #762, which touch the covered hydrate.go and server.go. The merge result keeps the lease changes and the model describes it: check.sh --record passed with every property true and the probe failing. Signed-off-by: Thomas Kosiewski <tk@coder.com> --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-sonnet-5-5` • Thinking: `xhigh`_ Change-Id: If01a9de30157fffae713a53a8a921c4a2559b51c
|
@codex review |
|
@codex security review |
Codex Review Summary: ✅ CompletedThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
🛡️ Codex Security ReviewSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a452f79647
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…git's trace descriptors free Codex round 1 on #768 raised two findings. The wait for an exclusive holder ignored the caller's context, so a canceled request or an expired budget kept polling for up to 30 s before git started. OpenLease, StartIn, RunIn, OutputIn and CombinedOutputIn take the context first. The wait ends with the context's error as soon as the context ends. updateRefStdin has no context and passes Background. Git reads GIT_TRACE=3 to 9 as open trace descriptors, so a lease on descriptor 3 received git's trace when an operator set GIT_TRACE=3. The lease now sits on descriptor 10 (LeaseFD) and descriptors 3 to 9 stay closed in the child. Signed-off-by: Thomas Kosiewski <tk@coder.com> --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-sonnet-5-5` • Thinking: `xhigh`_ Change-Id: Iab13f1ee31fcd1b4299de5062674ef9dae318b06
…change The covered functions that start git now pass their context to the lease starters. None of them changes push-lane scheduling. check.sh --record passed with every property true and the probe failing. Signed-off-by: Thomas Kosiewski <tk@coder.com> --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-sonnet-5-5` • Thinking: `xhigh`_ Change-Id: Ie53be30080c1f0c0c60c3eff1fe5fd8fbec1c277
|
@codex review |
|
@codex security review |
|
Codex Review: Didn't find any major issues. Bravo. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
🛡️ Codex Security ReviewSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
Change-Id: Ib914af347503e7a4dcc3720b7c7c471fddb63778 Signed-off-by: Thomas Kosiewski <tk@coder.com>
OpenLease created the lease file with O_CREATE, so a cache repository directory that serve cannot write, and that has no lease file yet, made every git read fail with an internal error. Main answers those reads. The lease now holds nothing in that one case: no git of serve can take a ref lock in a directory that git cannot write either. The unit tests now cover what only the end-to-end tests caught before: shared leases coexist, the file is private (mode 0600 under umask 0), a start gives up after the lease wait, OpenLease stops waiting once the children are stopping, and Attach refuses an exclusive lease. Signed-off-by: Thomas Kosiewski <tk@coder.com> --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-sonnet-5-5` • Thinking: `xhigh`_ Change-Id: I62791b175573e0bafcaaf41466b4def9f979979a
… the audit The audit test now has two layers. A non-test file that imports os/exec must be in execImporters, so a new file cannot start git unseen. The function-level check also sees an exec.Cmd literal, exec.Command held as a value, a shell or launcher program, and a package-level initializer. TestAuditSeesEveryWayToBuildGit proves each of them on small sources. runGitStdin, streamShowIndex and ReachableLFSOIDs get tests that a fake git holds the lease while it runs, and that the parent's copy is closed when the call returns. For ReachableLFSOIDs the test checks all three stages. The README of gitlimit states the viewcheck invariant as the code has it, and the comments no longer name descriptor 3. Signed-off-by: Thomas Kosiewski <tk@coder.com> --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-sonnet-5-5` • Thinking: `xhigh`_ Change-Id: Iaaba5c3cb166c1217fc6525c8564fc37681c3520
check.sh --record passed: every property holds, LaneSchedule, OtherWriters and Liveness pass, and the probe fails. The fingerprints are unchanged. Signed-off-by: Thomas Kosiewski <tk@coder.com> --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-sonnet-5-5` • Thinking: `xhigh`_ Change-Id: I32fc087261cb03cca31f4a6cf43e9b4d6ed87f47
|
@codex review |
|
@codex security review |
🛡️ Codex Security ReviewSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2238f844fd
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
… the pipes of a start that fails OpenLease fell back to a lease that holds nothing for any permission error when the directory had no lease file. A directory that serve cannot write can still have a writable refs/, so a git that ran there took ref locks with no lease, and a later TryExclusive could win while it lived. Now only EROFS selects the fallback. An existing lease file is opened read-only and locked, because flock needs no write access, so the lease is a real one. With no lease file the lease holds nothing, because nothing can write on a read-only filesystem. A permission error is an error. A start that fails before cmd.Start runs (the lease wait ended, or StopChildren began) now closes the pipes that the caller made with StdinPipe and StdoutPipe: exec closes them only in a Start that runs. Unit tests pin the boundary with a seam that reports EROFS (a missing directory, a directory serve cannot write, a lease file nobody can open, and an unreadable lease file on a read-only filesystem all fail), the real lease on a read-only filesystem, the pipes, and the Attach assertion on ExtraFiles. Signed-off-by: Thomas Kosiewski <tk@coder.com> --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-sonnet-5-5` • Thinking: `xhigh`_ Change-Id: I2dae79c5a6e84b2b3b741ae5e1abd1a872b90f79
…pen the scan's lease before its pipes The commit-graph attempt passed the outer context to the lease start, so a write that queued behind an exclusive holder kept waiting after its budget ended. It now passes the attempt's context. ReachableLFSOIDs made the pipes of its three stages before it took the lease, so a refused scan left ten descriptors open until a garbage collection. It takes the lease first. The per-stage test now checks that the child of every stage holds the lease file as descriptor 10, whatever order they exit in. Signed-off-by: Thomas Kosiewski <tk@coder.com> --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-sonnet-5-5` • Thinking: `xhigh`_ Change-Id: I63eafb01fc9497e20109e5301af2058df7219bd2
…d process-start blind spots The audit checks of a stale allow-list entry and of an unlisted file that imports os/exec had no test, because the module holds neither today. TestAuditChecksTheAllowLists runs them on synthetic input. A program named by a string literal now counts as git unless it is in nonGitPrograms (gpg, ssh-keygen), because no list of launchers (sh, env, flock, taskset, ...) is complete. os.StartProcess and syscall.Exec count as building a process, and a dot import of os/exec or gitlimit fails. The README states the read-only rule and the audit as built. Signed-off-by: Thomas Kosiewski <tk@coder.com> --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-sonnet-5-5` • Thinking: `xhigh`_ Change-Id: If7b0ff975b0fb3707d8f2e653beeb483b9a5750b
Change-Id: I457ad1be11c5da01d355f1e1a46b365cfce8fba8 Signed-off-by: Thomas Kosiewski <tk@coder.com>
check.sh --record passed: every property holds, LaneSchedule, OtherWriters and Liveness pass, and the probe fails. The fingerprints are unchanged. Signed-off-by: Thomas Kosiewski <tk@coder.com> --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-sonnet-5-5` • Thinking: `xhigh`_ Change-Id: I52089c622a3b9546840b11627d794c4dfb69bf42
|
@codex review |
|
@codex security review |
|
Codex Review: Didn't find any major issues. Already looking forward to the next diff. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
🛡️ Codex Security ReviewSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
… lease epoch only when serve creates the repository The merge brings the lease head 2238f84 (round 3 of #768) into this branch. The conflict was in gitlimit/lease.go, resolved with the lease side plus this branch's epoch functions. The epoch fix answers a Codex P1 on this PR: a git of an older release, which holds no lease, can outlive its server (a kill, and a graceful stop of v0.18.0, which exits 0 with its git children running). If OpenLease wrote the epoch at the first lease-aware git start in such a repository, a lock that this git made after that start was newer than the epoch, and the cleanup would delete it. Now only CreateEpoch writes the epoch, and EnsureCacheRepoCtx calls it when its own os.Mkdir created the repository directory, before git runs there. OpenLease and TryExclusive write nothing. A repository without an epoch (an older release created it, or its creation was interrupted) keeps every lock: cleanStaleRefLocks counts kept, logs one runbook line, takes no lease and writes no epoch. Signed-off-by: Thomas Kosiewski <tk@coder.com> --- _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-sonnet-5-5` • Thinking: `xhigh`_ Change-Id: Ie52ced9dff595fb2084ff4ddfd32fc3afc908994
Why
ThomasK33 asked to fix the open coder/openstorage issues and land them on main. For #490 that means a cache repository hit by a stale ref lock repairs itself without an operator, when no git that serve started can own the lock.
Deleting a ref lock is safe only when no such git is alive. Today serve cannot prove that. This PR adds the proof and deletes nothing. It is the first of three PRs. Next come the quarantine, the identity check and the counter as a function, and then the wiring into hydration with the e2e rows and the docs.
A user sees one change: each cache repository directory gets an empty file
codestorage.gitlease.lock(mode 0600) next tocodestorage.hydrate.lock. Nothing waits on it yet. On a read-only filesystem, reads still work as on main (see below). Three cases make every git start in a repository fail with an error where main did not, and each needs an operator or a full disk. (a) The lease file exists but serve cannot open it for writing, after a manualchmodorchown. (b) The repository root is not writable and has no lease file. (c) The disk is full and the repository has no lease file yet, which only a repository without a git start since the upgrade can be in. In each case the error names the lease file.What changes
gitlimit.StartIn,RunIn,OutputInandCombinedOutputInstart a git child with a sharedflockon<repo>/codestorage.gitlease.lockas its descriptor 10 (gitlimit.LeaseFD). Git reads the descriptors 2 to 9 as trace targets (GIT_TRACE=3), so the child has descriptors 3 to 9 closed. The parent closes its own copy afterStart. The child, its hooks and their children keep the descriptor. So the lock lasts as long as the process tree, and an orphan of a crashed serve still holds it.TryExclusivetakes the lock exclusively without waiting. Success proves that no git that serve started is alive in that repository. A start that finds the lock held exclusively waits up to 30 s and then fails withErrLeaseBusy. The wait ends at once with the caller's context error when that context ends. Nothing takes the exclusive lock in this PR.gitread.Run, the advertise, upload-pack and receive-pack children ingithttp/server.go, the commit-graph write, hydration'sgit init,for-each-refstream andupdate-ref --stdin, and the REST write helpers ininternal/api. The repack functionsrunGitStdinandstreamShowIndexand the LFS scan start git themselves. They callgitlimit.OpenLeaseandLease.Attach, and their signatures are the same. Two calls stay plain because they read no repository:git check-ref-formatandgit version.TestEveryGitStartTakesTheLeaseparses every non-test Go file in the module, in two layers. A file that importsos/execmust be inexecImporterswith a reason, so a new file cannot start git unseen. Inside one function (or one package-levelvar), the audit fails on a plaingitlimit.Start,Run,OutputorCombinedOutput, on a function that builds git and starts none through a lease-aware starter, and on a directcmd.Start,Run,OutputorCombinedOutputin such a function. It sees a command built withexec.Command,exec.CommandContext, anexec.Cmdliteral,exec.Commandheld as a value, or a shell or launcher program such assh -c.TestAuditSeesEveryWayToBuildGitproves each of those on small sources. Each allow-list entry has a reason. The audit does not see a helper in another package that starts git for its caller, or git started withoutos/exec, and the test says so.openstorage_viewchecktag panics when a plain start runs in a repository, or when a leased start runs in another repository than its lease. CI's test build and the e2e serve binary use that tag. Release builds do not.EROFS),OpenLeasedoes not fail: nothing can write a ref lock there, and reads work on main. An existing lease file is opened read-only and locked (flockneeds no write access), so the lease is a real one. With no lease file, the lease holds nothing andAttachadds no descriptor. Any other failure is an error, a permission error included: a directory that serve cannot write can still have a writablerefs/, where a git without the lease could take ref locks.StopChildrenbegan) closes the pipes that the caller made withStdinPipeandStdoutPipe. The commit-graph attempt passes its own context, so its budget bounds the wait for the lease, andReachableLFSOIDstakes the lease before it makes its pipes.internal/gitlimit/README.md(interface, invariants, side effects) and one line each in thelfsscanandjobsREADMEs.check.sh --record. The covered functions that start git changed only in the starter they call, and the model describes push-lane scheduling, not git starts.Verification
TestLeaseLivesWithTheGitProcessTreeruns a realgit update-refwhosereference-transactionhook parks in thepreparedstate, directly and behind the heap-cap shell wrapper. The exclusive try stays busy after the parent closed its copy and after only git (the leader) died. It succeeds once the whole process group is killed, and the stalerefs/heads/x.lockstays. That is the githttp: a stale ref lock left by a killed receive-pack can wedge fetches on that node #464 shape.TestStartInWaitsForAnExclusiveHolder,TestStartInStopsWaitingWhenItsContextEnds,TestTheLeaseIsOnlyOnLeaseFD,TestGitTraceToADescriptorBelowTenNeverReachesTheLease,TestLeaseEndsWithTheChildAndTheFileStays,TestFailedStartReleasesTheLeaseand twoopenstorage_viewchecktests cover the rest of the API and the panics.StartInwithoutAttach:TestLeaseLivesWithTheGitProcessTree/directand/heap_capfail withTryExclusive while the tree lives = <nil>, want ErrLeaseBusy.StartInthat keeps the parent's copy: the same test fails withtimed out waiting for the lease to end with the tree, andTestLeaseEndsWithTheChildAndTheFileStaysandTestFailedStartReleasesTheLeasefail withgit lease is busy.OpenLease:TestStartInStopsWaitingWhenItsContextEndsfails in both cases withRunIn kept waiting for the lease after its context ended.LeaseFDset back to 3:TestTheLeaseIsOnlyOnLeaseFDfails withexit status 3, andTestGitTraceToADescriptorBelowTenNeverReachesTheLeasefails withgit wrote 81 bytes of trace into the lease file. Its control shows that git writes that trace into a lease on descriptor 3.updateRefStdinback to plainCombinedOutput,gitread.Runback to plainRun, andwrefGitback tocmd.Output().TestEveryGitStartTakesTheLeasefails on each and names the line. Withgitread.Runplain,go test -tags=openstorage_viewcheck ./internal/gitreadalso panics:starts in ... without a lease; use gitlimit.StartIn.git init --bareof a half-initialized repository inTestEnsureCacheRepoCtx_PartialInitialization. The init now takes the lease.2588739f, and these fixes answer it). New unit tests, each with a mutant that turns it red:TestRunGitStdinHoldsTheLeaseInTheChildAndReleasesItsOwn,TestStreamShowIndexHoldsTheLeaseInTheChildAndReleasesItsOwnandTestReachableLFSOIDsLeaseFollowsEveryStageput a fakegitfirst onPATHthat exits and leaves a sleeper child behind. After the call returned, the exclusive try is busy, because the sleeper holds the lease. It succeeds once the sleeper is killed, so the parent kept no copy of its own. The LFS scan leaves three sleepers, one per stage, and the test kills them one by one and checks the lease stays busy until the last one is gone. Red mutants: nodefer lease.Close()inrunGitStdin,streamShowIndexandReachableLFSOIDs, andAttachfor the first stage only or for all but the last stage.TestSharedLeasesCoexist(mutant:LOCK_EXinOpenLease),TestLeaseFileIsPrivate(mode 0644),TestOpenLeaseStopsWaitingWhenChildrenAreStopping(theStopping()check removed),TestOpenLeaseGivesUpAfterTheLeaseWait(the 30 s bound removed),TestAttachRefusesAnExclusiveLease(theassertfremoved) andTestReadOnlyFilesystemWithALeaseFileHoldsARealLease,TestReadOnlyFilesystemWithoutALeaseFileStillRuns,TestReadOnlyFilesystemWithAnUnreadableLeaseFileFailsandTestOpenLeaseFailsClosedOutsideAReadOnlyFilesystem(the read-only boundary: five mutants of the fallback, and a permission error that falls back, are red). On a real read-only ext4 mount, a child ran without descriptor 10 andTryExclusivefailed closed.exec.Cmdliteral,exec.Commandas a value, a program that is not innonGitPrograms,os.StartProcessandsyscall.Exec, a dot import, package-levelvar, import alias).TestAuditChecksTheAllowListspins the stale-entry and unlisted-importer checks on synthetic input. The audit no longer relies on a list of launchers, because any program named by a literal that is notgpgorssh-keygencounts as git.TestReachableLFSOIDsLeaseFollowsEveryStagechecks that the child of each stage holds the lease file as descriptor 10, so a stage that misses the lease fails whatever order they exit in.TestStartInClosesThePipesOfAStartThatFails,TestCommitGraphAttemptBudgetBoundsTheLeaseWaitandTestReachableLFSOIDsLeavesNoPipeOpenWhenTheLeaseFailshave red mutants as well.3ffbca1e, with-tags=openstorage_viewcheck -race -count=1:./internal/githttpwithOPENSTORAGE_TEST_BACKEND=localok (1205.414 s),./internal/jobsok (531.480 s),./internal/apiok (548.429 s),./cmd/openstorageok (91.838 s). Thes3walrun of./internal/githttpfailed three tests,TestPush_PackPathJITFanoutSurvivesSmallBudget,TestPush_DoomedCreationReleasesHoldOnDenialandTestAtomicPush_StaleBaseDeniedBeforeAnyCAS, each atstart nodewithlisten tcp 127.0.0.1:0: bind: address already in use. That is loopback port exhaustion on the shared host (about 12,500 sockets in TIME_WAIT), before any code under test ran, so those three count as not run. I ran the three again alone with the same flags on the same head: all pass (57.177 s). The CI jobtest-s3walpassed on the head.a452f796(main's fix(api): answer 404 or 400 for a git check only when git says no #760 and fix(sync): refuse stale held snapshots on PostgreSQL and restore River push runs #762 merged in, before the fixes of review round 1), with-tags=openstorage_viewcheck -race -count=1:./internal/jobsok (524.060 s),./internal/apiok (576.693 s),./cmd/openstorageok (86.486 s),./internal/githttpwithOPENSTORAGE_TEST_BACKEND=localok (863.674 s) and withOPENSTORAGE_TEST_BACKEND=s3walok (1324.663 s).2588739f, with-tags=openstorage_viewcheck -race -count=1:./internal/jobsok (372.379 s),./internal/apiok (325.684 s),./cmd/openstorageok (74.322 s),./internal/githttpwithOPENSTORAGE_TEST_BACKEND=localok (909.097 s) and withOPENSTORAGE_TEST_BACKEND=s3walok (1218.973 s).a452f796) raised two P2 findings (the lease wait ignored the caller's context, and descriptor 3 is one of Git's trace descriptors), both fixed in04caacac. Round 2 (2588739f): the code review and the security review found nothing. Round 3 (2238f844) raised three P2 findings in the code review (a read-only lease file, the commit-graph attempt's context, and pipes left open when the lease start fails), all fixed and resolved. Round 4 on the final head3ffbca1e: the code review found no major issues, and the security review found no security issues. All five review threads are resolved.3ffbca1e:lint,test,test-local,test-s3wal,pr-title,terraform, bothimagejobs and both fingerprint jobs (lane-schedule-fingerprints,orphan-sweep-fingerprints) passed. Main's fix(gitread): decline a tree walk whose cat-file ended before the request #774 touches onlyinternal/gitread/tree_resume.go, which the audit already lists.locallane, at403912fe, failed after 884 s. My script kept only the last 40 lines, so I did not record which test failed and I cannot name it. Two later runs of that head passed (817.301 s and 787.329 s). Two more runs that I started in parallel failed in 19 tests withbind: address already in useon127.0.0.1:0, which is loopback port exhaustion on the shared host, so they are not a result../internal/gitlimit,./internal/gitread,./internal/lfsscanand./internal/simtestwith the same flags: ok.openstorage serve(verify-openstorage,osv.sh launch): after one push and one clone the cache repository holds the 0-bytecodestorage.gitlease.lock.flock -xnon it succeeded while the node was idle. It failed ("busy") while a 400 MB clone's client was stopped (SIGSTOP on the clone's own descendants), so the upload-pack was blocked on its output. It succeeded again when the clone had ended.go build ./...andgo vet -tags=openstorage_viewcheckon the touched packages: clean.golangci-lint2.15.0 on the touched packages: 0 issues.go build ./...andgo test -cforinternal/gitlimiton darwin and linux, amd64 and arm64: ok..agents/skills/verify-lane-schedule/check.sh --record: every property holds and the probe fails. Bothcheck.sh --fingerprints-onlygates (verify-lane-schedule,verify-orphan-sweep): PASS.python3 scripts/check-doc-links.py: 0 broken links.python3 scripts/test_check_doc_links.py: 80 tests OK.Refs #490
Generated with
xum• Model:anthropic:claude-sonnet-5-5• Thinking:xhigh