renew loops calling tryAcquireOrRenew and returns immediately when tryAcquireOrRenew fails or ctx signals done.
(ctx context.Context)
| 250 | |
| 251 | // renew loops calling tryAcquireOrRenew and returns immediately when tryAcquireOrRenew fails or ctx signals done. |
| 252 | func (le *LeaderElector) renew(ctx context.Context) { |
| 253 | ctx, cancel := context.WithCancel(ctx) |
| 254 | defer cancel() |
| 255 | wait.Until(func() { |
| 256 | timeoutCtx, timeoutCancel := context.WithTimeout(ctx, le.config.RenewDeadline) |
| 257 | defer timeoutCancel() |
| 258 | err := wait.PollImmediateUntil(le.config.RetryPeriod, func() (bool, error) { |
| 259 | done := make(chan bool, 1) |
| 260 | go func() { |
| 261 | defer close(done) |
| 262 | done <- le.tryAcquireOrRenew() |
| 263 | }() |
| 264 | |
| 265 | select { |
| 266 | case <-timeoutCtx.Done(): |
| 267 | return false, fmt.Errorf("failed to tryAcquireOrRenew %s", timeoutCtx.Err()) |
| 268 | case result := <-done: |
| 269 | return result, nil |
| 270 | } |
| 271 | }, timeoutCtx.Done()) |
| 272 | |
| 273 | le.maybeReportTransition() |
| 274 | desc := le.config.Lock.Describe() |
| 275 | if err == nil { |
| 276 | klog.V(5).Infof("successfully renewed lease %v", desc) |
| 277 | return |
| 278 | } |
| 279 | le.config.Lock.RecordEvent("stopped leading") |
| 280 | le.metrics.leaderOff(le.config.Name) |
| 281 | klog.Infof("failed to renew lease %v: %v", desc, err) |
| 282 | cancel() |
| 283 | }, le.config.RetryPeriod, ctx.Done()) |
| 284 | |
| 285 | // if we hold the lease, give it up |
| 286 | if le.config.ReleaseOnCancel { |
| 287 | le.release() |
| 288 | } |
| 289 | } |
| 290 | |
| 291 | // release attempts to release the leader lease if we have acquired it. |
| 292 | func (le *LeaderElector) release() bool { |
no test coverage detected