Skip to content

Commit

Permalink
Make proxy.servers a map in order to easily pick proxy to close
Browse files Browse the repository at this point in the history
  • Loading branch information
fwkz committed Nov 19, 2020
1 parent 6dab877 commit 10749de
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 33 deletions.
4 changes: 2 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -397,8 +397,8 @@ func startServers(cfg *config.Config) {
ports = unique(ports)
}
for _, port := range difference(lastPorts, ports) {
log.Printf("[DEBUG] Dynamic TCP listener on port %s eligable for termination", port)
proxy.CloseDynamicProxy(port)
log.Printf("[DEBUG] Dynamic TCP listener on %s eligable for termination", port)
proxy.CloseProxy(port)
}
for _, port := range ports {
l := l
Expand Down
49 changes: 18 additions & 31 deletions proxy/serve.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,23 +28,21 @@ type Server interface {
var (
// mu guards servers which contains the list
// of running proxy servers.
mu sync.Mutex
servers []Server
dynamicProxyPorts = make(map[string]Server)
mu sync.Mutex
servers = make(map[string]Server)
)

func CloseDynamicProxy(port string) error {
if srv, ok := dynamicProxyPorts[port]; ok {
func CloseProxy(address string) error {
mu.Lock()
if srv, ok := servers[address]; ok {
err := srv.Close()
if err != nil {
return err
}
log.Printf("[INFO] Dynamic TCP listener on port %s has been terminated", port)
mu.Lock()
servers = removeServer(servers, srv)
delete(dynamicProxyPorts, port)
mu.Unlock()
log.Printf("[INFO] Dynamic TCP listener on %s has been terminated", address)
delete(servers, address)
}
mu.Unlock()
return nil
}

Expand All @@ -53,15 +51,17 @@ func Close() {
for _, srv := range servers {
srv.Close()
}
servers = []Server{}
servers = make(map[string]Server)
mu.Unlock()
}

func Shutdown(timeout time.Duration) {
mu.Lock()
srvs := make([]Server, len(servers))
copy(srvs, servers)
servers = []Server{}
srvs := make(map[string]Server, len(servers))
for k, v := range servers {
srvs[k] = v
}
servers = make(map[string]Server)
mu.Unlock()

var wg sync.WaitGroup
Expand Down Expand Up @@ -146,8 +146,9 @@ func ListenAndServeHTTPSTCPSNI(l config.Listen, h http.Handler, p tcp.Handler, c
})

// tcpproxy creates its own listener from the configuration above so we can
// safely pass nil here.
return serve(nil, tps)
// safely pass nil here, nonetheless we are passing `httpsListener` to
// extract it's address and save server in the `servers` map.
return serve(httpsListener, tps)
}

func ListenAndServeGRPC(l config.Listen, opts []grpc.ServerOption, cfg *tls.Config) error {
Expand All @@ -174,15 +175,12 @@ func ListenAndServeTCP(l config.Listen, h tcp.Handler, cfg *tls.Config) error {
ReadTimeout: l.ReadTimeout,
WriteTimeout: l.WriteTimeout,
}
if _, ok := h.(*tcp.DynamicProxy); ok {
dynamicProxyPorts[l.Addr] = srv
}
return serve(ln, srv)
}

func serve(ln net.Listener, srv Server) error {
mu.Lock()
servers = append(servers, srv)
servers[ln.Addr().String()] = srv
mu.Unlock()
err := srv.Serve(ln)
if err != nil {
Expand All @@ -197,14 +195,3 @@ func serve(ln net.Listener, srv Server) error {
}
return err
}

func removeServer(srvs []Server, s Server) []Server {
for i, srv := range srvs {
if s == srv {
log.Printf("[DEBUG] Removing server from the list")
srvs[i] = srvs[len(servers)-1]
return srvs[:len(srvs)-1]
}
}
return srvs
}

0 comments on commit 10749de

Please sign in to comment.