feat: add worker distributor and model registry
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -2,26 +2,84 @@ package executor
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"time"
|
||||
|
||||
"git.front.kjuulh.io/kjuulh/orbis/internal/modelregistry"
|
||||
"git.front.kjuulh.io/kjuulh/orbis/internal/modelschedule"
|
||||
"git.front.kjuulh.io/kjuulh/orbis/internal/worker"
|
||||
"git.front.kjuulh.io/kjuulh/orbis/internal/workscheduler"
|
||||
)
|
||||
|
||||
type Executor struct {
|
||||
logger *slog.Logger
|
||||
|
||||
modelRegistry *modelregistry.ModelRegistry
|
||||
modelSchedule *modelschedule.ModelSchedule
|
||||
worker *worker.Worker
|
||||
workerscheduler *workscheduler.WorkScheduler
|
||||
}
|
||||
|
||||
func NewExecutor(logger *slog.Logger) *Executor {
|
||||
func NewExecutor(
|
||||
logger *slog.Logger,
|
||||
modelRegistry *modelregistry.ModelRegistry,
|
||||
modelSchedule *modelschedule.ModelSchedule,
|
||||
worker *worker.Worker,
|
||||
workerscheduler *workscheduler.WorkScheduler,
|
||||
) *Executor {
|
||||
return &Executor{
|
||||
logger: logger,
|
||||
|
||||
modelRegistry: modelRegistry,
|
||||
modelSchedule: modelSchedule,
|
||||
worker: worker,
|
||||
workerscheduler: workerscheduler,
|
||||
}
|
||||
}
|
||||
|
||||
func (e *Executor) DispatchEvents(ctx context.Context) error {
|
||||
e.logger.InfoContext(ctx, "dispatching events")
|
||||
|
||||
// TODO: Process updates to models
|
||||
// TODO: Insert new cron for runtime
|
||||
// TODO: Calculate time since last run
|
||||
// TODO: Send events for workers to pick up
|
||||
start := time.Now().Add(-time.Second * 30)
|
||||
end := time.Now()
|
||||
|
||||
models, err := e.modelRegistry.GetModels()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get models from registry: %w", err)
|
||||
}
|
||||
|
||||
registeredWorkers, err := e.worker.GetWorkers(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to find workers: %w", err)
|
||||
}
|
||||
|
||||
workers, err := e.workerscheduler.GetWorkers(ctx, registeredWorkers)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to find workers: %w", err)
|
||||
}
|
||||
|
||||
for workers := range workers.IterateSlice(2000) {
|
||||
for _, model := range models {
|
||||
modelRuns, lastRun, err := e.modelSchedule.GetNext(ctx, model, start, end, uint(len(workers)))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for i, modelRun := range modelRuns {
|
||||
worker := workers[i]
|
||||
e.logger.DebugContext(ctx, "dispatching model run", "modelRun", modelRun.Model.Name, "start", modelRun.Start, "end", modelRun.End)
|
||||
|
||||
if err := e.workerscheduler.InsertModelRun(ctx, worker, &modelRun); err != nil {
|
||||
return fmt.Errorf("failed to register model run: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
if err := e.modelSchedule.UpdateModelRun(ctx, model, lastRun); err != nil {
|
||||
return fmt.Errorf("failed to update checkpoint for model: %w", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user