forked from vieter-v/vieter
				
			refactor(build): remove some code duplication from queue
							parent
							
								
									03f2240ff6
								
							
						
					
					
						commit
						d3151863ee
					
				| 
						 | 
				
			
			@ -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)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue