Fix stadium_grant_quota() donor floor; rerun std79 DoE clean, 81/81 (FABRIC-3.md §XVII)
capsule_birth.c hardcoded every new VM's initial Stadium quota grant to split from Hera specifically. Since a grant always halves whatever the donor currently has, Hera's own free list converges toward empty after a bounded number of grants — independent of whether the Stadium as a whole still had spare capacity, since VMs she'd granted to earlier typically still held nearly all of their own share untouched. Past that point every subsequent VM birth's Stadium grant would be silently refused (soft-failed, non-fatal by existing design), even with plenty of capacity sitting idle elsewhere. Fixed by adding an O(1)-maintained free_count to StadiumVMQuota (incremented in stadium_evict(), decremented at both of stadium_admit()'s free-list-pop sites, set/adjusted in stadium_grant_quota()'s own split — this also let grant_quota drop its old O(free-list length) counting walk in favor of an O(1) read) and stadium_best_donor(), an O(live VM count) scan over quota slots returning whichever in-use VM currently has the most free cells. capsule_birth.c's birth path now splits from that VM instead of unconditionally vm_uuid_hera(). Verified with another full rerun of the 3x9x3 std79 DoE campaign from scratch — same discipline as the prior Stadium fix (any defect repair reruns the whole DoE from the top) — one continuous boot per architecture, all 9 identities simultaneously live throughout. 81/81 trials correct, 0 mismatches, DOE-RUN header sequence md5-identical to every prior run. aarch64 ~280s total (vs ~290s for the O(ncells)-scan fix alone — confirms no regression). Both known Stadium defects are now closed together on one clean campaign rerun. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EXieurDfDSsDFdnSyusuWo
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
9eff122090
commit
e51a8d229e
@@ -636,10 +636,25 @@ CapsuleRunResult capsule_birth_baby(
|
||||
* STADIUM-ADMIT during that campaign refused unconditionally (quota
|
||||
* slot < 0), 100% of trials, on all three architectures. Trade-off this
|
||||
* introduces: a VM that dies stillborn below (IDENTITY exec fails) has
|
||||
* still consumed half of Hera's free list, with no rollback -- accepted
|
||||
* because stadium_grant_quota() failure was already non-fatal and a
|
||||
* stillbirth here is the rare case, not the common one. */
|
||||
(void)stadium_grant_quota(vm_id, vm_uuid_hera());
|
||||
* still consumed half of its donor's free list, with no rollback --
|
||||
* accepted because stadium_grant_quota() failure was already non-fatal
|
||||
* and a stillbirth here is the rare case, not the common one.
|
||||
*
|
||||
* Donor is whichever live VM currently holds the most free cells
|
||||
* (stadium_best_donor(), FABRIC-3.md SXVI) -- NOT unconditionally
|
||||
* vm_uuid_hera() as this used to hardcode. Always splitting from Hera
|
||||
* specifically converges HER free list toward empty after a bounded
|
||||
* number of grants (each halves what remains), silently refusing every
|
||||
* later birth once she runs dry even while VMs she granted to earlier
|
||||
* still hold nearly all of their own share untouched -- the Stadium as
|
||||
* a whole nowhere near full. Falls back to vm_uuid_hera() only if no VM
|
||||
* holds a quota yet (stadium_best_donor() returns vm_uuid_none()), which
|
||||
* should not happen here since stadium_birth_hera() always runs first. */
|
||||
{
|
||||
VMUuid donor = stadium_best_donor();
|
||||
if (vm_uuid_equal(donor, vm_uuid_none())) donor = vm_uuid_hera();
|
||||
(void)stadium_grant_quota(vm_id, donor);
|
||||
}
|
||||
|
||||
/* FABRIC-2.md SS B, VM-COOL: admit this VM as a patron of its own
|
||||
* quota -- identity 0 (same convention stadium_birth_hera() uses for
|
||||
|
||||
Reference in New Issue
Block a user