fix(patch): gate phases on the window deadline, queue undelivered results, retry startup inventory
The window deadline no longer kills a running package manager: it only gates the start of each phase, and a started upgrade runs under a 2 hour backstop that sends SIGTERM on Linux. A PatchResult whose send fails is queued and flushed on the next command stream, retaking the reboot decision. deb822 folded Suites continuation lines are filtered with the field. The startup static inventory report is retried until it succeeds.
This commit is contained in:
+21
-2
@@ -243,6 +243,11 @@ func connectAndHandleStream(ctx context.Context, cfg *config.Config) error {
|
||||
return stream.Send(msg)
|
||||
}
|
||||
|
||||
// Results that could not be sent on an earlier stream go out first. In
|
||||
// its own goroutine: a queued reboot re-check can take a while on
|
||||
// Windows, and the receive loop below must start promptly.
|
||||
go flushPendingResults(send)
|
||||
|
||||
// Stream liveness, tracked here rather than left to gRPC keepalive.
|
||||
//
|
||||
// Keepalive operates on the transport, and behind an L7 proxy the transport
|
||||
@@ -446,7 +451,7 @@ func runInventory(ctx context.Context, cfg *config.Config) {
|
||||
}
|
||||
defer client.Close()
|
||||
|
||||
report := func(static bool) {
|
||||
report := func(static bool) error {
|
||||
r := inventory.Collect(static)
|
||||
r.ServerId = cfg.ServerID
|
||||
r.AgentToken = cfg.AgentToken
|
||||
@@ -462,10 +467,18 @@ func runInventory(ctx context.Context, cfg *config.Config) {
|
||||
}
|
||||
if err := client.ReportInventory(r); err != nil {
|
||||
log.Printf("report inventory: %v", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
report(true)
|
||||
// The startup static report carries the boot time the server uses to
|
||||
// prove a patch reboot happened, so a failure is retried on the next
|
||||
// ticks (every 30 seconds, up to startupStaticAttempts in total) instead
|
||||
// of waiting a quarter of an hour for the next static snapshot.
|
||||
const startupStaticAttempts = 10
|
||||
attempts := 1
|
||||
startupPending := report(true) != nil
|
||||
ticker := time.NewTicker(30 * time.Second)
|
||||
defer ticker.Stop()
|
||||
tick := 0
|
||||
@@ -475,6 +488,12 @@ func runInventory(ctx context.Context, cfg *config.Config) {
|
||||
return
|
||||
case <-ticker.C:
|
||||
tick++
|
||||
if startupPending && attempts < startupStaticAttempts {
|
||||
attempts++
|
||||
startupPending = report(true) != nil
|
||||
continue
|
||||
}
|
||||
startupPending = false
|
||||
report(tick%30 == 0)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user