Merge pull request #18590 from mikedanese/transit

Auto commit by PR queue bot
This commit is contained in:
k8s-merge-robot
2015-12-15 04:09:02 -08:00
2 changed files with 28 additions and 11 deletions

View File

@@ -150,6 +150,7 @@ type LeaderElectionRecord struct {
LeaseDurationSeconds int `json:"leaseDurationSeconds"` LeaseDurationSeconds int `json:"leaseDurationSeconds"`
AcquireTime unversioned.Time `json:"acquireTime"` AcquireTime unversioned.Time `json:"acquireTime"`
RenewTime unversioned.Time `json:"renewTime"` RenewTime unversioned.Time `json:"renewTime"`
LeaderTransitions int `json:"leaderTransitions"`
} }
// Run starts the leader election loop // Run starts the leader election loop
@@ -242,8 +243,9 @@ func (le *LeaderElector) tryAcquireOrRenew() bool {
e.Annotations = make(map[string]string) e.Annotations = make(map[string]string)
} }
if oldLeaderElectionRecordBytes, found := e.Annotations[LeaderElectionRecordAnnotationKey]; found {
var oldLeaderElectionRecord LeaderElectionRecord var oldLeaderElectionRecord LeaderElectionRecord
if oldLeaderElectionRecordBytes, found := e.Annotations[LeaderElectionRecordAnnotationKey]; found {
if err := json.Unmarshal([]byte(oldLeaderElectionRecordBytes), &oldLeaderElectionRecord); err != nil { if err := json.Unmarshal([]byte(oldLeaderElectionRecordBytes), &oldLeaderElectionRecord); err != nil {
glog.Errorf("error unmarshaling leader election record: %v", err) glog.Errorf("error unmarshaling leader election record: %v", err)
return false return false
@@ -252,9 +254,6 @@ func (le *LeaderElector) tryAcquireOrRenew() bool {
le.observedRecord = oldLeaderElectionRecord le.observedRecord = oldLeaderElectionRecord
le.observedTime = time.Now() le.observedTime = time.Now()
} }
if oldLeaderElectionRecord.HolderIdentity == le.config.Identity {
leaderElectionRecord.AcquireTime = oldLeaderElectionRecord.AcquireTime
}
if le.observedTime.Add(le.config.LeaseDuration).After(now.Time) && if le.observedTime.Add(le.config.LeaseDuration).After(now.Time) &&
oldLeaderElectionRecord.HolderIdentity != le.config.Identity { oldLeaderElectionRecord.HolderIdentity != le.config.Identity {
glog.Infof("lock is held by %v and has not yet expired", oldLeaderElectionRecord.HolderIdentity) glog.Infof("lock is held by %v and has not yet expired", oldLeaderElectionRecord.HolderIdentity)
@@ -262,6 +261,14 @@ func (le *LeaderElector) tryAcquireOrRenew() bool {
} }
} }
// We're going to try to update. The leaderElectionRecord is set to it's default
// here. Let's correct it before updating.
if oldLeaderElectionRecord.HolderIdentity == le.config.Identity {
leaderElectionRecord.AcquireTime = oldLeaderElectionRecord.AcquireTime
} else {
leaderElectionRecord.LeaderTransitions = oldLeaderElectionRecord.LeaderTransitions + 1
}
leaderElectionRecordBytes, err := json.Marshal(leaderElectionRecord) leaderElectionRecordBytes, err := json.Marshal(leaderElectionRecord)
if err != nil { if err != nil {
glog.Errorf("err marshaling leader election record: %v", err) glog.Errorf("err marshaling leader election record: %v", err)

View File

@@ -46,6 +46,7 @@ func TestTryAcquireOrRenew(t *testing.T) {
} }
expectSuccess bool expectSuccess bool
transitionLeader bool
outHolder string outHolder string
}{ }{
// acquire from no endpoints // acquire from no endpoints
@@ -94,7 +95,9 @@ func TestTryAcquireOrRenew(t *testing.T) {
}, },
}, },
}, },
expectSuccess: true, expectSuccess: true,
transitionLeader: true,
outHolder: "baz", outHolder: "baz",
}, },
// acquire from led, unacked endpoints // acquire from led, unacked endpoints
@@ -128,6 +131,7 @@ func TestTryAcquireOrRenew(t *testing.T) {
observedTime: past, observedTime: past,
expectSuccess: true, expectSuccess: true,
transitionLeader: true,
outHolder: "baz", outHolder: "baz",
}, },
// don't acquire from led, acked endpoints // don't acquire from led, acked endpoints
@@ -225,7 +229,13 @@ func TestTryAcquireOrRenew(t *testing.T) {
t.Errorf("[%v]expected holder:\n\t%+v\ngot:\n\t%+v", i, test.outHolder, le.observedRecord.HolderIdentity) t.Errorf("[%v]expected holder:\n\t%+v\ngot:\n\t%+v", i, test.outHolder, le.observedRecord.HolderIdentity)
} }
if len(test.reactors) != len(c.Actions()) { if len(test.reactors) != len(c.Actions()) {
t.Errorf("[%v]wrong number of api interactions") t.Errorf("[%v]wrong number of api interactions", i)
}
if test.transitionLeader && le.observedRecord.LeaderTransitions != 1 {
t.Errorf("[%v]leader should have transitioned but did not", i)
}
if !test.transitionLeader && le.observedRecord.LeaderTransitions != 0 {
t.Errorf("[%v]leader should not have transitioned but did", i)
} }
} }
} }