From d3151863ee88c7fdf75d6a569be25e76511c38c1 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Tue, 13 Dec 2022 18:24:21 +0100 Subject: [PATCH] refactor(build): remove some code duplication from queue --- CHANGELOG.md | 2 ++ README.md | 5 +-- src/build/queue.v | 88 ++++++++++++++++++++--------------------------- 3 files changed, 43 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2dd760..aed7571 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Migrated codebase to V 0.3.2 * Cron expression parser now uses bitfields instead of bool arrays +* Added option to deploy using agent-server architecture instead of cron daemon ### Fixed @@ -19,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * CLI no longer exits with non-zero status code when removing/patching target * Allow NULL values for branch in database +* Endpoint for adding targets now returns the correct id ## [0.4.0](https://git.rustybever.be/vieter-v/vieter/src/tag/0.4.0) diff --git a/README.md b/README.md index b9fff69..637d4c1 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,8 @@ quicker. I chose [V](https://vlang.io/) as I've been very intrigued by this language for a while now. I wanted a fast language that I could code while relaxing, without having to exert too much mental effort & V seemed like the right choice for -that. +that. Sadly, this didn't quite turn out the way I expected, but I'm sticking +with it anyways ;p ## Features @@ -49,7 +50,7 @@ update`. I used to maintain a mirror that tracked the latest master, but nowadays, I maintain a Docker image containing the specific compiler version that Vieter -builds with. Currently, this is V 0.3. +builds with. Currently, this is V 0.3.2. ## Contributing diff --git a/src/build/queue.v b/src/build/queue.v index 2a28e62..dd2bb87 100644 --- a/src/build/queue.v +++ b/src/build/queue.v @@ -110,6 +110,21 @@ fn (mut q BuildJobQueue) reschedule(job BuildJob, arch string) ! { q.queues[arch].insert(new_job) } +// pop_invalid pops all invalid jobs. +fn (mut q BuildJobQueue) pop_invalid(arch string) { + for { + job := q.queues[arch].peek() or { return } + + if job.config.target_id in q.invalidated + && job.created < q.invalidated[job.config.target_id] { + // This pop *should* never fail according to the source code + q.queues[arch].pop() or {} + } else { + break + } + } +} + // peek shows the first job for the given architecture that's ready to be // executed, if present. pub fn (mut q BuildJobQueue) peek(arch string) ?BuildJob { @@ -118,20 +133,11 @@ pub fn (mut q BuildJobQueue) peek(arch string) ?BuildJob { return none } - for { - job := q.queues[arch].peek() or { return none } + q.pop_invalid(arch) + job := q.queues[arch].peek()? - // Skip any invalidated jobs - if job.config.target_id in q.invalidated - && job.created < q.invalidated[job.config.target_id] { - // This pop *should* never fail according to the source code - q.queues[arch].pop() or { return none } - continue - } - - if job.timestamp < time.now() { - return job - } + if job.timestamp < time.now() { + return job } } @@ -146,27 +152,18 @@ pub fn (mut q BuildJobQueue) pop(arch string) ?BuildJob { return none } - for { - mut job := q.queues[arch].peek() or { return none } + q.pop_invalid(arch) + mut job := q.queues[arch].peek()? - // Skip any invalidated jobs - if job.config.target_id in q.invalidated - && job.created < q.invalidated[job.config.target_id] { - // This pop *should* never fail according to the source code - q.queues[arch].pop() or { return none } - continue - } + if job.timestamp < time.now() { + job = q.queues[arch].pop()? - if job.timestamp < time.now() { - job = q.queues[arch].pop()? + // 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 {} - // 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 {} - - return job - } + return job } } @@ -182,28 +179,19 @@ pub fn (mut q BuildJobQueue) pop_n(arch string, n int) []BuildJob { mut out := []BuildJob{} - outer: for out.len < n { - for { - mut job := q.queues[arch].peek() or { break outer } + for out.len < n { + q.pop_invalid(arch) + mut job := q.queues[arch].peek() or { break } - // Skip any invalidated jobs - if job.config.target_id in q.invalidated - && job.created < q.invalidated[job.config.target_id] { - // This pop *should* never fail according to the source code - q.queues[arch].pop() or { break outer } - continue - } + if job.timestamp < time.now() { + job = q.queues[arch].pop() or { break } - if job.timestamp < time.now() { - job = q.queues[arch].pop() or { break outer } + // TODO idem + q.reschedule(job, arch) or {} - // TODO idem - q.reschedule(job, arch) or {} - - out << job - } else { - break outer - } + out << job + } else { + break } }