From 0b5960bb966aeb950dddd28e72746c964d305c29 Mon Sep 17 00:00:00 2001 From: Albert Bausili Date: Fri, 11 Sep 2026 06:07:33 +0200 Subject: [PATCH] chore: make go.mod the single source of truth for the Go floor (#417) The minimum Go version was stated four ways and three of them were wrong. go.mod and all nine submodules say 1.27.0, and CI pins 1.27.0, while: README.md (x2) Go 1.26.4+ CONTRIBUTING.md Go 1.26.3+ test/autobahn/README.md Go 1.22+ The README number is the one that matters: it is what a user reads before trying to build, and 1.26.4 cannot build a module whose go directive is 1.27.0. Rather than correct three copies of a number that has now drifted twice, each site states the current floor AND points at the go directive as the source of truth, so the next bump has one place to change. CONTRIBUTING's parenthetical justified 1.26.3 by the stdlib CVEs govulncheck surfaced on 1.26.2. That rationale expired with the floor it explained. Also drops the stale "in v1.4.0" stamps the issue lists, plus four more it does not: driver/postgres/rows.go, dsn.go and types_numeric.go. Every one marks a limitation that is still true, dated to a release three minors back, so a reader cannot tell whether the limitation or the date is the stale part. The limitations stay; the dates go. Left alone: SECURITY.md's "a Go 1.26.3 toolchain bump", which is a historical statement about what v1.4.2 shipped, and driver/redis/state.go's "before v1.4.0", which dates a past optimisation rather than a current limitation. Both are correct as history. --- CONTRIBUTING.md | 4 +++- README.md | 4 ++-- driver/memcached/client.go | 2 +- driver/postgres/dsn.go | 2 +- driver/postgres/protocol/types_numeric.go | 4 ++-- driver/postgres/rows.go | 2 +- driver/redis/cluster.go | 4 ++-- test/autobahn/README.md | 2 +- 8 files changed, 13 insertions(+), 11 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c789a02a..5f66edd1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,7 +13,9 @@ Thank you for your interest in contributing to celeris! ### Prerequisites -- Go 1.26.3+ (1.26.3 absorbs stdlib CVEs surfaced by govulncheck on 1.26.2: GO-2026-4971 in `net`, GO-2026-4918 in `net/http`) +- Go 1.27.0+ — the `go` directive in `go.mod` is the single source of truth for the floor, and + CI pins the same version. Quote it from there rather than restating it here, so the two + cannot drift apart again. - [Mage](https://magefile.org) build tool: `go install github.com/magefile/mage@latest` - Linux (for io_uring/epoll engine tests) or macOS (std engine only) - [golangci-lint](https://golangci-lint.run/) v2.9+ diff --git a/README.md b/README.md index e6f57408..f79c53e5 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ A correctness-focused release. Three concurrency fixes on the WebSocket and engi go get github.com/goceleris/celeris@latest ``` -Requires **Go 1.26.4+**. Linux for the io_uring / epoll / adaptive engines; any OS for the std engine. +Requires **Go 1.27.0+** (the `go` directive in `go.mod` is the source of truth). Linux for the io_uring / epoll / adaptive engines; any OS for the std engine. ```go package main @@ -424,7 +424,7 @@ validation/ Runtime invariant assertions + validation hooks (debug builds) ## Requirements -- **Go 1.26.4+** +- **Go 1.27.0+** (see the `go` directive in `go.mod`) - **Linux** for the io_uring / epoll / adaptive engines (kernel 5.10+ for io_uring; 5.19+ for the multishot / provided-buffers tier) - **Any OS** for the std engine - Direct runtime dependencies: `golang.org/x/sys` and `golang.org/x/net` only (`golang.org/x/text` is indirect) diff --git a/driver/memcached/client.go b/driver/memcached/client.go index 8bfd3833..e0240a65 100644 --- a/driver/memcached/client.go +++ b/driver/memcached/client.go @@ -30,7 +30,7 @@ type Client struct { // // addr may optionally include a "memcache://" or "memcached://" scheme // prefix; the prefix is stripped and the remaining "host:port" is used -// verbatim. TLS is not supported in v1.4.0. +// verbatim. TLS is not supported. func NewClient(addr string, opts ...Option) (*Client, error) { addr = strings.TrimPrefix(addr, "memcached://") addr = strings.TrimPrefix(addr, "memcache://") diff --git a/driver/postgres/dsn.go b/driver/postgres/dsn.go index ce21aff3..268052d3 100644 --- a/driver/postgres/dsn.go +++ b/driver/postgres/dsn.go @@ -254,7 +254,7 @@ func applyDefaults(d *DSN) { // CheckSSL returns ErrSSLNotSupported if the DSN requests a TLS mode this // driver version cannot satisfy. // -// In v1.4.0 the driver has no TLS stack. sslmode semantics: +// The driver has no TLS stack. sslmode semantics: // // - "" / "disable" : plaintext, always allowed. // - "prefer" / "allow" : the libpq semantics are "try TLS, fall diff --git a/driver/postgres/protocol/types_numeric.go b/driver/postgres/protocol/types_numeric.go index 321d1883..3b9bc10b 100644 --- a/driver/postgres/protocol/types_numeric.go +++ b/driver/postgres/protocol/types_numeric.go @@ -17,7 +17,7 @@ import ( // int16 dscale display scale (number of digits after decimal point) // int16 digits[ndigits] base-10000 digits, MSD first // -// Implementing a full arbitrary-precision encoder is deferred. For v1.4.0 we +// Implementing a full arbitrary-precision encoder is deferred. For now we // decode into a canonical string form and require callers to pass a string // when encoding so the server parses it in text form. @@ -138,7 +138,7 @@ func init() { Name: "numeric", DecodeBinary: decodeNumericBinary, DecodeText: decodeNumericText, - EncodeBinary: nil, // binary encode not implemented in v1.4.0 + EncodeBinary: nil, // binary encode not implemented EncodeText: encodeNumericText, ScanType: reflect.TypeOf(""), }) diff --git a/driver/postgres/rows.go b/driver/postgres/rows.go index edfbb34c..6a03b575 100644 --- a/driver/postgres/rows.go +++ b/driver/postgres/rows.go @@ -207,7 +207,7 @@ func (r *pgRows) ColumnTypeDatabaseTypeName(i int) string { } // HasNextResultSet reports whether a multi-statement simple query produced -// another result set after the current one. For v1.4.0 we flatten multi- +// another result set after the current one. The driver flattens multi- // statement results into a single pgRows, so this is always false. func (r *pgRows) HasNextResultSet() bool { return false } diff --git a/driver/redis/cluster.go b/driver/redis/cluster.go index 766f2e83..314f618b 100644 --- a/driver/redis/cluster.go +++ b/driver/redis/cluster.go @@ -56,10 +56,10 @@ type ClusterConfig struct { // error is returned. Default: 3. MaxRedirects int // RouteByLatency, when true, sends reads to the lowest-latency node. - // Not implemented in v1.4.0; reserved for future use. + // Not implemented; reserved for future use. RouteByLatency bool // ReadOnly, when true, allows reads from replica nodes. - // Not implemented in v1.4.0; reserved for future use. + // Not implemented; reserved for future use. ReadOnly bool Engine eventloop.ServerProvider diff --git a/test/autobahn/README.md b/test/autobahn/README.md index 03c26360..21c49d7d 100644 --- a/test/autobahn/README.md +++ b/test/autobahn/README.md @@ -27,7 +27,7 @@ each celeris engine. - Docker (for the Autobahn container — the project no longer ships native macOS binaries). -- Go 1.22+ to build the celeris server. +- A Go toolchain matching the `go` directive in the root `go.mod` to build the celeris server. - On Linux, `make autobahn` runs all three engines (std/epoll/io_uring) in parallel. On macOS only `std` is exercised.