Skip to content

Commit

Permalink
Merge pull request #1223 from mrjana/lb
Browse files Browse the repository at this point in the history
Fix a lb rule race in loadbalancer
  • Loading branch information
mavenugo committed Jun 8, 2016
2 parents 6912c33 + c588985 commit 7f040eb
Showing 1 changed file with 12 additions and 11 deletions.
23 changes: 12 additions & 11 deletions service_linux.go
Expand Up @@ -56,7 +56,13 @@ func (c *controller) addServiceBinding(name, sid, nid, eid string, vip net.IP, i
}
c.Unlock()

// Add endpoint IP to special "tasks.svc_name" so that the
// applications have access to DNS RR.
n.(*network).addSvcRecords("tasks."+name, ip, nil, false)

s.Lock()
defer s.Unlock()

lb, ok := s.loadBalancers[nid]
if !ok {
// Create a new load balancer if we are seeing this
Expand Down Expand Up @@ -89,11 +95,6 @@ func (c *controller) addServiceBinding(name, sid, nid, eid string, vip net.IP, i
}

lb.backEnds[eid] = ip
s.Unlock()

// Add endpoint IP to special "tasks.svc_name" so that the
// applications have access to DNS RR.
n.(*network).addSvcRecords("tasks."+name, ip, nil, false)

// Add loadbalancer service and backend in all sandboxes in
// the network only if vip is valid.
Expand All @@ -120,17 +121,18 @@ func (c *controller) rmServiceBinding(name, sid, nid, eid string, vip net.IP, in
}
c.Unlock()

// Delete the special "tasks.svc_name" backend record.
n.(*network).deleteSvcRecords("tasks."+name, ip, nil, false)

s.Lock()
defer s.Unlock()

lb, ok := s.loadBalancers[nid]
if !ok {
s.Unlock()
return nil
}

// Delete the special "tasks.svc_name" backend record.
n.(*network).deleteSvcRecords("tasks."+name, ip, nil, false)
delete(lb.backEnds, eid)

if len(lb.backEnds) == 0 {
// All the backends for this service have been
// removed. Time to remove the load balancer and also
Expand All @@ -153,7 +155,6 @@ func (c *controller) rmServiceBinding(name, sid, nid, eid string, vip net.IP, in
// remove the service itself.
delete(c.serviceBindings, sid)
}
s.Unlock()

// Remove loadbalancer service(if needed) and backend in all
// sandboxes in the network only if the vip is valid.
Expand Down Expand Up @@ -312,7 +313,7 @@ func (sb *sandbox) addLBBackend(ip, vip net.IP, fwMark uint32, ingressPorts []*P
// destination.
s.SchedName = ""
if err := i.NewDestination(s, d); err != nil && err != syscall.EEXIST {
logrus.Errorf("Failed to create real server %s for vip %s fwmark %d: %v", ip, vip, fwMark, err)
logrus.Errorf("Failed to create real server %s for vip %s fwmark %d in sb %s: %v", ip, vip, fwMark, sb.containerID, err)
}
}

Expand Down

0 comments on commit 7f040eb

Please sign in to comment.