Skip to content

Commit 56fb5a3

Browse files
committed
pool: handle disconnection with Opts.Reconnect
The ConnectionPool didn't close a connection if it couldn't get a role when checking the connection. Closes #272
1 parent 51a6eb0 commit 56fb5a3

File tree

3 files changed

+63
-3
lines changed

3 files changed

+63
-3
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ Versioning](http://semver.org/spec/v2.0.0.html) except to the first release.
2121
### Fixed
2222

2323
- Several non-critical data race issues (#218)
24+
- ConnectionPool does not properly handle disconnection with Opts.Reconnect
25+
set (#272)
2426

2527
## [1.10.0] - 2022-12-31
2628

connection_pool/connection_pool.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,10 @@ func ConnectWithOpts(addrs []string, connOpts tarantool.Opts, opts OptsPool) (co
163163
}
164164

165165
// ConnectWithOpts creates pool for instances with addresses addrs.
166+
//
167+
// It is useless to set up tarantool.Opts.Reconnect value for a connection.
168+
// The connection pool has its own reconnection logic. See
169+
// OptsPool.CheckTimeout description.
166170
func Connect(addrs []string, connOpts tarantool.Opts) (connPool *ConnectionPool, err error) {
167171
opts := OptsPool{
168172
CheckTimeout: 1 * time.Second,
@@ -977,10 +981,18 @@ func (pool *ConnectionPool) updateConnection(s connState) connState {
977981
}
978982
s.role = role
979983
}
980-
}
984+
pool.poolsMutex.Unlock()
985+
return s
986+
} else {
987+
pool.deleteConnection(s.addr)
988+
pool.poolsMutex.Unlock()
981989

982-
pool.poolsMutex.Unlock()
983-
return s
990+
s.conn.Close()
991+
pool.handlerDeactivated(s.conn, s.role)
992+
s.conn = nil
993+
s.role = UnknownRole
994+
return s
995+
}
984996
}
985997

986998
func (pool *ConnectionPool) tryConnect(s connState) connState {

connection_pool/connection_pool_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,52 @@ func TestReconnect(t *testing.T) {
148148
require.Nil(t, err)
149149
}
150150

151+
func TestDisconnect_withReconnect(t *testing.T) {
152+
const serverId = 0
153+
154+
opts := connOpts
155+
opts.Reconnect = 10 * time.Second
156+
157+
connPool, err := connection_pool.Connect([]string{servers[serverId]}, opts)
158+
require.Nilf(t, err, "failed to connect")
159+
require.NotNilf(t, connPool, "conn is nil after Connect")
160+
161+
defer connPool.Close()
162+
163+
// Test.
164+
test_helpers.StopTarantoolWithCleanup(instances[serverId])
165+
args := test_helpers.CheckStatusesArgs{
166+
ConnPool: connPool,
167+
Mode: connection_pool.ANY,
168+
Servers: []string{servers[serverId]},
169+
ExpectedPoolStatus: false,
170+
ExpectedStatuses: map[string]bool{
171+
servers[serverId]: false,
172+
},
173+
}
174+
err = test_helpers.Retry(test_helpers.CheckPoolStatuses,
175+
args, defaultCountRetry, defaultTimeoutRetry)
176+
require.Nil(t, err)
177+
178+
// Restart the server after success.
179+
err = test_helpers.RestartTarantool(&instances[serverId])
180+
require.Nilf(t, err, "failed to restart tarantool")
181+
182+
args = test_helpers.CheckStatusesArgs{
183+
ConnPool: connPool,
184+
Mode: connection_pool.ANY,
185+
Servers: []string{servers[serverId]},
186+
ExpectedPoolStatus: true,
187+
ExpectedStatuses: map[string]bool{
188+
servers[serverId]: true,
189+
},
190+
}
191+
192+
err = test_helpers.Retry(test_helpers.CheckPoolStatuses,
193+
args, defaultCountRetry, defaultTimeoutRetry)
194+
require.Nil(t, err)
195+
}
196+
151197
func TestDisconnectAll(t *testing.T) {
152198
server1 := servers[0]
153199
server2 := servers[1]

0 commit comments

Comments
 (0)