fix: keep expired reservations reconcilable for delayed OSS logs

This commit is contained in:
2026-02-18 10:49:58 +08:00
parent 5eab1de03e
commit 751428a29a

View File

@@ -2119,7 +2119,6 @@ const DownloadTrafficReservationDB = {
return db.prepare(` return db.prepare(`
UPDATE user_download_traffic_reservations UPDATE user_download_traffic_reservations
SET status = 'expired', SET status = 'expired',
remaining_bytes = 0,
finalized_at = datetime('now', 'localtime'), finalized_at = datetime('now', 'localtime'),
updated_at = datetime('now', 'localtime') updated_at = datetime('now', 'localtime')
WHERE status = 'pending' WHERE status = 'pending'
@@ -2135,12 +2134,15 @@ const DownloadTrafficReservationDB = {
} }
const pendingRows = db.prepare(` const pendingRows = db.prepare(`
SELECT id, remaining_bytes SELECT id, remaining_bytes, status
FROM user_download_traffic_reservations FROM user_download_traffic_reservations
WHERE user_id = ? WHERE user_id = ?
AND status = 'pending' AND status IN ('pending', 'expired')
AND remaining_bytes > 0 AND remaining_bytes > 0
ORDER BY created_at ASC, id ASC ORDER BY
CASE WHEN status = 'pending' THEN 0 ELSE 1 END,
created_at ASC,
id ASC
`).all(uid); `).all(uid);
let consumed = 0; let consumed = 0;
@@ -2154,7 +2156,7 @@ const DownloadTrafficReservationDB = {
const useBytes = Math.min(remaining, rowRemaining); const useBytes = Math.min(remaining, rowRemaining);
const nextRemaining = rowRemaining - useBytes; const nextRemaining = rowRemaining - useBytes;
const nextStatus = nextRemaining <= 0 ? 'confirmed' : 'pending'; const nextStatus = nextRemaining <= 0 ? 'confirmed' : row.status;
db.prepare(` db.prepare(`
UPDATE user_download_traffic_reservations UPDATE user_download_traffic_reservations
@@ -2326,7 +2328,10 @@ const DownloadTrafficReservationDB = {
: 0; : 0;
return db.prepare(` return db.prepare(`
DELETE FROM user_download_traffic_reservations DELETE FROM user_download_traffic_reservations
WHERE status IN ('confirmed', 'expired', 'cancelled') WHERE (
status IN ('confirmed', 'cancelled')
OR (status = 'expired' AND COALESCE(remaining_bytes, 0) <= 0)
)
AND updated_at < datetime('now', 'localtime', '-' || ? || ' days') AND updated_at < datetime('now', 'localtime', '-' || ? || ' days')
`).run(days); `).run(days);
} }