From d1bb4f68070c67ed1488b9ed735dae5596e95893 Mon Sep 17 00:00:00 2001 From: Aaron Son Date: Fri, 24 Mar 2023 09:43:54 -0700 Subject: [PATCH] integration-tests/go-sql-server-driver: Add a test which fails when a non-chunk journal repo first switches to chunk journal and runs call dolt_gc. --- .../dtestutils/sql_server_driver/cmd.go | 11 ++++++++++- .../dtestutils/sql_server_driver/server.go | 2 ++ .../go-sql-server-driver/concurrent_gc_test.go | 6 ++++++ .../go-sql-server-driver/testdef.go | 12 ++++++------ .../tests/sql-server-orig.yaml | 18 ++++++++++++++++++ 5 files changed, 42 insertions(+), 7 deletions(-) diff --git a/go/libraries/doltcore/dtestutils/sql_server_driver/cmd.go b/go/libraries/doltcore/dtestutils/sql_server_driver/cmd.go index 25fea37c89..7572f79a89 100644 --- a/go/libraries/doltcore/dtestutils/sql_server_driver/cmd.go +++ b/go/libraries/doltcore/dtestutils/sql_server_driver/cmd.go @@ -178,6 +178,12 @@ func WithArgs(args ...string) SqlServerOpt { } } +func WithEnvs(envs ...string) SqlServerOpt { + return func(s *SqlServer) { + s.Cmd.Env = append(s.Cmd.Env, envs...) + } +} + func WithPort(port int) SqlServerOpt { return func(s *SqlServer) { s.Port = port @@ -235,7 +241,7 @@ func (s *SqlServer) ErrorStop() error { return s.Cmd.Wait() } -func (s *SqlServer) Restart(newargs *[]string) error { +func (s *SqlServer) Restart(newargs *[]string, newenvs *[]string) error { err := s.GracefulStop() if err != nil { return err @@ -245,6 +251,9 @@ func (s *SqlServer) Restart(newargs *[]string) error { args = append([]string{"sql-server"}, (*newargs)...) } s.Cmd = s.RecreateCmd(args...) + if newenvs != nil { + s.Cmd.Env = append(s.Cmd.Env, (*newenvs)...) + } stdout, err := s.Cmd.StdoutPipe() if err != nil { return err diff --git a/go/libraries/doltcore/dtestutils/sql_server_driver/server.go b/go/libraries/doltcore/dtestutils/sql_server_driver/server.go index 693c155479..766e117476 100644 --- a/go/libraries/doltcore/dtestutils/sql_server_driver/server.go +++ b/go/libraries/doltcore/dtestutils/sql_server_driver/server.go @@ -75,6 +75,7 @@ func (c Connection) Password() (string, error) { // example, to change server config on a restart. type RestartArgs struct { Args *[]string `yaml:"args"` + Envs *[]string `yaml:"envs"` } // |TestRepo| represents an init'd dolt repository that is available to a @@ -155,6 +156,7 @@ func (f WithFile) WriteAtDir(dir string) error { type Server struct { Name string `yaml:"name"` Args []string `yaml:"args"` + Envs []string `yaml:"envs"` // The |Port| which the server will be running on. For now, it is up to // the |Args| to make sure this is true. Defaults to 3308. diff --git a/integration-tests/go-sql-server-driver/concurrent_gc_test.go b/integration-tests/go-sql-server-driver/concurrent_gc_test.go index 0d8e754630..c6a3c5e6c2 100644 --- a/integration-tests/go-sql-server-driver/concurrent_gc_test.go +++ b/integration-tests/go-sql-server-driver/concurrent_gc_test.go @@ -223,5 +223,11 @@ func (gct gcTest) run(t *testing.T) { require.NoError(t, eg.Wait()) + // Recreate the connection pool here, since idle connections in the + // connection pool may be stale. + db.Close() + db, err = server.DB(driver.Connection{User: "root"}) + require.NoError(t, err) + gct.finalize(t, context.Background(), db) } diff --git a/integration-tests/go-sql-server-driver/testdef.go b/integration-tests/go-sql-server-driver/testdef.go index 19314303df..d9b7685e7e 100644 --- a/integration-tests/go-sql-server-driver/testdef.go +++ b/integration-tests/go-sql-server-driver/testdef.go @@ -37,10 +37,10 @@ type TestDef struct { // any Servers defined within them will be started. The interactions and // assertions defined in Conns will be run. type Test struct { - Name string `yaml:"name"` - Repos []driver.TestRepo `yaml:"repos"` - MultiRepos []driver.MultiRepo `yaml:"multi_repos"` - Conns []driver.Connection `yaml:"connections"` + Name string `yaml:"name"` + Repos []driver.TestRepo `yaml:"repos"` + MultiRepos []driver.MultiRepo `yaml:"multi_repos"` + Conns []driver.Connection `yaml:"connections"` // Skip the entire test with this reason. Skip string `yaml:"skip"` @@ -74,7 +74,7 @@ func MakeServer(t *testing.T, dc driver.DoltCmdable, s *driver.Server) *driver.S if s == nil { return nil } - opts := []driver.SqlServerOpt{driver.WithArgs(s.Args...)} + opts := []driver.SqlServerOpt{driver.WithArgs(s.Args...), driver.WithEnvs(s.Envs...)} if s.Port != 0 { opts = append(opts, driver.WithPort(s.Port)) } @@ -184,7 +184,7 @@ func (test Test) Run(t *testing.T) { }() } if c.RestartServer != nil { - err := server.Restart(c.RestartServer.Args) + err := server.Restart(c.RestartServer.Args, c.RestartServer.Envs) require.NoError(t, err) } } diff --git a/integration-tests/go-sql-server-driver/tests/sql-server-orig.yaml b/integration-tests/go-sql-server-driver/tests/sql-server-orig.yaml index ae1e8c4956..3da629ebe8 100644 --- a/integration-tests/go-sql-server-driver/tests/sql-server-orig.yaml +++ b/integration-tests/go-sql-server-driver/tests/sql-server-orig.yaml @@ -330,3 +330,21 @@ tests: queries: - exec: "INSERT INTO t1 VALUES (1, 1),(2, 2)" error_match: "table not found" +- name: dolt_gc succeeds as first write on existing database without a journal after chunk journal is enabled + multi_repos: + - name: server1 + server: + envs: ["DOLT_DISABLE_CHUNK_JOURNAL=true"] + connections: + - on: server1 + queries: + - exec: "CREATE DATABASE mydb" + - exec: "USE mydb" + - exec: "CREATE TABLE vals (id int primary key, val int)" + - exec: "INSERT INTO vals VALUES (1, 1),(2, 2)" + restart_server: + envs: [] + - on: server1 + queries: + - exec: "USE mydb" + - exec: "CALL dolt_gc()"