From d2d72ea2dce147071ffaeb02f8ed27132faca159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Tue, 1 Apr 2025 08:22:59 +0200 Subject: [PATCH 01/14] server: Rework NewConn/defaultServer --- server/conn.go | 26 ++------------------------ server/server_conf.go | 2 -- 2 files changed, 2 insertions(+), 26 deletions(-) diff --git a/server/conn.go b/server/conn.go index 38769b71d..47b2d5e01 100644 --- a/server/conn.go +++ b/server/conn.go @@ -42,31 +42,9 @@ var baseConnID uint32 = 10000 func NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, error) { p := NewInMemoryProvider() p.AddUser(user, password) + server := NewDefaultServer() - var packetConn *packet.Conn - if defaultServer.tlsConfig != nil { - packetConn = packet.NewTLSConn(conn) - } else { - packetConn = packet.NewConn(conn) - } - - c := &Conn{ - Conn: packetConn, - serverConf: defaultServer, - credentialProvider: p, - h: h, - connectionID: atomic.AddUint32(&baseConnID, 1), - stmts: make(map[uint32]*Stmt), - salt: mysql.RandomBuf(20), - } - c.closed.Store(false) - - if err := c.handshake(); err != nil { - c.Close() - return nil, err - } - - return c, nil + return NewCustomizedConn(conn, server, p, h) } // NewCustomizedConn: create connection with customized server settings diff --git a/server/server_conf.go b/server/server_conf.go index b01b42057..de049f000 100644 --- a/server/server_conf.go +++ b/server/server_conf.go @@ -8,8 +8,6 @@ import ( "github.com/go-mysql-org/go-mysql/mysql" ) -var defaultServer = NewDefaultServer() - // Defines a basic MySQL server with configs. // // We do not aim at implementing the whole MySQL connection suite to have the best compatibilities for the clients. From 4a9e2b131ecc7946daa69a8d2ed23fe767f259a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Tue, 1 Apr 2025 10:09:40 +0200 Subject: [PATCH 02/14] Make NewConn and NewCustomizedConn into methods --- cmd/go-mysqlserver/main.go | 3 ++- server/conn.go | 22 +++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/cmd/go-mysqlserver/main.go b/cmd/go-mysqlserver/main.go index bf663976f..23e030632 100644 --- a/cmd/go-mysqlserver/main.go +++ b/cmd/go-mysqlserver/main.go @@ -26,7 +26,8 @@ func main() { // Create a connection with user root and an empty password. // You can use your own handler to handle command here. - conn, err := server.NewConn(c, "root", "", server.EmptyHandler{}) + srv := server.NewDefaultServer() + conn, err := srv.NewConn(c, "root", "", server.EmptyHandler{}) if err != nil { log.Fatal(err) } diff --git a/server/conn.go b/server/conn.go index 47b2d5e01..47c99a696 100644 --- a/server/conn.go +++ b/server/conn.go @@ -39,18 +39,30 @@ type Conn struct { var baseConnID uint32 = 10000 // NewConn: create connection with default server settings +// Deprecated: Use Server.NewConn instead. func NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, error) { + s := NewDefaultServer() + return s.NewConn(conn, user, password, h) +} + +// NewCustomizedConn: create connection with customized server settings +// Deprecated: Use Server.NewConn instead. +func NewCustomizedConn(conn net.Conn, serverConf *Server, p CredentialProvider, h Handler) (*Conn, error) { + return serverConf.NewCustomizedConn(conn, p, h) +} + +// NewConn: create connection with default server settings +func (s *Server) NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, error) { p := NewInMemoryProvider() p.AddUser(user, password) - server := NewDefaultServer() - return NewCustomizedConn(conn, server, p, h) + return s.NewCustomizedConn(conn, p, h) } // NewCustomizedConn: create connection with customized server settings -func NewCustomizedConn(conn net.Conn, serverConf *Server, p CredentialProvider, h Handler) (*Conn, error) { +func (s *Server) NewCustomizedConn(conn net.Conn, p CredentialProvider, h Handler) (*Conn, error) { var packetConn *packet.Conn - if serverConf.tlsConfig != nil { + if s.tlsConfig != nil { packetConn = packet.NewTLSConn(conn) } else { packetConn = packet.NewConn(conn) @@ -58,7 +70,7 @@ func NewCustomizedConn(conn net.Conn, serverConf *Server, p CredentialProvider, c := &Conn{ Conn: packetConn, - serverConf: serverConf, + serverConf: s, credentialProvider: p, h: h, connectionID: atomic.AddUint32(&baseConnID, 1), From 11d424c94bf8f975b92b393d1712cd804c519a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Tue, 1 Apr 2025 10:13:52 +0200 Subject: [PATCH 03/14] Add defaultServer back for now --- server/conn.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/server/conn.go b/server/conn.go index 47c99a696..9759629d2 100644 --- a/server/conn.go +++ b/server/conn.go @@ -37,12 +37,15 @@ type Conn struct { } var baseConnID uint32 = 10000 +var defaultServer *Server // NewConn: create connection with default server settings // Deprecated: Use Server.NewConn instead. func NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, error) { - s := NewDefaultServer() - return s.NewConn(conn, user, password, h) + if defaultServer == nil { + defaultServer = NewDefaultServer() + } + return defaultServer.NewConn(conn, user, password, h) } // NewCustomizedConn: create connection with customized server settings From fdfe0b26e1b8a74e028c43bfa0ebbe0fa18887ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Tue, 1 Apr 2025 10:38:29 +0200 Subject: [PATCH 04/14] Update server/conn.go Co-authored-by: ccoVeille <3875889+ccoVeille@users.noreply.github.com> --- server/conn.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/conn.go b/server/conn.go index 9759629d2..13a0d5488 100644 --- a/server/conn.go +++ b/server/conn.go @@ -38,8 +38,9 @@ type Conn struct { var baseConnID uint32 = 10000 var defaultServer *Server - -// NewConn: create connection with default server settings + // NewConn: create connection with default server settings +// +// Deprecated: Use Server.NewConn instead. // Deprecated: Use Server.NewConn instead. func NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, error) { if defaultServer == nil { From ac35ad0ad7e63357a728d377101f6722b0ed7e2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Tue, 1 Apr 2025 10:39:03 +0200 Subject: [PATCH 05/14] Update server/conn.go Co-authored-by: ccoVeille <3875889+ccoVeille@users.noreply.github.com> --- server/conn.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/conn.go b/server/conn.go index 13a0d5488..4606f277e 100644 --- a/server/conn.go +++ b/server/conn.go @@ -46,8 +46,9 @@ func NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, err if defaultServer == nil { defaultServer = NewDefaultServer() } - return defaultServer.NewConn(conn, user, password, h) -} +// NewCustomizedConn: create connection with customized server settings +// +// Deprecated: Use [Server.NewConn] instead. // NewCustomizedConn: create connection with customized server settings // Deprecated: Use Server.NewConn instead. From 162e81d2603ea7a90a9595d3b892dd87f9ee0cda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Tue, 1 Apr 2025 16:24:47 +0200 Subject: [PATCH 06/14] Update server/conn.go Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> --- server/conn.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/conn.go b/server/conn.go index 4606f277e..14abd0708 100644 --- a/server/conn.go +++ b/server/conn.go @@ -40,8 +40,8 @@ var baseConnID uint32 = 10000 var defaultServer *Server // NewConn: create connection with default server settings // -// Deprecated: Use Server.NewConn instead. -// Deprecated: Use Server.NewConn instead. +// Deprecated: Use [Server.NewConn] instead. +// Deprecated: Use [Server.NewConn] instead. func NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, error) { if defaultServer == nil { defaultServer = NewDefaultServer() From c52c70e09df772c68d41767fad09f146353b1efd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Wed, 2 Apr 2025 07:33:07 +0200 Subject: [PATCH 07/14] Update server/conn.go Co-authored-by: ccoVeille <3875889+ccoVeille@users.noreply.github.com> --- server/conn.go | 1 - 1 file changed, 1 deletion(-) diff --git a/server/conn.go b/server/conn.go index 14abd0708..c64bd62b1 100644 --- a/server/conn.go +++ b/server/conn.go @@ -41,7 +41,6 @@ var defaultServer *Server // NewConn: create connection with default server settings // // Deprecated: Use [Server.NewConn] instead. -// Deprecated: Use [Server.NewConn] instead. func NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, error) { if defaultServer == nil { defaultServer = NewDefaultServer() From 3ccf5687383619db0c68cfd6a497ec5a12089b3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Wed, 2 Apr 2025 07:33:23 +0200 Subject: [PATCH 08/14] Update server/conn.go Co-authored-by: ccoVeille <3875889+ccoVeille@users.noreply.github.com> --- server/conn.go | 1 - 1 file changed, 1 deletion(-) diff --git a/server/conn.go b/server/conn.go index c64bd62b1..2aa7eb541 100644 --- a/server/conn.go +++ b/server/conn.go @@ -48,7 +48,6 @@ func NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, err // NewCustomizedConn: create connection with customized server settings // // Deprecated: Use [Server.NewConn] instead. - // NewCustomizedConn: create connection with customized server settings // Deprecated: Use Server.NewConn instead. func NewCustomizedConn(conn net.Conn, serverConf *Server, p CredentialProvider, h Handler) (*Conn, error) { From 10ef38e87055fe20b4c774910e9d1cf88dd48456 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Wed, 2 Apr 2025 07:37:17 +0200 Subject: [PATCH 09/14] fixup --- server/conn.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/server/conn.go b/server/conn.go index 2aa7eb541..9698d5de6 100644 --- a/server/conn.go +++ b/server/conn.go @@ -38,18 +38,19 @@ type Conn struct { var baseConnID uint32 = 10000 var defaultServer *Server - // NewConn: create connection with default server settings + +// NewConn: create connection with default server settings // // Deprecated: Use [Server.NewConn] instead. func NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, error) { if defaultServer == nil { defaultServer = NewDefaultServer() } +} + // NewCustomizedConn: create connection with customized server settings // // Deprecated: Use [Server.NewConn] instead. -// NewCustomizedConn: create connection with customized server settings -// Deprecated: Use Server.NewConn instead. func NewCustomizedConn(conn net.Conn, serverConf *Server, p CredentialProvider, h Handler) (*Conn, error) { return serverConf.NewCustomizedConn(conn, p, h) } From 052c3f8dca5186ca75f0197df8aef1dcf9f8d2ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Wed, 2 Apr 2025 07:43:38 +0200 Subject: [PATCH 10/14] fix missing return --- server/conn.go | 1 + 1 file changed, 1 insertion(+) diff --git a/server/conn.go b/server/conn.go index 9698d5de6..c9955977a 100644 --- a/server/conn.go +++ b/server/conn.go @@ -46,6 +46,7 @@ func NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, err if defaultServer == nil { defaultServer = NewDefaultServer() } + return defaultServer.NewConn(conn, user, password, h) } // NewCustomizedConn: create connection with customized server settings From 72bfc2b9cec1cefe4a68f6be5f39bbdb9fa66c27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Wed, 2 Apr 2025 07:47:41 +0200 Subject: [PATCH 11/14] Fix formatting --- server/conn.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server/conn.go b/server/conn.go index c9955977a..1de15a67a 100644 --- a/server/conn.go +++ b/server/conn.go @@ -36,8 +36,10 @@ type Conn struct { closed atomic.Bool } -var baseConnID uint32 = 10000 -var defaultServer *Server +var ( + baseConnID uint32 = 10000 + defaultServer *Server +) // NewConn: create connection with default server settings // From 587cde92d362836648b3b2105a510e89cbe7ef18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Wed, 2 Apr 2025 07:49:44 +0200 Subject: [PATCH 12/14] Fix deprecation statement --- server/conn.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/conn.go b/server/conn.go index 1de15a67a..4b7c53186 100644 --- a/server/conn.go +++ b/server/conn.go @@ -53,7 +53,7 @@ func NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, err // NewCustomizedConn: create connection with customized server settings // -// Deprecated: Use [Server.NewConn] instead. +// Deprecated: Use [Server.NewCustomizedConn] instead. func NewCustomizedConn(conn net.Conn, serverConf *Server, p CredentialProvider, h Handler) (*Conn, error) { return serverConf.NewCustomizedConn(conn, p, h) } From ab1308e9bb6c1f1afab6eafe476a625ae89c37f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Wed, 2 Apr 2025 07:53:07 +0200 Subject: [PATCH 13/14] Fix use of deprecated method --- driver/driver_options_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/driver/driver_options_test.go b/driver/driver_options_test.go index ce96b369f..77af051a0 100644 --- a/driver/driver_options_test.go +++ b/driver/driver_options_test.go @@ -275,6 +275,8 @@ func CreateMockServer(t *testing.T) *testServer { handler := &mockHandler{} + s := server.NewDefaultServer() + go func() { for { conn, err := l.Accept() @@ -283,7 +285,7 @@ func CreateMockServer(t *testing.T) *testServer { } go func() { - co, err := server.NewCustomizedConn(conn, defaultServer, inMemProvider, handler) + co, err := s.NewCustomizedConn(conn, inMemProvider, handler) if err != nil { return } From 4c892f9f5c62657f0beeb6278dca9cbc9258c7aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Wed, 2 Apr 2025 08:09:40 +0200 Subject: [PATCH 14/14] Use sync.OnceValue() --- server/conn.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/conn.go b/server/conn.go index 4b7c53186..ad3509aea 100644 --- a/server/conn.go +++ b/server/conn.go @@ -3,6 +3,7 @@ package server import ( "errors" "net" + "sync" "sync/atomic" "github.com/go-mysql-org/go-mysql/mysql" @@ -38,17 +39,16 @@ type Conn struct { var ( baseConnID uint32 = 10000 - defaultServer *Server + defaultServer = sync.OnceValue(func() *Server { + return NewDefaultServer() + }) ) // NewConn: create connection with default server settings // // Deprecated: Use [Server.NewConn] instead. func NewConn(conn net.Conn, user string, password string, h Handler) (*Conn, error) { - if defaultServer == nil { - defaultServer = NewDefaultServer() - } - return defaultServer.NewConn(conn, user, password, h) + return defaultServer().NewConn(conn, user, password, h) } // NewCustomizedConn: create connection with customized server settings