mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-15 22:20:51 +00:00
Merge pull request #18590 from mikedanese/transit
Auto commit by PR queue bot
This commit is contained in:
@@ -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)
|
||||||
|
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user