fix bugs introduced by ipvs graceful termination

pull/58/head
liangwei 2018-09-30 16:40:13 +08:00
parent 8ec98fc26c
commit 456c351e31
4 changed files with 14 additions and 38 deletions

View File

@ -82,9 +82,6 @@ func (q *graceTerminateRSList) remove(rs *listItem) bool {
} }
func (q *graceTerminateRSList) flushList(handler func(rsToDelete *listItem) (bool, error)) bool { func (q *graceTerminateRSList) flushList(handler func(rsToDelete *listItem) (bool, error)) bool {
q.lock.Lock()
defer q.lock.Unlock()
success := true success := true
for name, rs := range q.list { for name, rs := range q.list {
deleted, err := handler(rs) deleted, err := handler(rs)
@ -105,8 +102,8 @@ func (q *graceTerminateRSList) exist(uniqueRS string) (*listItem, bool) {
q.lock.Lock() q.lock.Lock()
defer q.lock.Unlock() defer q.lock.Unlock()
if _, ok := q.list[uniqueRS]; ok { if rs, ok := q.list[uniqueRS]; ok {
return nil, false return rs, true
} }
return nil, false return nil, false
} }
@ -144,7 +141,7 @@ func (m *GracefulTerminationManager) GracefulDeleteRS(vs *utilipvs.VirtualServer
} }
deleted, err := m.deleteRsFunc(ele) deleted, err := m.deleteRsFunc(ele)
if err != nil { if err != nil {
glog.Errorf("Delete rs %q err: %v", err) glog.Errorf("Delete rs %q err: %v", ele.String(), err)
} }
if deleted { if deleted {
return nil return nil
@ -178,7 +175,7 @@ func (m *GracefulTerminationManager) deleteRsFunc(rsToDelete *listItem) (bool, e
return true, nil return true, nil
} }
} }
return false, fmt.Errorf("Failed to delete rs %q, can't find the real server", rsToDelete.String()) return true, fmt.Errorf("Failed to delete rs %q, can't find the real server", rsToDelete.String())
} }
func (m *GracefulTerminationManager) tryDeleteRs() { func (m *GracefulTerminationManager) tryDeleteRs() {

View File

@ -1533,7 +1533,7 @@ func (proxier *Proxier) syncEndpoint(svcPortName proxy.ServicePortName, onlyNode
} }
if curEndpoints.Has(ep) { if curEndpoints.Has(ep) {
// check if newEndpoint is in gracefulDelete list, is true, delete this ep immediately // check if newEndpoint is in gracefulDelete list, if true, delete this ep immediately
uniqueRS := GetUniqueRSName(vs, newDest) uniqueRS := GetUniqueRSName(vs, newDest)
if !proxier.gracefuldeleteManager.InTerminationList(uniqueRS) { if !proxier.gracefuldeleteManager.InTerminationList(uniqueRS) {
continue continue
@ -1591,10 +1591,14 @@ func (proxier *Proxier) cleanLegacyService(activeServices map[string]bool, curre
// This service was not processed in the latest sync loop so before deleting it, // This service was not processed in the latest sync loop so before deleting it,
// make sure it does not fall within an excluded CIDR range. // make sure it does not fall within an excluded CIDR range.
okayToDelete := true okayToDelete := true
rsList, err := proxier.ipvs.GetRealServers(svc) rsList, _ := proxier.ipvs.GetRealServers(svc)
if len(rsList) != 0 && err == nil { for _, rs := range rsList {
glog.V(5).Infof("Will not delete VS: %v, cause it have RS: %v", svc, rsList) uniqueRS := GetUniqueRSName(svc, rs)
okayToDelete = false // if there are in terminating real server in this service, then handle it later
if proxier.gracefuldeleteManager.InTerminationList(uniqueRS) {
okayToDelete = false
break
}
} }
for _, excludedCIDR := range proxier.excludeCIDRs { for _, excludedCIDR := range proxier.excludeCIDRs {
// Any validation of this CIDR already should have occurred. // Any validation of this CIDR already should have occurred.

View File

@ -108,6 +108,5 @@ func (rs *RealServer) String() string {
// We don't use struct == since it doesn't work because of slice. // We don't use struct == since it doesn't work because of slice.
func (rs *RealServer) Equal(other *RealServer) bool { func (rs *RealServer) Equal(other *RealServer) bool {
return rs.Address.Equal(other.Address) && return rs.Address.Equal(other.Address) &&
rs.Port == other.Port && rs.Port == other.Port
rs.Weight == other.Weight
} }

View File

@ -249,12 +249,10 @@ func TestRealServerEqual(t *testing.T) {
rsA: &RealServer{ rsA: &RealServer{
Address: net.ParseIP("10.20.30.40"), Address: net.ParseIP("10.20.30.40"),
Port: 80, Port: 80,
Weight: 1,
}, },
rsB: &RealServer{ rsB: &RealServer{
Address: net.ParseIP("10.20.30.41"), Address: net.ParseIP("10.20.30.41"),
Port: 80, Port: 80,
Weight: 1,
}, },
equal: false, equal: false,
reason: "IPv4 address not equal", reason: "IPv4 address not equal",
@ -263,12 +261,10 @@ func TestRealServerEqual(t *testing.T) {
rsA: &RealServer{ rsA: &RealServer{
Address: net.ParseIP("2012::beef"), Address: net.ParseIP("2012::beef"),
Port: 80, Port: 80,
Weight: 1,
}, },
rsB: &RealServer{ rsB: &RealServer{
Address: net.ParseIP("2017::beef"), Address: net.ParseIP("2017::beef"),
Port: 80, Port: 80,
Weight: 1,
}, },
equal: false, equal: false,
reason: "IPv6 address not equal", reason: "IPv6 address not equal",
@ -277,40 +273,22 @@ func TestRealServerEqual(t *testing.T) {
rsA: &RealServer{ rsA: &RealServer{
Address: net.ParseIP("2012::beef"), Address: net.ParseIP("2012::beef"),
Port: 80, Port: 80,
Weight: 1,
}, },
rsB: &RealServer{ rsB: &RealServer{
Address: net.ParseIP("2012::beef"), Address: net.ParseIP("2012::beef"),
Port: 8080, Port: 8080,
Weight: 1,
}, },
equal: false, equal: false,
reason: "Port not equal", reason: "Port not equal",
}, },
{
rsA: &RealServer{
Address: net.ParseIP("10.20.30.40"),
Port: 8080,
Weight: 1,
},
rsB: &RealServer{
Address: net.ParseIP("10.20.30.40"),
Port: 8080,
Weight: 10,
},
equal: false,
reason: "Weight not equal",
},
{ {
rsA: &RealServer{ rsA: &RealServer{
Address: net.ParseIP("1.2.3.4"), Address: net.ParseIP("1.2.3.4"),
Port: 3080, Port: 3080,
Weight: 10,
}, },
rsB: &RealServer{ rsB: &RealServer{
Address: net.ParseIP("1.2.3.4"), Address: net.ParseIP("1.2.3.4"),
Port: 3080, Port: 3080,
Weight: 10,
}, },
equal: true, equal: true,
reason: "All fields equal", reason: "All fields equal",
@ -319,12 +297,10 @@ func TestRealServerEqual(t *testing.T) {
rsA: &RealServer{ rsA: &RealServer{
Address: net.ParseIP("2012::beef"), Address: net.ParseIP("2012::beef"),
Port: 3080, Port: 3080,
Weight: 10,
}, },
rsB: &RealServer{ rsB: &RealServer{
Address: net.ParseIP("2012::beef"), Address: net.ParseIP("2012::beef"),
Port: 3080, Port: 3080,
Weight: 10,
}, },
equal: true, equal: true,
reason: "All fields equal", reason: "All fields equal",