Skip to content

Commit a8023bf

Browse files
jackyspti-chi-bot
authored andcommitted
This is an automated cherry-pick of pingcap#53690
Signed-off-by: ti-chi-bot <[email protected]>
1 parent d97c194 commit a8023bf

File tree

4 files changed

+33
-21
lines changed

4 files changed

+33
-21
lines changed

server/BUILD.bazel

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,11 @@ go_test(
237237
"@com_github_tikv_client_go_v2//tikvrpc",
238238
"@io_etcd_go_etcd_tests_v3//integration",
239239
"@io_opencensus_go//stats/view",
240+
<<<<<<< HEAD
240241
"@org_golang_x_exp//slices",
242+
=======
243+
"@org_uber_go_atomic//:atomic",
244+
>>>>>>> 05a1ad36ce8 (server: fix connection double close (#53690))
241245
"@org_uber_go_goleak//:goleak",
242246
"@org_uber_go_zap//:zap",
243247
],

server/conn.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -336,14 +336,6 @@ func closeConn(cc *clientConn, connections int) error {
336336
// This is because closeConn() might be called after a connection read-timeout.
337337
logutil.Logger(context.Background()).Debug("could not close connection", zap.Error(err))
338338
}
339-
if cc.bufReadConn != nil {
340-
err = cc.bufReadConn.Close()
341-
if err != nil {
342-
// We need to expect connection might have already disconnected.
343-
// This is because closeConn() might be called after a connection read-timeout.
344-
logutil.Logger(context.Background()).Debug("could not close connection", zap.Error(err))
345-
}
346-
}
347339
// Close statements and session
348340
// This will release advisory locks, row locks, etc.
349341
if ctx := cc.getCtx(); ctx != nil {

server/conn_test.go

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1692,7 +1692,7 @@ func TestMaxAllowedPacket(t *testing.T) {
16921692
bytes := append([]byte{0x00, 0x04, 0x00, 0x00}, []byte(fmt.Sprintf("SELECT length('%s') as len;", strings.Repeat("a", 999)))...)
16931693
_, err := inBuffer.Write(bytes)
16941694
require.NoError(t, err)
1695-
brc := newBufferedReadConn(&bytesConn{inBuffer})
1695+
brc := newBufferedReadConn(&bytesConn{b: inBuffer})
16961696
pkt := newPacketIO(brc)
16971697
pkt.setMaxAllowedPacket(maxAllowedPacket)
16981698
readBytes, err = pkt.readPacket()
@@ -1705,7 +1705,7 @@ func TestMaxAllowedPacket(t *testing.T) {
17051705
bytes = append([]byte{0x01, 0x04, 0x00, 0x00}, []byte(fmt.Sprintf("SELECT length('%s') as len;", strings.Repeat("a", 1000)))...)
17061706
_, err = inBuffer.Write(bytes)
17071707
require.NoError(t, err)
1708-
brc = newBufferedReadConn(&bytesConn{inBuffer})
1708+
brc = newBufferedReadConn(&bytesConn{b: inBuffer})
17091709
pkt = newPacketIO(brc)
17101710
pkt.setMaxAllowedPacket(maxAllowedPacket)
17111711
_, err = pkt.readPacket()
@@ -1717,7 +1717,7 @@ func TestMaxAllowedPacket(t *testing.T) {
17171717
bytes = append([]byte{0x01, 0x02, 0x00, 0x00}, []byte(fmt.Sprintf("SELECT length('%s') as len;", strings.Repeat("a", 488)))...)
17181718
_, err = inBuffer.Write(bytes)
17191719
require.NoError(t, err)
1720-
brc = newBufferedReadConn(&bytesConn{inBuffer})
1720+
brc = newBufferedReadConn(&bytesConn{b: inBuffer})
17211721
pkt = newPacketIO(brc)
17221722
pkt.setMaxAllowedPacket(maxAllowedPacket)
17231723
readBytes, err = pkt.readPacket()
@@ -1728,7 +1728,7 @@ func TestMaxAllowedPacket(t *testing.T) {
17281728
bytes = append([]byte{0x01, 0x02, 0x00, 0x01}, []byte(fmt.Sprintf("SELECT length('%s') as len;", strings.Repeat("b", 488)))...)
17291729
_, err = inBuffer.Write(bytes)
17301730
require.NoError(t, err)
1731-
brc = newBufferedReadConn(&bytesConn{inBuffer})
1731+
brc = newBufferedReadConn(&bytesConn{b: inBuffer})
17321732
pkt.setBufferedReadConn(brc)
17331733
readBytes, err = pkt.readPacket()
17341734
require.NoError(t, err)
@@ -1987,6 +1987,7 @@ func TestProcessInfoForExecuteCommand(t *testing.T) {
19871987
require.Equal(t, cc.ctx.Session.ShowProcess().Info, "select sum(col1) from t where col1 < ? and col1 > 100")
19881988
}
19891989

1990+
<<<<<<< HEAD
19901991
func TestLDAPAuthSwitch(t *testing.T) {
19911992
store := testkit.CreateMockStore(t)
19921993
cfg := newTestConfig()
@@ -2026,6 +2027,8 @@ func TestLDAPAuthSwitch(t *testing.T) {
20262027
require.Equal(t, []byte(mysql.AuthMySQLClearPassword), respAuthSwitch)
20272028
}
20282029

2030+
=======
2031+
>>>>>>> 05a1ad36ce8 (server: fix connection double close (#53690))
20292032
func TestCloseConn(t *testing.T) {
20302033
var outBuffer bytes.Buffer
20312034

@@ -2036,7 +2039,12 @@ func TestCloseConn(t *testing.T) {
20362039
drv := NewTiDBDriver(store)
20372040
server, err := NewServer(cfg, drv)
20382041
require.NoError(t, err)
2039-
2042+
var inBuffer bytes.Buffer
2043+
_, err = inBuffer.Write([]byte{0x01, 0x00, 0x00, 0x00, 0x01})
2044+
require.NoError(t, err)
2045+
// Test read one packet
2046+
brc := newBufferedReadConn(&bytesConn{b: inBuffer})
2047+
require.NoError(t, err)
20402048
cc := &clientConn{
20412049
connectionID: 0,
20422050
salt: []byte{
@@ -2047,11 +2055,12 @@ func TestCloseConn(t *testing.T) {
20472055
pkt: &packetIO{
20482056
bufWriter: bufio.NewWriter(&outBuffer),
20492057
},
2050-
collation: mysql.DefaultCollationID,
2051-
peerHost: "localhost",
2052-
alloc: arena.NewAllocator(512),
2053-
chunkAlloc: chunk.NewAllocator(),
2054-
capability: mysql.ClientProtocol41,
2058+
collation: mysql.DefaultCollationID,
2059+
peerHost: "localhost",
2060+
alloc: arena.NewAllocator(512),
2061+
chunkAlloc: chunk.NewAllocator(),
2062+
capability: mysql.ClientProtocol41,
2063+
bufReadConn: brc,
20552064
}
20562065

20572066
var wg sync.WaitGroup

server/packetio_test.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ import (
2121
"testing"
2222
"time"
2323

24+
"github.com/pingcap/errors"
2425
"github.com/pingcap/tidb/parser/mysql"
2526
"github.com/stretchr/testify/require"
27+
"go.uber.org/atomic"
2628
)
2729

2830
func BenchmarkPacketIOWrite(b *testing.B) {
@@ -64,7 +66,7 @@ func TestPacketIORead(t *testing.T) {
6466
_, err := inBuffer.Write([]byte{0x01, 0x00, 0x00, 0x00, 0x01})
6567
require.NoError(t, err)
6668
// Test read one packet
67-
brc := newBufferedReadConn(&bytesConn{inBuffer})
69+
brc := newBufferedReadConn(&bytesConn{b: inBuffer})
6870
pkt := newPacketIO(brc)
6971
readBytes, err := pkt.readPacket()
7072
require.NoError(t, err)
@@ -86,7 +88,7 @@ func TestPacketIORead(t *testing.T) {
8688
_, err = inBuffer.Write(buf)
8789
require.NoError(t, err)
8890
// Test read multiple packets
89-
brc = newBufferedReadConn(&bytesConn{inBuffer})
91+
brc = newBufferedReadConn(&bytesConn{b: inBuffer})
9092
pkt = newPacketIO(brc)
9193
readBytes, err = pkt.readPacket()
9294
require.NoError(t, err)
@@ -96,7 +98,8 @@ func TestPacketIORead(t *testing.T) {
9698
}
9799

98100
type bytesConn struct {
99-
b bytes.Buffer
101+
b bytes.Buffer
102+
closed atomic.Bool
100103
}
101104

102105
func (c *bytesConn) Read(b []byte) (n int, err error) {
@@ -108,6 +111,10 @@ func (c *bytesConn) Write(b []byte) (n int, err error) {
108111
}
109112

110113
func (c *bytesConn) Close() error {
114+
if c.closed.Load() {
115+
return errors.New("already closed")
116+
}
117+
c.closed.Store(true)
111118
return nil
112119
}
113120

0 commit comments

Comments
 (0)