forked from TrueCloudLab/frostfs-sdk-go
[#169] pool: Close inner pools during close routine
Some apps do not reuse pool instance and expect that `pool.Close()` free resources. But it didn't actually close inner SDK clients, so it leads to goroutine leak in storage. Signed-off-by: Alex Vanin <a.vanin@yadro.com>
This commit is contained in:
parent
555ccc63b2
commit
99c273f499
2 changed files with 20 additions and 0 deletions
|
@ -189,3 +189,7 @@ func (m *mockClient) restartIfUnhealthy(ctx context.Context) (healthy bool, chan
|
|||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (m *mockClient) close() error {
|
||||
return nil
|
||||
}
|
||||
|
|
16
pool/pool.go
16
pool/pool.go
|
@ -78,6 +78,8 @@ type client interface {
|
|||
dial(ctx context.Context) error
|
||||
// see clientWrapper.restartIfUnhealthy.
|
||||
restartIfUnhealthy(ctx context.Context) (bool, bool)
|
||||
// see clientWrapper.close.
|
||||
close() error
|
||||
}
|
||||
|
||||
// clientStatus provide access to some metrics for connection.
|
||||
|
@ -1080,6 +1082,13 @@ func (c *clientWrapper) incRequests(elapsed time.Duration, method MethodIndex) {
|
|||
}
|
||||
}
|
||||
|
||||
func (c *clientWrapper) close() error {
|
||||
if c.client != nil {
|
||||
return c.client.Close()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *clientStatusMonitor) handleError(ctx context.Context, st apistatus.Status, err error) error {
|
||||
if err != nil {
|
||||
if needCountError(ctx, err) {
|
||||
|
@ -2766,6 +2775,13 @@ func (p *Pool) NetworkInfo(ctx context.Context) (netmap.NetworkInfo, error) {
|
|||
func (p *Pool) Close() {
|
||||
p.cancel()
|
||||
<-p.closedCh
|
||||
|
||||
// close all clients
|
||||
for _, pools := range p.innerPools {
|
||||
for _, cli := range pools.clients {
|
||||
_ = cli.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// SyncContainerWithNetwork applies network configuration received via
|
||||
|
|
Loading…
Reference in a new issue