From 6088fcae6789a2d8f7e3fa61aaed63e5a7ee38cb Mon Sep 17 00:00:00 2001 From: "shenmu.wy" Date: Mon, 18 Mar 2024 14:23:48 +0800 Subject: [PATCH 1/2] support simple proxy method: RunSimpleCopy --- .gitignore | 3 +- server/conn.go | 5 +++ server/handshake_resp.go | 3 ++ server/simple_example/main.go | 36 +++++++++++++++++ server/simple_proxy.go | 74 +++++++++++++++++++++++++++++++++++ 5 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 server/simple_example/main.go create mode 100644 server/simple_proxy.go diff --git a/.gitignore b/.gitignore index 68da35e5d..ce7d75586 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ var bin -.idea \ No newline at end of file +.idea +_build \ No newline at end of file diff --git a/server/conn.go b/server/conn.go index e71d9d42c..ad7011767 100644 --- a/server/conn.go +++ b/server/conn.go @@ -5,6 +5,7 @@ import ( "net" "sync/atomic" + "github.com/siddontang/go-log/log" "github.com/siddontang/go/sync2" . "github.com/go-mysql-org/go-mysql/mysql" @@ -31,6 +32,9 @@ type Conn struct { cachingSha2FullAuth bool h Handler + // net connection + // connGetter NetConnGetter + db string stmts map[uint32]*Stmt stmtID uint32 @@ -92,6 +96,7 @@ func NewCustomizedConn(conn net.Conn, serverConf *Server, p CredentialProvider, c.closed.Set(false) if err := c.handshake(); err != nil { + log.Error(err) c.Close() return nil, err } diff --git a/server/handshake_resp.go b/server/handshake_resp.go index 762843865..0687136bf 100644 --- a/server/handshake_resp.go +++ b/server/handshake_resp.go @@ -125,6 +125,9 @@ func (c *Conn) readDb(data []byte, pos int) (int, error) { db := string(data[pos : pos+bytes.IndexByte(data[pos:], 0x00)]) pos += len(db) + 1 + // save db name + c.db = db + if err := c.h.UseDB(db); err != nil { return 0, err } diff --git a/server/simple_example/main.go b/server/simple_example/main.go new file mode 100644 index 000000000..6424b4d1c --- /dev/null +++ b/server/simple_example/main.go @@ -0,0 +1,36 @@ +package main + +import ( + "net" + + "github.com/go-mysql-org/go-mysql/mysql" + "github.com/go-mysql-org/go-mysql/server" + "github.com/siddontang/go-log/log" +) + +func main() { + l, _ := net.Listen("tcp", "127.0.0.1:4306") + provider := server.NewInMemoryProvider() + provider.AddUser("root", "root") + // var tlsConf = server.NewServerTLSConfig(test_keys.CaPem, test_keys.CertPem, test_keys.KeyPem, tls.VerifyClientCertIfGiven) + for { + c, _ := l.Accept() + go func() { + // Create a connection with user root and an empty password. + // You can use your own handler to handle command here. + svr := server.NewServer("8.0.12", mysql.DEFAULT_COLLATION_ID, mysql.AUTH_CACHING_SHA2_PASSWORD, nil, nil) + conn, err := server.NewCustomizedConn(c, svr, provider, server.EmptyHandler{}) + + if err != nil { + log.Errorf("Connection error: %v", err) + return + } + + err = conn.RunSimpleCopy() + if err != nil { + log.Errorf(`simple proxy error: %v`, err) + return + } + }() + } +} diff --git a/server/simple_proxy.go b/server/simple_proxy.go new file mode 100644 index 000000000..77f21ead8 --- /dev/null +++ b/server/simple_proxy.go @@ -0,0 +1,74 @@ +package server + +import ( + "fmt" + "io" + "net" + + "github.com/go-mysql-org/go-mysql/client" + "github.com/siddontang/go-log/log" +) + +const ( + BackendAddr string = "backend_addr" + BackendUser string = "backend_user" + BackendPasswd string = "backend_passwd" +) + +type NetConnGetter interface { + GetConnection() net.Conn +} + +// RunSimpleCopy blocks until the front/back connection is close. +func (c *Conn) RunSimpleCopy() (err error) { + if c.Conn == nil { + return fmt.Errorf("connection closed") + } + + defer func() { + c.writeError(err) + c.Conn.Close() + }() + + // get backend connection info + var ( + addr, user, passwd string + backConn *client.Conn + ) + + addr = c.attributes[BackendAddr] + user = c.attributes[BackendUser] + passwd = c.attributes[BackendPasswd] + + if addr == "" || user == "" { + err = fmt.Errorf("connection attributes is invalid: %+v", c.attributes) + return err + } + + log.Infof("client %s try to connect backend(%s, %s, %s)", c.RemoteAddr().String(), addr, user, passwd) + + backConn, err = client.Connect(addr, user, passwd, c.db) + if err != nil { + return err + } + defer backConn.Close() + + // connect 2 connections + + var errChan = make(chan error) + cpFunc := func(dst io.Writer, src io.Reader) { + _, err = io.Copy(dst, src) + errChan <- err + } + go cpFunc(c.Conn, backConn) + go cpFunc(backConn, c.Conn) + err = <-errChan + if err != nil { + err = fmt.Errorf("unexpected disconnection: %+v", err) + return err + } + + log.Info("connection is closed on purpose") + + return nil +} From b17c3fd533251788d7f71fd22441d18bcd09d343 Mon Sep 17 00:00:00 2001 From: "shenmu.wy" Date: Mon, 18 Mar 2024 14:33:42 +0800 Subject: [PATCH 2/2] remove some github workflow --- .github/workflows/ci.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d473979e3..6b7ef2dd2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,8 +5,8 @@ jobs: test: strategy: matrix: - go: [ "1.21", "1.20", "1.19" ] - os: [ ubuntu-22.04, ubuntu-20.04 ] + go: [ "1.20"] + os: [ ubuntu-22.04 ] name: Tests Go ${{ matrix.go }} on ${{ matrix.os }} # This name is used in main branch protection rules runs-on: ${{ matrix.os }} @@ -42,22 +42,22 @@ jobs: go test $(go list ./... | grep -v canal) go test $(go list ./... | grep canal) - golangci: - name: golangci - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: golangci-lint - uses: golangci/golangci-lint-action@v2 - with: - version: latest - args: --timeout=3m + # golangci: + # name: golangci + # runs-on: ubuntu-latest + # steps: + # - uses: actions/checkout@v2 + # - name: golangci-lint + # uses: golangci/golangci-lint-action@v2 + # with: + # version: latest + # args: --timeout=3m platforms: strategy: matrix: - arch: [ "amd64", "arm64" ] - os: [ "linux", "freebsd", "darwin" ] + arch: [ "amd64"] + os: [ "linux"] name: platforms runs-on: ubuntu-latest steps: