Skip to content

Commit 5715e7f

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 e257ff3 commit 5715e7f

File tree

3 files changed

+64
-4
lines changed

3 files changed

+64
-4
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: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,8 @@ func TestReconnect(t *testing.T) {
128128
},
129129
}
130130

131-
err = test_helpers.Retry(test_helpers.CheckPoolStatuses, args, defaultCountRetry, defaultTimeoutRetry)
131+
err = test_helpers.Retry(test_helpers.CheckPoolStatuses,
132+
args, defaultCountRetry, defaultTimeoutRetry)
132133
require.Nil(t, err)
133134

134135
err = test_helpers.RestartTarantool(&instances[0])
@@ -144,6 +145,51 @@ func TestReconnect(t *testing.T) {
144145
},
145146
}
146147

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

0 commit comments

Comments
 (0)