Skip to content

Commit

Permalink
Minor readjustment to the code to avoid changes to loadBalancerBackend
Browse files Browse the repository at this point in the history
Signed-off-by: Madhu Venugopal <madhu@docker.com>
  • Loading branch information
mavenugo committed Jun 11, 2017
1 parent 47842a4 commit 92820b9
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 53 deletions.
40 changes: 16 additions & 24 deletions agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -623,15 +623,13 @@ func (ep *endpoint) addServiceInfoToCluster(sb *sandbox) error {
if n.ingress {
ingressPorts = ep.ingressPorts
}
if err := c.addServiceBinding(ep.svcName, ep.svcID, n.ID(), ep.ID(), ep.Name(), ep.virtualIP, ingressPorts, ep.svcAliases, ep.myAliases, ep.Iface().Address().IP, "addServiceInfoToCluster"); err != nil {
return err
}
} else {
// This is a container simply attached to an attachable network
if err := c.addContainerNameResolution(n.ID(), ep.ID(), ep.Name(), ep.myAliases, ep.Iface().Address().IP, "addServiceInfoToCluster"); err != nil {
if err := c.addServiceBinding(ep.svcName, ep.svcID, n.ID(), ep.ID(), ep.virtualIP, ingressPorts, ep.svcAliases, ep.Iface().Address().IP, "addServiceInfoToCluster"); err != nil {
return err
}
}
if err := c.addContainerNameResolution(n.ID(), ep.ID(), ep.Name(), ep.myAliases, ep.Iface().Address().IP, "addServiceInfoToCluster"); err != nil {
return err
}

name := ep.Name()
if ep.isAnonymous() {
Expand Down Expand Up @@ -688,15 +686,13 @@ func (ep *endpoint) deleteServiceInfoFromCluster(sb *sandbox, method string) err
if n.ingress {
ingressPorts = ep.ingressPorts
}
if err := c.rmServiceBinding(ep.svcName, ep.svcID, n.ID(), ep.ID(), ep.Name(), ep.virtualIP, ingressPorts, ep.svcAliases, ep.myAliases, ep.Iface().Address().IP, "deleteServiceInfoFromCluster"); err != nil {
return err
}
} else {
// This is a container simply attached to an attachable network
if err := c.delContainerNameResolution(n.ID(), ep.ID(), ep.Name(), ep.myAliases, ep.Iface().Address().IP, "deleteServiceInfoFromCluster"); err != nil {
if err := c.rmServiceBinding(ep.svcName, ep.svcID, n.ID(), ep.ID(), ep.virtualIP, ingressPorts, ep.svcAliases, ep.Iface().Address().IP, "deleteServiceInfoFromCluster"); err != nil {
return err
}
}
if err := c.delContainerNameResolution(n.ID(), ep.ID(), ep.Name(), ep.myAliases, ep.Iface().Address().IP, "deleteServiceInfoFromCluster"); err != nil {
return err
}
}

if agent != nil {
Expand Down Expand Up @@ -881,29 +877,25 @@ func (c *controller) handleEpTableEvent(ev events.Event) {
logrus.Debugf("handleEpTableEvent ADD %s R:%v", isAdd, eid, epRec)
if svcID != "" {
// This is a remote task part of a service
if err := c.addServiceBinding(svcName, svcID, nid, eid, containerName, vip, ingressPorts, serviceAliases, taskAliases, ip, "handleEpTableEvent"); err != nil {
if err := c.addServiceBinding(svcName, svcID, nid, eid, vip, ingressPorts, serviceAliases, ip, "handleEpTableEvent"); err != nil {
logrus.Errorf("failed adding service binding for %s epRec:%v err:%s", eid, epRec, err)
return
}
} else {
// This is a remote container simply attached to an attachable network
if err := c.addContainerNameResolution(nid, eid, containerName, taskAliases, ip, "handleEpTableEvent"); err != nil {
logrus.Errorf("failed adding service binding for %s epRec:%v err:%s", eid, epRec, err)
}
}
if err := c.addContainerNameResolution(nid, eid, containerName, taskAliases, ip, "handleEpTableEvent"); err != nil {
logrus.Errorf("failed adding container binding for %s epRec:%v err:%s", eid, epRec, err)
}
} else {
logrus.Debugf("handleEpTableEvent DEL %s R:%v", isAdd, eid, epRec)
if svcID != "" {
// This is a remote task part of a service
if err := c.rmServiceBinding(svcName, svcID, nid, eid, containerName, vip, ingressPorts, serviceAliases, taskAliases, ip, "handleEpTableEvent"); err != nil {
if err := c.rmServiceBinding(svcName, svcID, nid, eid, vip, ingressPorts, serviceAliases, ip, "handleEpTableEvent"); err != nil {
logrus.Errorf("failed removing service binding for %s epRec:%v err:%s", eid, epRec, err)
return
}
} else {
// This is a remote container simply attached to an attachable network
if err := c.delContainerNameResolution(nid, eid, containerName, taskAliases, ip, "handleEpTableEvent"); err != nil {
logrus.Errorf("failed adding service binding for %s epRec:%v err:%s", eid, epRec, err)
}
}
if err := c.delContainerNameResolution(nid, eid, containerName, taskAliases, ip, "handleEpTableEvent"); err != nil {
logrus.Errorf("failed adding container binding for %s epRec:%v err:%s", eid, epRec, err)
}
}
}
8 changes: 1 addition & 7 deletions service.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,14 +85,8 @@ type loadBalancer struct {

// Map of backend IPs backing this loadbalancer on this
// network. It is keyed with endpoint ID.
backEnds map[string]loadBalancerBackend
backEnds map[string]net.IP

// Back pointer to service to which the loadbalancer belongs.
service *service
}

type loadBalancerBackend struct {
ip net.IP
containerName string
taskAliases []string
}
32 changes: 12 additions & 20 deletions service_common.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,14 @@ import (
"github.com/docker/libnetwork/common"
)

func (c *controller) addEndpointNameResolution(svcName, svcID, nID, eID, containerName string, vip net.IP, serviceAliases, taskAliases []string, ip net.IP, addService bool, method string) error {
func (c *controller) addEndpointNameResolution(svcName, svcID, nID, eID string, vip net.IP, serviceAliases []string, ip net.IP, addService bool, method string) error {
n, err := c.NetworkByID(nID)
if err != nil {
return err
}

logrus.Debugf("addEndpointNameResolution %s %s add_service:%t", eID, svcName, addService)

// Add container resolution mappings
c.addContainerNameResolution(nID, eID, containerName, taskAliases, ip, method)

// Add endpoint IP to special "tasks.svc_name" so that the applications have access to DNS RR.
n.(*network).addSvcRecords(eID, "tasks."+svcName, ip, nil, false, method)
for _, alias := range serviceAliases {
Expand Down Expand Up @@ -62,17 +59,14 @@ func (c *controller) addContainerNameResolution(nID, eID, containerName string,
return nil
}

func (c *controller) deleteEndpointNameResolution(svcName, svcID, nID, eID, containerName string, vip net.IP, serviceAliases, taskAliases []string, ip net.IP, rmService, multipleEntries bool, method string) error {
func (c *controller) deleteEndpointNameResolution(svcName, svcID, nID, eID string, vip net.IP, serviceAliases []string, ip net.IP, rmService, multipleEntries bool, method string) error {
n, err := c.NetworkByID(nID)
if err != nil {
return err
}

logrus.Debugf("deleteEndpointNameResolution %s %s rm_service:%t suppress:%t", eID, svcName, rmService, multipleEntries)

// Delete container resolution mappings
c.delContainerNameResolution(nID, eID, containerName, taskAliases, ip, method)

// Delete the special "tasks.svc_name" backend record.
if !multipleEntries {
n.(*network).deleteSvcRecords(eID, "tasks."+svcName, ip, nil, false, method)
Expand Down Expand Up @@ -171,16 +165,16 @@ func (c *controller) cleanupServiceBindings(cleanupNID string) {
continue
}

for eid, be := range lb.backEnds {
for eid, ip := range lb.backEnds {
service := s
loadBalancer := lb
networkID := nid
epID := eid
epIP := be.ip
epIP := ip

cleanupFuncs = append(cleanupFuncs, func() {
if err := c.rmServiceBinding(service.name, service.id, networkID, epID, be.containerName, loadBalancer.vip,
service.ingressPorts, service.aliases, be.taskAliases, epIP, "cleanupServiceBindings"); err != nil {
if err := c.rmServiceBinding(service.name, service.id, networkID, epID, loadBalancer.vip,
service.ingressPorts, service.aliases, epIP, "cleanupServiceBindings"); err != nil {
logrus.Errorf("Failed to remove service bindings for service %s network %s endpoint %s while cleanup: %v",
service.id, networkID, epID, err)
}
Expand All @@ -196,7 +190,7 @@ func (c *controller) cleanupServiceBindings(cleanupNID string) {

}

func (c *controller) addServiceBinding(svcName, svcID, nID, eID, containerName string, vip net.IP, ingressPorts []*PortConfig, serviceAliases, taskAliases []string, ip net.IP, method string) error {
func (c *controller) addServiceBinding(svcName, svcID, nID, eID string, vip net.IP, ingressPorts []*PortConfig, serviceAliases []string, ip net.IP, method string) error {
var addService bool

n, err := c.NetworkByID(nID)
Expand Down Expand Up @@ -240,7 +234,7 @@ func (c *controller) addServiceBinding(svcName, svcID, nID, eID, containerName s
lb = &loadBalancer{
vip: vip,
fwMark: fwMarkCtr,
backEnds: make(map[string]loadBalancerBackend),
backEnds: make(map[string]net.IP),
service: s,
}

Expand All @@ -252,9 +246,7 @@ func (c *controller) addServiceBinding(svcName, svcID, nID, eID, containerName s
addService = true
}

lb.backEnds[eID] = loadBalancerBackend{ip: ip,
containerName: containerName,
taskAliases: taskAliases}
lb.backEnds[eID] = ip

ok, entries := s.assignIPToEndpoint(ip.String(), eID)
if !ok || entries > 1 {
Expand All @@ -269,14 +261,14 @@ func (c *controller) addServiceBinding(svcName, svcID, nID, eID, containerName s
}

// Add the appropriate name resolutions
c.addEndpointNameResolution(svcName, svcID, nID, eID, containerName, vip, serviceAliases, taskAliases, ip, addService, "addServiceBinding")
c.addEndpointNameResolution(svcName, svcID, nID, eID, vip, serviceAliases, ip, addService, "addServiceBinding")

logrus.Debugf("addServiceBinding from %s END for %s %s", method, svcName, eID)

return nil
}

func (c *controller) rmServiceBinding(svcName, svcID, nID, eID, containerName string, vip net.IP, ingressPorts []*PortConfig, serviceAliases []string, taskAliases []string, ip net.IP, method string) error {
func (c *controller) rmServiceBinding(svcName, svcID, nID, eID string, vip net.IP, ingressPorts []*PortConfig, serviceAliases []string, ip net.IP, method string) error {

var rmService bool

Expand Down Expand Up @@ -347,7 +339,7 @@ func (c *controller) rmServiceBinding(svcName, svcID, nID, eID, containerName st
}

// Delete the name resolutions
c.deleteEndpointNameResolution(svcName, svcID, nID, eID, containerName, vip, serviceAliases, taskAliases, ip, rmService, entries > 0, "rmServiceBinding")
c.deleteEndpointNameResolution(svcName, svcID, nID, eID, vip, serviceAliases, ip, rmService, entries > 0, "rmServiceBinding")

logrus.Debugf("rmServiceBinding from %s END for %s %s", method, svcName, eID)
return nil
Expand Down
4 changes: 2 additions & 2 deletions service_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@ func (sb *sandbox) populateLoadbalancers(ep *endpoint) {
}

lb.service.Lock()
for _, l := range lb.backEnds {
sb.addLBBackend(l.ip, lb.vip, lb.fwMark, lb.service.ingressPorts, eIP, gwIP, n.ingress)
for _, ip := range lb.backEnds {
sb.addLBBackend(ip, lb.vip, lb.fwMark, lb.service.ingressPorts, eIP, gwIP, n.ingress)
}
lb.service.Unlock()
}
Expand Down

0 comments on commit 92820b9

Please sign in to comment.