From 8c20289c7de31eabf978ead77270fe6115790fa9 Mon Sep 17 00:00:00 2001 From: lysu Date: Wed, 10 Jul 2019 19:28:19 +0800 Subject: [PATCH] server: don't interrupt when nodelay executed (#11135) --- server/conn.go | 4 ++-- server/conn_test.go | 34 +++++++++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/server/conn.go b/server/conn.go index d9a780b8fe02d..c80116e01584c 100644 --- a/server/conn.go +++ b/server/conn.go @@ -1176,9 +1176,9 @@ func (cc *clientConn) handleQuery(ctx context.Context, sql string) (err error) { return err } status := atomic.LoadInt32(&cc.status) - if status == connStatusShutdown || status == connStatusWaitShutdown { + if rs != nil && (status == connStatusShutdown || status == connStatusWaitShutdown) { killConn(cc) - return errors.New("killed by another connection") + return executor.ErrQueryInterrupted } if rs != nil { if len(rs) == 1 { diff --git a/server/conn_test.go b/server/conn_test.go index ee59c01a47dee..3faed0280a994 100644 --- a/server/conn_test.go +++ b/server/conn_test.go @@ -26,8 +26,10 @@ import ( "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/util/arena" "github.com/pingcap/tidb/util/testleak" @@ -38,7 +40,7 @@ type ConnTestSuite struct { store kv.Storage } -var _ = Suite(ConnTestSuite{}) +var _ = Suite(&ConnTestSuite{}) func (ts *ConnTestSuite) SetUpSuite(c *C) { testleak.BeforeTest() @@ -420,7 +422,7 @@ func (ts *ConnTestSuite) TestConnExecutionTimeout(c *C) { c.Assert(err, IsNil) err = cc.handleQuery(context.Background(), "select * FROM testTable2 WHERE SLEEP(1);") - c.Assert(err, NotNil) + c.Assert(err, IsNil) _, err = se.Execute(context.Background(), "set @@max_execution_time = 0;") c.Assert(err, IsNil) @@ -429,7 +431,33 @@ func (ts *ConnTestSuite) TestConnExecutionTimeout(c *C) { c.Assert(err, IsNil) err = cc.handleQuery(context.Background(), "select /*+ MAX_EXECUTION_TIME(100)*/ * FROM testTable2 WHERE SLEEP(1);") - c.Assert(err, NotNil) + c.Assert(err, IsNil) c.Assert(failpoint.Disable("github.com/pingcap/tidb/server/FakeClientConn"), IsNil) } + +type mockTiDBCtx struct { + TiDBContext + rs []ResultSet + err error +} + +func (c *mockTiDBCtx) Execute(ctx context.Context, sql string) ([]ResultSet, error) { + return c.rs, c.err +} + +func (c *mockTiDBCtx) GetSessionVars() *variable.SessionVars { + return &variable.SessionVars{} +} + +func (ts *ConnTestSuite) TestShutDown(c *C) { + cc := &clientConn{} + + // mock delay response + cc.ctx = &mockTiDBCtx{rs: []ResultSet{&tidbResultSet{}}, err: nil} + // set killed flag + cc.status = connStatusShutdown + // assert ErrQueryInterrupted + err := cc.handleQuery(context.Background(), "dummy") + c.Assert(err, Equals, executor.ErrQueryInterrupted) +}