|
|
|
@ -8,32 +8,77 @@ package workers
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"context" |
|
|
|
|
"runtime/debug" |
|
|
|
|
"time" |
|
|
|
|
|
|
|
|
|
"forge.chapril.org/dune/jw" |
|
|
|
|
"forge.chapril.org/dune/sdk" |
|
|
|
|
"forge.chapril.org/losyme/uuid" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
const ( |
|
|
|
|
_timeoutOnError = 9 * time.Second |
|
|
|
|
_timeoutNoJob = 2 * time.Second |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
type worker struct { |
|
|
|
|
id string |
|
|
|
|
host string |
|
|
|
|
model sdk.Model |
|
|
|
|
runner sdk.Runner |
|
|
|
|
logger Logger |
|
|
|
|
state *state |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func newWorker(host string, runner sdk.Runner, logger Logger, state *state) *worker { |
|
|
|
|
func newWorker(host string, model sdk.Model, runner sdk.Runner, logger Logger, state *state) *worker { |
|
|
|
|
return &worker{ |
|
|
|
|
id: uuid.New(), |
|
|
|
|
host: host, |
|
|
|
|
model: model, |
|
|
|
|
runner: runner, |
|
|
|
|
logger: logger, |
|
|
|
|
state: state, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (w *worker) updateJob(job *jw.Job) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (w *worker) maybeRunJob() time.Duration { |
|
|
|
|
return 2 * time.Second |
|
|
|
|
defer func() { |
|
|
|
|
if data := recover(); data != nil { |
|
|
|
|
if w.logger != nil { |
|
|
|
|
w.logger.Error("PANIC ERROR RECOVERED", "data", data, "stack", string(debug.Stack())) //::::::::::::::::
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
job, err := w.model.NextJob(w.runner.Namespace()) |
|
|
|
|
if err != nil { |
|
|
|
|
return _timeoutOnError |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if job == nil { |
|
|
|
|
return _timeoutNoJob |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
number := w.state.addJob(w.id, job) |
|
|
|
|
defer w.state.removeJob(w.id) |
|
|
|
|
|
|
|
|
|
if logger := w.logger; logger != nil { |
|
|
|
|
logger.Info("JOB", job.Fields()...) //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|
|
|
|
logger.Info( //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|
|
|
|
"Worker", |
|
|
|
|
"id", w.id, |
|
|
|
|
"job", job.ID, |
|
|
|
|
"number", number, |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
w.runner.Run(job) |
|
|
|
|
w.updateJob(job) |
|
|
|
|
|
|
|
|
|
return 0 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (w *worker) loop(ctx context.Context, stopCh <-chan bool) { |
|
|
|
|