From 21e5928fbb677dcbce80d06617944a4b777e65cf Mon Sep 17 00:00:00 2001
From: Sasha Klizhentas <klizhentas@gmail.com>
Date: Mon, 30 Sep 2019 11:41:40 -0700
Subject: [PATCH] Close access point cache on cluster disconnect.

This commit fixes goroutine leak - whenever
a leaf cluster disconnects from the root cluster,
the caching access point cache update loop has to be closed
as well.
---
 lib/auth/api.go                 | 12 ++++++++++++
 lib/reversetunnel/remotesite.go |  3 +++
 lib/services/role_test.go       |  2 +-
 3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/lib/auth/api.go b/lib/auth/api.go
index 5a00cec26a115..da0b9432e3e78 100644
--- a/lib/auth/api.go
+++ b/lib/auth/api.go
@@ -18,6 +18,9 @@ package auth
 
 import (
 	"context"
+	"io"
+
+	"github.com/gravitational/trace"
 
 	"github.com/gravitational/teleport/lib/services"
 )
@@ -42,6 +45,8 @@ type Announcer interface {
 
 // ReadAccessPoint is an API interface implemented by a certificate authority (CA)
 type ReadAccessPoint interface {
+	// Closer closes all the resources
+	io.Closer
 	// GetReverseTunnels returns  a list of reverse tunnels
 	GetReverseTunnels(opts ...services.MarshalOption) ([]services.ReverseTunnel, error)
 
@@ -154,6 +159,13 @@ type Wrapper struct {
 	Write AccessPoint
 }
 
+// Close closes all associated resources
+func (w *Wrapper) Close() error {
+	err := w.Write.Close()
+	err2 := w.ReadAccessPoint.Close()
+	return trace.NewAggregate(err, err2)
+}
+
 // UpsertNode is part of auth.AccessPoint implementation
 func (w *Wrapper) UpsertNode(s services.Server) (*services.KeepAlive, error) {
 	return w.Write.UpsertNode(s)
diff --git a/lib/reversetunnel/remotesite.go b/lib/reversetunnel/remotesite.go
index cfeb824d0ee4e..2fab1aa800ec9 100644
--- a/lib/reversetunnel/remotesite.go
+++ b/lib/reversetunnel/remotesite.go
@@ -169,6 +169,9 @@ func (s *remoteSite) Close() error {
 		s.connections[i].Close()
 	}
 	s.connections = []*remoteConn{}
+	if s.remoteAccessPoint != nil {
+		return s.remoteAccessPoint.Close()
+	}
 	return nil
 }
 
diff --git a/lib/services/role_test.go b/lib/services/role_test.go
index ebd30a4db2171..d1108daf61c96 100644
--- a/lib/services/role_test.go
+++ b/lib/services/role_test.go
@@ -1582,7 +1582,7 @@ type userGetter struct {
 	traits map[string][]string
 }
 
-func (f *userGetter) GetUser(name string, secrets bool) (User, error) {
+func (f *userGetter) GetUser(name string, _ bool) (User, error) {
 	user, err := NewUser(name)
 	if err != nil {
 		return nil, trace.Wrap(err)