feat: rotate unsequenced client output safely

This commit is contained in:
2026-09-06 06:55:10 +00:00
parent fe9fadbb01
commit 4fc16bdbe7
5 changed files with 326 additions and 2 deletions
+18 -2
View File
@@ -83,13 +83,15 @@ OR c.output_charged_bytes !=
func checkPayloads(ctx context.Context, database *sql.DB, maxScriptBytes uint64) (RecoveryReport, error) {
var report RecoveryReport
rows, err := database.QueryContext(ctx, `SELECT issue_uuid, payload, payload_sha256 FROM events ORDER BY issue_uuid, local_ordinal`)
rows, err := database.QueryContext(ctx, `SELECT issue_uuid, event_kind, raw_bytes, payload, payload_sha256 FROM events ORDER BY issue_uuid, local_ordinal`)
if err != nil {
return report, err
}
for rows.Next() {
var owner, payload, digest []byte
if err := rows.Scan(&owner, &payload, &digest); err != nil {
var kind uint32
var rawBytes uint64
if err := rows.Scan(&owner, &kind, &rawBytes, &payload, &digest); err != nil {
_ = rows.Close()
return report, err
}
@@ -98,6 +100,20 @@ func checkPayloads(ctx context.Context, database *sql.DB, maxScriptBytes uint64)
_ = rows.Close()
return report, ErrStoredPayloadChecksum
}
switch kind {
case EventKindOutput:
raw, err := outputChunkRaw(payload)
if err != nil || uint64(len(raw)) != rawBytes {
_ = rows.Close()
return report, ErrStoredPayloadChecksum
}
case EventKindOutputTruncation:
marker, err := decodeOutputLossMarker(payload)
if err != nil || marker.RemovedUncompressedBytes != rawBytes {
_ = rows.Close()
return report, ErrStoredPayloadChecksum
}
}
report.EventsChecked++
}
if err := rows.Close(); err != nil {