Scheduling is done with two priority queues, one for high priority jobs and one for low priority jobs. These priority queues are ordered by absolute time values plus some job specific identified.
There are following (non exhaustive) kinds of jobs:
job to be canceled
dependency providing jobs
Jobs implement a kind of future. We try hard to avoid any blocking waits. The Job scheduler runs singlethreaded. Its only task is to schedule and delegate jobs to worker threads, by itself it will never do any extensive processing.
Each job has an pre configured behaviour for the case of failure or deadline miss. Any canceling and expireing jobs gets noted in Statistics to adjust performance and timings for optimal performance and I/O throughput.