feat: rotate unsequenced client output safely
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user