diff --git a/CHANGELOG.md b/CHANGELOG.md index 82f9766f7..6dc5bdd5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Versioning](http://semver.org/spec/v2.0.0.html) except to the first release. ### Added - Extend box with replication information (#427). +- The Instance info has been added to ConnectionInfo for GetInfo response (#429). ### Changed diff --git a/pool/connection_pool.go b/pool/connection_pool.go index 9be46665e..fa5537a6a 100644 --- a/pool/connection_pool.go +++ b/pool/connection_pool.go @@ -93,6 +93,7 @@ ConnectionInfo structure for information about connection statuses: type ConnectionInfo struct { ConnectedNow bool ConnRole Role + Instance Instance } /* @@ -393,13 +394,25 @@ func (p *ConnectionPool) GetInfo() map[string]ConnectionInfo { return info } - for name := range p.ends { + for name, end := range p.ends { conn, role := p.getConnectionFromPool(name) + + connInfo := ConnectionInfo{ + ConnectedNow: false, + ConnRole: UnknownRole, + Instance: Instance{ + Name: name, + Dialer: end.dialer, + Opts: end.opts, + }, + } + if conn != nil { - info[name] = ConnectionInfo{ConnectedNow: conn.ConnectedNow(), ConnRole: role} - } else { - info[name] = ConnectionInfo{ConnectedNow: false, ConnRole: UnknownRole} + connInfo.ConnRole = role + connInfo.ConnectedNow = conn.ConnectedNow() } + + info[name] = connInfo } return info diff --git a/pool/connection_pool_test.go b/pool/connection_pool_test.go index c4e43e2d3..e6f1f50c2 100644 --- a/pool/connection_pool_test.go +++ b/pool/connection_pool_test.go @@ -242,7 +242,9 @@ func TestConnect_empty(t *testing.T) { func TestConnect_unavailable(t *testing.T) { servers := []string{"err1", "err2"} ctx, cancel := test_helpers.GetPoolConnectContext() - connPool, err := pool.Connect(ctx, makeInstances([]string{"err1", "err2"}, connOpts)) + insts := makeInstances([]string{"err1", "err2"}, connOpts) + + connPool, err := pool.Connect(ctx, insts) cancel() if connPool != nil { @@ -252,8 +254,10 @@ func TestConnect_unavailable(t *testing.T) { require.NoError(t, err, "failed to create a pool") require.NotNilf(t, connPool, "pool is nil after Connect") require.Equal(t, map[string]pool.ConnectionInfo{ - servers[0]: pool.ConnectionInfo{ConnectedNow: false, ConnRole: pool.UnknownRole}, - servers[1]: pool.ConnectionInfo{ConnectedNow: false, ConnRole: pool.UnknownRole}, + servers[0]: pool.ConnectionInfo{ + ConnectedNow: false, ConnRole: pool.UnknownRole, Instance: insts[0]}, + servers[1]: pool.ConnectionInfo{ + ConnectedNow: false, ConnRole: pool.UnknownRole, Instance: insts[1]}, }, connPool.GetInfo()) } @@ -1156,15 +1160,19 @@ func TestConnectionHandlerOpenError(t *testing.T) { } ctx, cancel := test_helpers.GetPoolConnectContext() defer cancel() - connPool, err := pool.ConnectWithOpts(ctx, makeInstances(poolServers, connOpts), poolOpts) + + insts := makeInstances(poolServers, connOpts) + connPool, err := pool.ConnectWithOpts(ctx, insts, poolOpts) if err == nil { defer connPool.Close() } require.NoError(t, err, "failed to connect") require.NotNil(t, connPool, "pool expected") require.Equal(t, map[string]pool.ConnectionInfo{ - servers[0]: pool.ConnectionInfo{ConnectedNow: false, ConnRole: pool.UnknownRole}, - servers[1]: pool.ConnectionInfo{ConnectedNow: false, ConnRole: pool.UnknownRole}, + servers[0]: pool.ConnectionInfo{ + ConnectedNow: false, ConnRole: pool.UnknownRole, Instance: insts[0]}, + servers[1]: pool.ConnectionInfo{ + ConnectedNow: false, ConnRole: pool.UnknownRole, Instance: insts[1]}, }, connPool.GetInfo()) connPool.Close() @@ -3495,6 +3503,37 @@ func runTestMain(m *testing.M) int { return m.Run() } +func TestConnectionPool_GetInfo_equal_instance_info(t *testing.T) { + var tCases [][]pool.Instance + + tCases = append(tCases, makeInstances([]string{servers[0], servers[1]}, connOpts)) + tCases = append(tCases, makeInstances([]string{ + servers[0], + servers[1], + servers[3]}, + connOpts)) + tCases = append(tCases, makeInstances([]string{servers[0]}, connOpts)) + + for _, tc := range tCases { + ctx, cancel := test_helpers.GetPoolConnectContext() + connPool, err := pool.Connect(ctx, tc) + cancel() + require.Nilf(t, err, "failed to connect") + require.NotNilf(t, connPool, "conn is nil after Connect") + + info := connPool.GetInfo() + + var infoInstances []pool.Instance + + for _, infoInst := range info { + infoInstances = append(infoInstances, infoInst.Instance) + } + + require.ElementsMatch(t, tc, infoInstances) + connPool.Close() + } +} + func TestMain(m *testing.M) { code := runTestMain(m) os.Exit(code)