From 1f7e7754e8af591d8b005e7a893f4ac9085a5020 Mon Sep 17 00:00:00 2001 From: Harshit Gangal Date: Wed, 12 Aug 2020 21:02:48 +0530 Subject: [PATCH] backport #6514 to 7.0 release branch Signed-off-by: Harshit Gangal --- go/vt/vttablet/endtoend/main_test.go | 7 +++ go/vt/vttablet/endtoend/reserve_test.go | 52 +++++++++++++++++++ go/vt/vttablet/tabletserver/query_executor.go | 10 ++-- 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/go/vt/vttablet/endtoend/main_test.go b/go/vt/vttablet/endtoend/main_test.go index 43de9592f12..d8722eacbfd 100644 --- a/go/vt/vttablet/endtoend/main_test.go +++ b/go/vt/vttablet/endtoend/main_test.go @@ -215,6 +215,13 @@ var tableACLConfig = `{ "writers": ["dev"], "admins": ["dev"] }, + { + "name": "vitess_test_ddl", + "table_names_or_prefixes": ["vitess_test_ddl"], + "readers": ["dev"], + "writers": ["dev"], + "admins": ["dev"] + }, { "name": "vitess_seq", "table_names_or_prefixes": ["vitess_seq"], diff --git a/go/vt/vttablet/endtoend/reserve_test.go b/go/vt/vttablet/endtoend/reserve_test.go index b4c5a626b38..a9958fa1225 100644 --- a/go/vt/vttablet/endtoend/reserve_test.go +++ b/go/vt/vttablet/endtoend/reserve_test.go @@ -799,6 +799,58 @@ func TestReserveExecuteWithExecuteFailureAndCheckConnectionAndDBState(t *testing require.Error(t, client.Release()) } +func TestReserveExecuteDDLWithoutTx(t *testing.T) { + client := framework.NewClient() + defer client.Release() + + connQuery := "select connection_id()" + createQuery := "create table vitess_test_ddl(id bigint primary key)" + dropQuery := "drop table vitess_test_ddl" + descQuery := "describe vitess_test_ddl" + + qr1, err := client.ReserveExecute(connQuery, nil, nil) + require.NoError(t, err) + + _, err = client.Execute(createQuery, nil) + require.NoError(t, err) + require.Zero(t, client.TransactionID()) + defer client.Execute(dropQuery, nil) + + qr2, err := client.Execute(connQuery, nil) + require.NoError(t, err) + assert.Equal(t, qr1.Rows, qr2.Rows) + + qr3, err := client.Execute(descQuery, nil) + require.NoError(t, err) + require.NotZero(t, qr3.Rows) +} + +func TestReserveExecuteDDLWithTx(t *testing.T) { + client := framework.NewClient() + defer client.Release() + + connQuery := "select connection_id()" + createQuery := "create table vitess_test_ddl(id bigint primary key)" + dropQuery := "drop table vitess_test_ddl" + descQuery := "describe vitess_test_ddl" + + qr1, err := client.ReserveBeginExecute(connQuery, nil, nil) + require.NoError(t, err) + + _, err = client.Execute(createQuery, nil) + require.NoError(t, err) + require.NotZero(t, client.TransactionID()) + defer client.Execute(dropQuery, nil) + + qr2, err := client.Execute(connQuery, nil) + require.NoError(t, err) + assert.Equal(t, qr1.Rows, qr2.Rows) + + qr3, err := client.Execute(descQuery, nil) + require.NoError(t, err) + require.NotZero(t, qr3.Rows) +} + func killConnection(t *testing.T, connID string) { client := framework.NewClient() _, err := client.ReserveExecute("select 1", []string{fmt.Sprintf("kill %s", connID)}, nil) diff --git a/go/vt/vttablet/tabletserver/query_executor.go b/go/vt/vttablet/tabletserver/query_executor.go index 13ad566677a..b2056eee21d 100644 --- a/go/vt/vttablet/tabletserver/query_executor.go +++ b/go/vt/vttablet/tabletserver/query_executor.go @@ -376,9 +376,13 @@ func (qre *QueryExecutor) execDDL(conn *StatefulConnection) (*sqltypes.Result, e if err != nil { return nil, err } - err = qre.BeginAgain(qre.ctx, conn) - if err != nil { - return nil, err + // Only perform this operation when the connection has transaction open. + // TODO: This actually does not retain the old transaction. We should see how to provide correct behaviour to client. + if conn.txProps != nil { + err = qre.BeginAgain(qre.ctx, conn) + if err != nil { + return nil, err + } } return result, nil }