diff --git a/scheduler/node.go b/scheduler/node.go index d1d1eb3..5fc3906 100644 --- a/scheduler/node.go +++ b/scheduler/node.go @@ -2,7 +2,6 @@ package scheduler import ( "log/slog" - "sync" "time" "github.com/gammadia/alfred/proto" @@ -46,15 +45,10 @@ type nodeState struct { nodeName string earliestStart time.Time - - mutex sync.Mutex } func (ns *nodeState) UpdateStatus(status NodeStatus) { if ns.status != status { - ns.mutex.Lock() - defer ns.mutex.Unlock() - ns.status = status ns.scheduler.broadcast(EventNodeStatusUpdated{Node: ns.nodeName, Status: status}) } diff --git a/scheduler/scheduler.go b/scheduler/scheduler.go index 47bdcc6..74c8b82 100644 --- a/scheduler/scheduler.go +++ b/scheduler/scheduler.go @@ -326,11 +326,10 @@ func (s *Scheduler) resizePool() { for i := 0; i < nodesToCreate; i++ { // Never queue the first node we create - queueNode := len(s.nodes) > 0 && time.Now().Before(s.earliestNextNodeStart) - s.earliestNextNodeStart = s.earliestNextNodeStart.Add(lo.Ternary(queueNode, s.config.ProvisioningDelay, 0)) + queueNode := (len(s.nodes) > 0 || len(s.nodesQueue) > 0 || i > 0) && time.Now().Before(s.earliestNextNodeStart) nodeName := namegen.Get() - nodeState := &nodeState{ + ns := &nodeState{ scheduler: s, node: nil, @@ -342,21 +341,23 @@ func (s *Scheduler) resizePool() { earliestStart: s.earliestNextNodeStart, } - nodeState.log.Debug("Creating node", "earliestStart", nodeState.earliestStart, "status", nodeState.status) - s.broadcast(EventNodeCreated{Node: nodeName, Status: nodeState.status}) + ns.log.Debug("Creating node", "earliestStart", ns.earliestStart, "status", ns.status) + s.broadcast(EventNodeCreated{Node: nodeName, Status: ns.status}) if queueNode { - s.nodesQueue = append(s.nodesQueue, nodeState) + s.nodesQueue = append(s.nodesQueue, ns) wait := time.Until(s.earliestNextNodeStart) - nodeState.log.Debug("Wait before provisioning node", "wait", wait) s.after(wait, func() { s.requestTick("queued node should be ready to be provisioned") }) } else { - s.nodes = append(s.nodes, nodeState) - go s.watchNodeProvisioning(nodeState) + s.nodes = append(s.nodes, ns) + go s.watchNodeProvisioning(ns) } + + // The next node should start with a delay + s.earliestNextNodeStart = s.earliestNextNodeStart.Add(s.config.ProvisioningDelay) } }