mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-07-12 07:36:07 +00:00
fix(db): clamp traffic counters below int64 max and repair overflowed rows
A counter pushed past int64 (multi-node setups hit this via historic delta-compounding bugs) makes SQLite silently promote the INTEGER cell to REAL. From then on the column no longer scans into the Go int64 field and every reader of client_traffics fails at once: the inbounds page, xray restarts, and node traffic sync all return "converting driver.Value type float64 to int64". Two-part fix: every unbounded "up = up + ?" add (local traffic, node delta merge, inbound counters, plus the Go-side outbound accumulation) now saturates at TrafficMax, a cap safely below math.MaxInt64 so one more delta cannot overflow; and a startup repair casts REAL-promoted cells back to INTEGER and clamps all traffic counters into [0, TrafficMax] across client_traffics, inbounds, outbound_traffics and node_client_traffics, restoring access to already-corrupted panels without manual sqlite surgery. Closes #5762
This commit is contained in:
@@ -2,6 +2,19 @@ package database
|
||||
|
||||
import "fmt"
|
||||
|
||||
// TrafficMax caps every traffic counter safely below math.MaxInt64 (~9.22e18)
|
||||
// so that one more delta can never overflow int64. SQLite silently promotes an
|
||||
// overflowing INTEGER to REAL, after which the column no longer scans into the
|
||||
// Go int64 field and every reader of the table fails (#5762).
|
||||
const TrafficMax = int64(9_000_000_000_000_000_000)
|
||||
|
||||
func ClampedAddExpr(col string) string {
|
||||
if IsPostgres() {
|
||||
return fmt.Sprintf("LEAST(%s + ?, %d)", col, TrafficMax)
|
||||
}
|
||||
return fmt.Sprintf("MIN(%s + ?, %d)", col, TrafficMax)
|
||||
}
|
||||
|
||||
func JSONClientsFromInbound() string {
|
||||
if IsPostgres() {
|
||||
return "FROM inbounds, jsonb_array_elements(inbounds.settings::jsonb -> 'clients') AS client(value)"
|
||||
|
||||
Reference in New Issue
Block a user