forked from vieter-v/vieter
refactor: link libvieter; remove cron code & daemon
This giant commit removes the old cron daemon & parser, replacing the latter with a C implementation that will now be maintained in a separate C library that gets developed independently. This commit lays the groundwork for implementing features of Vieter in C where possible.
This commit is contained in:
parent
bfd28d6f70
commit
beb90d5756
26 changed files with 278 additions and 916 deletions
|
|
@ -1,7 +1,7 @@
|
|||
module build
|
||||
|
||||
import models { BuildConfig, Target }
|
||||
import cron.expression { CronExpression, parse_expression }
|
||||
import cron
|
||||
import time
|
||||
import datatypes { MinHeap }
|
||||
import util
|
||||
|
|
@ -13,7 +13,7 @@ pub mut:
|
|||
// Next timestamp from which point this job is allowed to be executed
|
||||
timestamp time.Time
|
||||
// Required for calculating next timestamp after having pop'ed a job
|
||||
ce CronExpression
|
||||
ce &cron.Expression = unsafe { nil }
|
||||
// Actual build config sent to the agent
|
||||
config BuildConfig
|
||||
// Whether this is a one-time job
|
||||
|
|
@ -30,7 +30,7 @@ fn (r1 BuildJob) < (r2 BuildJob) bool {
|
|||
// for each architecture. Agents receive jobs from this queue.
|
||||
pub struct BuildJobQueue {
|
||||
// Schedule to use for targets without explicitely defined cron expression
|
||||
default_schedule CronExpression
|
||||
default_schedule &cron.Expression
|
||||
// Base image to use for targets without defined base image
|
||||
default_base_image string
|
||||
mut:
|
||||
|
|
@ -44,9 +44,9 @@ mut:
|
|||
}
|
||||
|
||||
// new_job_queue initializes a new job queue
|
||||
pub fn new_job_queue(default_schedule CronExpression, default_base_image string) BuildJobQueue {
|
||||
pub fn new_job_queue(default_schedule &cron.Expression, default_base_image string) BuildJobQueue {
|
||||
return BuildJobQueue{
|
||||
default_schedule: default_schedule
|
||||
default_schedule: unsafe { default_schedule }
|
||||
default_base_image: default_base_image
|
||||
invalidated: map[int]time.Time{}
|
||||
}
|
||||
|
|
@ -85,14 +85,14 @@ pub fn (mut q BuildJobQueue) insert(input InsertConfig) ! {
|
|||
|
||||
if !input.now {
|
||||
ce := if input.target.schedule != '' {
|
||||
parse_expression(input.target.schedule) or {
|
||||
cron.parse_expression(input.target.schedule) or {
|
||||
return error("Error while parsing cron expression '$input.target.schedule' (id $input.target.id): $err.msg()")
|
||||
}
|
||||
} else {
|
||||
q.default_schedule
|
||||
}
|
||||
|
||||
job.timestamp = ce.next_from_now()!
|
||||
job.timestamp = ce.next_from_now()
|
||||
job.ce = ce
|
||||
} else {
|
||||
job.timestamp = time.now()
|
||||
|
|
@ -105,8 +105,8 @@ pub fn (mut q BuildJobQueue) insert(input InsertConfig) ! {
|
|||
// reschedule the given job by calculating the next timestamp and re-adding it
|
||||
// to its respective queue. This function is called by the pop functions
|
||||
// *after* having pop'ed the job.
|
||||
fn (mut q BuildJobQueue) reschedule(job BuildJob, arch string) ! {
|
||||
new_timestamp := job.ce.next_from_now()!
|
||||
fn (mut q BuildJobQueue) reschedule(job BuildJob, arch string) {
|
||||
new_timestamp := job.ce.next_from_now()
|
||||
|
||||
new_job := BuildJob{
|
||||
...job
|
||||
|
|
@ -168,10 +168,7 @@ pub fn (mut q BuildJobQueue) pop(arch string) ?BuildJob {
|
|||
job = q.queues[arch].pop()?
|
||||
|
||||
if !job.single {
|
||||
// TODO how do we handle this properly? Is it even possible for a
|
||||
// cron expression to not return a next time if it's already been
|
||||
// used before?
|
||||
q.reschedule(job, arch) or {}
|
||||
q.reschedule(job, arch)
|
||||
}
|
||||
|
||||
return job
|
||||
|
|
@ -198,8 +195,7 @@ pub fn (mut q BuildJobQueue) pop_n(arch string, n int) []BuildJob {
|
|||
job = q.queues[arch].pop() or { break }
|
||||
|
||||
if !job.single {
|
||||
// TODO idem
|
||||
q.reschedule(job, arch) or {}
|
||||
q.reschedule(job, arch)
|
||||
}
|
||||
|
||||
out << job
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue