From 196f90a2b9fd9530adee5bedd67682469d8949f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ask=20Bj=C3=B8rn=20Hansen?= Date: Sun, 21 Sep 2025 00:08:21 -0700 Subject: [PATCH] fix(db): use int for netspeed_active to prevent overflow GetZoneStatsData and GetZoneStatsV2's netspeed_active values can exceed 2 billion, causing 32-bit integer overflow. Changed from int32/uint32 to int (64-bit on modern systems) to handle large network speed totals. - Update sqlc column overrides to use int type - Fix type compatibility in dnsanswers.go zoneTotals map - Regenerate database code with new types Fixes https://community.ntppool.org/t/error-message-displayed-on-the-monitoring-score-page/4063 --- ntpdb/models.go | 2 +- ntpdb/query.sql.go | 4 ++-- server/dnsanswers.go | 4 ++-- sqlc.yaml | 6 +++++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/ntpdb/models.go b/ntpdb/models.go index e271a08..e80c5bd 100644 --- a/ntpdb/models.go +++ b/ntpdb/models.go @@ -339,5 +339,5 @@ type ZoneServerCount struct { Date time.Time `db:"date" json:"date"` CountActive uint32 `db:"count_active" json:"count_active"` CountRegistered uint32 `db:"count_registered" json:"count_registered"` - NetspeedActive uint32 `db:"netspeed_active" json:"netspeed_active"` + NetspeedActive int `db:"netspeed_active" json:"netspeed_active"` } diff --git a/ntpdb/query.sql.go b/ntpdb/query.sql.go index a6efc9d..9bc63ab 100644 --- a/ntpdb/query.sql.go +++ b/ntpdb/query.sql.go @@ -421,7 +421,7 @@ type GetZoneStatsDataRow struct { IpVersion ZoneServerCountsIpVersion `db:"ip_version" json:"ip_version"` CountActive uint32 `db:"count_active" json:"count_active"` CountRegistered uint32 `db:"count_registered" json:"count_registered"` - NetspeedActive uint32 `db:"netspeed_active" json:"netspeed_active"` + NetspeedActive int `db:"netspeed_active" json:"netspeed_active"` } func (q *Queries) GetZoneStatsData(ctx context.Context) ([]GetZoneStatsDataRow, error) { @@ -484,7 +484,7 @@ AS server_netspeed type GetZoneStatsV2Row struct { ZoneName string `db:"zone_name" json:"zone_name"` - NetspeedActive int32 `db:"netspeed_active" json:"netspeed_active"` + NetspeedActive int `db:"netspeed_active" json:"netspeed_active"` } func (q *Queries) GetZoneStatsV2(ctx context.Context, ip string) ([]GetZoneStatsV2Row, error) { diff --git a/server/dnsanswers.go b/server/dnsanswers.go index ec26193..51f84f4 100644 --- a/server/dnsanswers.go +++ b/server/dnsanswers.go @@ -123,7 +123,7 @@ func (srv *Server) dnsAnswers(c echo.Context) error { return c.String(http.StatusInternalServerError, err.Error()) } - zoneTotals := map[string]int32{} + zoneTotals := map[string]int{} for _, z := range zoneStats { zn := z.ZoneName @@ -145,7 +145,7 @@ func (srv *Server) dnsAnswers(c echo.Context) error { if zt == 0 { // if the recorded netspeed for the zone was zero, assume it's at least // this servers worth instead. Otherwise the Netspeed gets to be 'infinite'. - zt = int32(serverNetspeed) + zt = int(serverNetspeed) } cc.Netspeed = (pointBasis / float64(zt)) * float64(serverNetspeed) } diff --git a/sqlc.yaml b/sqlc.yaml index 4994cbf..97f9216 100644 --- a/sqlc.yaml +++ b/sqlc.yaml @@ -18,4 +18,8 @@ sql: - column: log_scores.attributes go_type: go.ntppool.org/common/types.LogScoreAttributes - column: "server_netspeed.netspeed_active" - go_type: "uint64" + go_type: "int" + - column: "zone_server_counts.netspeed_active" + go_type: "int" + - db_type: "bigint" + go_type: "int"