carlos / platform Public

host: the return step reads the instance record judged (TestNoUnjudgedRecordReads) and answers only for the forward's lifetime; census re-pinned

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 6562a764a765182c2308e7167e33647a6692f99f parent 1b85241
3 files changed, +8 −3
  • internal/host/movesoffline_return.go +6 −1
  • internal/provision/self_serve_moves2_census_test.go +1 −1
  • internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv +1 −1
diff --git a/internal/host/movesoffline_return.go b/internal/host/movesoffline_return.go
index e6430899d..6ff586811 100644
--- a/internal/host/movesoffline_return.go
+++ b/internal/host/movesoffline_return.go
@@ -179,10 +179,15 @@ func (w *movesWorker) answerReturn(ctx context.Context, s release.Store, o *move
} else if !errors.Is(err, os.ErrNotExist) {
return err
}
- rec, err := provision.GetRecord(ctx, s, o.Account, o.App, o.Host)
+ // Judged, under the pass's judge (WithLifetimes): a record of another
+ // lifetime than the forward's is not answered for.
+ rec, _, err := provision.ReadRecordJudged(ctx, s, provision.JudgeFrom(ctx), o.Account, o.App, o.Host)
if err != nil {
return fmt.Errorf("the record: %w", err)
}
+ if rec.Incarnation != o.Incarnation {
+ return nil
+ }
// The ready facts as for a move of this host onto this box, the
// forward's id naming the park directory it left.
ret := *rec
diff --git a/internal/provision/self_serve_moves2_census_test.go b/internal/provision/self_serve_moves2_census_test.go
index 16875cbfe..139abd721 100644
--- a/internal/provision/self_serve_moves2_census_test.go
+++ b/internal/provision/self_serve_moves2_census_test.go
@@ -209,7 +209,7 @@ func plan14SelfServeMoves2WriteCensusInventory() []censusEntry {
{"internal/console/apiinstancemove_offline.go", "Server.readOfflineEvidence", "key-site", "key:OpenRecordKey", "09b3dd97c2e4fb9828d04e09a451a4380b1a9dc321640f6d57f18a217547af12"},
{"internal/console/offlinereturn.go", "Server.handleAPIInstanceOfflineReturn", "nonrecord", "sel:Put", "166c1282a02472a2105220bfbf553ded1a59717a78939ed20c3a86c48ba41c1e"},
{"internal/console/offlinereturn.go", "Server.readOpenRecord", "key-site", "key:OpenRecordKey", "809cf07d965d8bd136a1d463e5df3c435c086598359432630fa9d5fea6cd8950"},
- {"internal/host/movesoffline_return.go", "movesWorker.answerReturn", "nonrecord", "sel:Put", "40b7135d8f91e7606c3b9c20d80a00e364b34e7547273ed88f192249fa19a0d8"},
+ {"internal/host/movesoffline_return.go", "movesWorker.answerReturn", "nonrecord", "sel:Put", "e77f5490f87f010437e94a9fc46cf48c471f9f2d9f32d1386fbd0446cb2a1d06"},
{"internal/host/movesoffline_return.go", "movesWorker.scanReturns", "key-site", "key:OpenRecordKey", "59ccfef1e3cb9f7abb5d4f6e553ccb23bc83ebf1d2a41533247b16ac50ce6ad9"},
{"internal/console/authcli.go", "Server.registerCLIRoutes", "key-site", "lit:instances,lit:sidecars", "0af692569c69daef180738395057594bd8413fdf6d9e1c4cc91f0a924ab3ef7b"},
}
diff --git a/internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv b/internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv
index bcb2fbe71..c42a100be 100644
--- a/internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv
+++ b/internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv
@@ -124,7 +124,7 @@ internal/host/movespass.go armOffline legacy accepted-legacy accepted-legacy;rev
internal/host/probes.go stagePathActive legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as configPathActive): systemctl is-active carlos-stage.path for the precheck's and the ready report's stage-path fact; self-serve moves 2 Task 6 file:Command@42 f7cbe0e2ba971d201f8fc7111eb4cebac9c9bae14cc826366c06b9e8bd3eecb8
@legacy 6febdffd5ed3a46ca7c8296e2bf12d8249561e26ab6479eb672f40a96b13f0f4 internal/status/snapshot.go CollectBox legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route; self-serve moves 2 Task 6: carries Probes.BoxID, Lanes and Hosts into the private BoxMetrics only (never the public feed); read sites unchanged, offsets moved registry:Alias@4465,registry:CertExpiresAt@3160,registry:CertExpiresAt@3396,registry:CertExpiresAt@4580,registry:DBPath@2495,registry:DBPath@2553,registry:DNSCheckedAt@3365,registry:DNSCheckedAt@4549,registry:DNSStatus@3139,registry:DNSStatus@3334,registry:DNSStatus@4519,registry:Hibernate@3853,registry:Host@2295,registry:Host@2437,registry:Host@2666,registry:Host@3280,registry:Host@3315,registry:Host@4500,registry:Kind@2473,registry:Kind@3807,registry:Platform@2152,registry:ServingVersion@2324,registry:ServingVersion@2447,registry:Socket@3988,registry:Version@2186,registry:Version@2305,whole:Route@1581,whole:RouteAlias@4362 e874e3166d22d437b4d4daf2b1dc8b2d56bc853076cc132b9b2c1d30f9a2b1be
internal/status/snapshot.go CollectBox legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-route; self-serve moves 2 Task 6: carries Probes.BoxID, Lanes and Hosts into the private BoxMetrics only (never the public feed); read sites unchanged, offsets moved registry:Alias@4465,registry:CertExpiresAt@3160,registry:CertExpiresAt@3396,registry:CertExpiresAt@4580,registry:DBPath@2495,registry:DBPath@2553,registry:DNSCheckedAt@3365,registry:DNSCheckedAt@4549,registry:DNSStatus@3139,registry:DNSStatus@3334,registry:DNSStatus@4519,registry:Hibernate@3853,registry:Host@2295,registry:Host@2437,registry:Host@2666,registry:Host@3280,registry:Host@3315,registry:Host@4500,registry:Kind@2473,registry:Kind@3807,registry:Platform@2152,registry:ServingVersion@2324,registry:ServingVersion@2447,registry:Socket@3988,registry:Version@2186,registry:Version@2305,whole:Route@1581,whole:RouteAlias@4362 e874e3166d22d437b4d4daf2b1dc8b2d56bc853076cc132b9b2c1d30f9a2b1be
-@coverage internal/host c5aa167f6a692d75fb65726e2f0fa2dfa30267004a9406518f9854434f0993c0
+@coverage internal/host 73e7147a7ae827fd328144093c234003b721bebdfc4882d52358e28ab1393fa0
@coverage internal/lease 7e2a4a3652f964aaf1ee32356d2538a292c66ee0aaf9e622cf087b644aeaaa61
@coverage internal/status 6bf65bf3b04fdc150e2ec35d2d0d67046cf37b7c60a9dcde1c2204b75bcf8d2b
# Task 6 fix round 1 (the import cycle internal/park's tests saw), rev3=PROPOSED-self-serve-moves-2: PlacementMatches moves into internal/regionname (park.PlacementMatches delegates to it, unchanged in behaviour) so internal/moves no longer imports internal/park; no root read is added or moved. Envelopes: internal/moves in place, internal/park and internal/regionname added.