From da74625ac6a40460077b1ab0501cb9545016a71f Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Tue, 19 Aug 2014 12:24:10 -0700 Subject: [PATCH] Fix the proxier when a service with the same port is re-created, actually restart the proxy. --- pkg/proxy/proxier.go | 4 +-- pkg/proxy/proxier_test.go | 68 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/pkg/proxy/proxier.go b/pkg/proxy/proxier.go index ca76838b616..918be05993c 100644 --- a/pkg/proxy/proxier.go +++ b/pkg/proxy/proxier.go @@ -199,10 +199,10 @@ func (proxier *Proxier) OnUpdate(services []api.Service) { for _, service := range services { activeServices.Insert(service.ID) info, exists := proxier.getServiceInfo(service.ID) - if exists && info.port == service.Port { + if exists && info.active && info.port == service.Port { continue } - if exists { + if exists && info.port != service.Port { proxier.StopProxy(service.ID) } glog.Infof("Adding a new service %s on port %d", service.ID, service.Port) diff --git a/pkg/proxy/proxier_test.go b/pkg/proxy/proxier_test.go index 44f146c86da..f15a1831db3 100644 --- a/pkg/proxy/proxier_test.go +++ b/pkg/proxy/proxier_test.go @@ -133,6 +133,33 @@ func TestProxyUpdateDelete(t *testing.T) { } } +func TestProxyUpdateDeleteUpdate(t *testing.T) { + lb := NewLoadBalancerRR() + lb.OnUpdate([]api.Endpoints{{JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}}) + + p := NewProxier(lb) + + proxyPort, err := p.addServiceOnUnusedPort("echo") + if err != nil { + t.Fatalf("error adding new service: %#v", err) + } + conn, err := net.Dial("tcp", net.JoinHostPort("127.0.0.1", proxyPort)) + if err != nil { + t.Fatalf("error connecting to proxy: %v", err) + } + conn.Close() + + p.OnUpdate([]api.Service{}) + if err := waitForClosedPort(p, proxyPort); err != nil { + t.Fatalf(err.Error()) + } + proxyPortNum, _ := strconv.Atoi(proxyPort) + p.OnUpdate([]api.Service{ + {JSONBase: api.JSONBase{ID: "echo"}, Port: proxyPortNum}, + }) + testEchoConnection(t, "127.0.0.1", proxyPort) +} + func TestProxyUpdatePort(t *testing.T) { lb := NewLoadBalancerRR() lb.OnUpdate([]api.Endpoints{{JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}}) @@ -165,3 +192,44 @@ func TestProxyUpdatePort(t *testing.T) { } testEchoConnection(t, "127.0.0.1", newPort) } + +func TestProxyUpdatePortLetsGoOfOldPort(t *testing.T) { + lb := NewLoadBalancerRR() + lb.OnUpdate([]api.Endpoints{{JSONBase: api.JSONBase{ID: "echo"}, Endpoints: []string{net.JoinHostPort("127.0.0.1", port)}}}) + + p := NewProxier(lb) + + proxyPort, err := p.addServiceOnUnusedPort("echo") + if err != nil { + t.Fatalf("error adding new service: %#v", err) + } + + // add a new dummy listener in order to get a port that is free + l, _ := net.Listen("tcp", ":0") + _, newPort, _ := net.SplitHostPort(l.Addr().String()) + portNum, _ := strconv.Atoi(newPort) + l.Close() + + // Wait for the socket to actually get free. + if err := waitForClosedPort(p, newPort); err != nil { + t.Fatalf(err.Error()) + } + if proxyPort == newPort { + t.Errorf("expected difference, got %s %s", newPort, proxyPort) + } + p.OnUpdate([]api.Service{ + {JSONBase: api.JSONBase{ID: "echo"}, Port: portNum}, + }) + if err := waitForClosedPort(p, proxyPort); err != nil { + t.Fatalf(err.Error()) + } + testEchoConnection(t, "127.0.0.1", newPort) + proxyPortNum, _ := strconv.Atoi(proxyPort) + p.OnUpdate([]api.Service{ + {JSONBase: api.JSONBase{ID: "echo"}, Port: proxyPortNum}, + }) + if err := waitForClosedPort(p, newPort); err != nil { + t.Fatalf(err.Error()) + } + testEchoConnection(t, "127.0.0.1", proxyPort) +}