mirror of
https://github.com/coder/coder.git
synced 2025-07-23 21:32:07 +00:00
fix: fix PG Coordinator to update when heartbeats (re)start (#8178)
* fix: fix PG Coordinator to update when heartbeats (re)start Signed-off-by: Spike Curtis <spike@coder.com> * rename resetExpiryTimer(WithLock) Signed-off-by: Spike Curtis <spike@coder.com> --------- Signed-off-by: Spike Curtis <spike@coder.com>
This commit is contained in:
@ -1137,7 +1137,13 @@ func (h *heartbeats) recvBeat(id uuid.UUID) {
|
||||
h.logger.Debug(h.ctx, "got heartbeat", slog.F("other_coordinator_id", id))
|
||||
h.lock.Lock()
|
||||
defer h.lock.Unlock()
|
||||
var oldestTime time.Time
|
||||
if _, ok := h.coordinators[id]; !ok {
|
||||
h.logger.Info(h.ctx, "heartbeats (re)started", slog.F("other_coordinator_id", id))
|
||||
// send on a separate goroutine to avoid holding lock. Triggering update can be async
|
||||
go func() {
|
||||
_ = sendCtx(h.ctx, h.update, struct{}{})
|
||||
}()
|
||||
}
|
||||
h.coordinators[id] = time.Now()
|
||||
|
||||
if h.timer == nil {
|
||||
@ -1146,7 +1152,11 @@ func (h *heartbeats) recvBeat(id uuid.UUID) {
|
||||
h.logger.Debug(h.ctx, "set initial heartbeat timeout")
|
||||
return
|
||||
}
|
||||
h.resetExpiryTimerWithLock()
|
||||
}
|
||||
|
||||
func (h *heartbeats) resetExpiryTimerWithLock() {
|
||||
var oldestTime time.Time
|
||||
for _, t := range h.coordinators {
|
||||
if oldestTime.IsZero() || t.Before(oldestTime) {
|
||||
oldestTime = t
|
||||
@ -1163,6 +1173,7 @@ func (h *heartbeats) recvBeat(id uuid.UUID) {
|
||||
func (h *heartbeats) checkExpiry() {
|
||||
h.logger.Debug(h.ctx, "checking heartbeat expiry")
|
||||
h.lock.Lock()
|
||||
defer h.lock.Unlock()
|
||||
now := time.Now()
|
||||
expired := false
|
||||
for id, t := range h.coordinators {
|
||||
@ -1174,10 +1185,14 @@ func (h *heartbeats) checkExpiry() {
|
||||
h.logger.Info(h.ctx, "coordinator failed heartbeat check", slog.F("other_coordinator_id", id), slog.F("last_heartbeat", lastHB))
|
||||
}
|
||||
}
|
||||
h.lock.Unlock()
|
||||
if expired {
|
||||
_ = sendCtx(h.ctx, h.update, struct{}{})
|
||||
// send on a separate goroutine to avoid holding lock. Triggering update can be async
|
||||
go func() {
|
||||
_ = sendCtx(h.ctx, h.update, struct{}{})
|
||||
}()
|
||||
}
|
||||
// we need to reset the timer for when the next oldest coordinator will expire, if any.
|
||||
h.resetExpiryTimerWithLock()
|
||||
}
|
||||
|
||||
func (h *heartbeats) sendBeats() {
|
||||
|
Reference in New Issue
Block a user