Revision 2713b91a
b/src/Ganeti/JQScheduler.hs | ||
---|---|---|
203 | 203 |
logInfo $ showQueue jobs' |
204 | 204 |
scheduleSomeJobs qstate |
205 | 205 |
|
206 |
-- | Read a single, non-archived, job, specified by its id, from disk. |
|
207 |
readJobFromDisk :: JobId -> IO (Result JobWithStat) |
|
208 |
readJobFromDisk jid = do |
|
209 |
qdir <- queueDir |
|
210 |
let fpath = liveJobFile qdir jid |
|
211 |
logDebug $ "Reading " ++ fpath |
|
212 |
tryFstat <- try $ getFStat fpath :: IO (Either IOError FStat) |
|
213 |
let fstat = either (const nullFStat) id tryFstat |
|
214 |
loadResult <- JQ.loadJobFromDisk qdir False jid |
|
215 |
return $ liftM (JobWithStat fstat . fst) loadResult |
|
216 |
|
|
217 |
-- | Read all non-finalized jobs from disk. |
|
218 |
readJobsFromDisk :: IO [JobWithStat] |
|
219 |
readJobsFromDisk = do |
|
220 |
logInfo "Loading job queue" |
|
221 |
qdir <- queueDir |
|
222 |
eitherJids <- JQ.getJobIDs [qdir] |
|
223 |
let jids = either (const []) JQ.sortJobIDs eitherJids |
|
224 |
jidsstring = commaJoin $ map (show . fromJobId) jids |
|
225 |
logInfo $ "Non-archived jobs on disk: " ++ jidsstring |
|
226 |
jobs <- mapM readJobFromDisk jids |
|
227 |
return $ justOk jobs |
|
228 |
|
|
206 | 229 |
-- | Set up the job scheduler. This will also start the monitoring |
207 | 230 |
-- of changes to the running jobs. |
208 | 231 |
initJQScheduler :: JQStatus -> IO () |
209 | 232 |
initJQScheduler qstate = do |
233 |
alljobs <- readJobsFromDisk |
|
234 |
let jobs = filter (not . jobFinalized . jJob) alljobs |
|
235 |
(running, queued) = partition (jobStarted . jJob) jobs |
|
236 |
modifyJobs qstate (onQueuedJobs (++ queued) . onRunningJobs (++ running)) |
|
237 |
jqjobs <- readIORef (jqJobs qstate) |
|
238 |
logInfo $ showQueue jqjobs |
|
239 |
scheduleSomeJobs qstate |
|
210 | 240 |
logInfo "Starting time-based job queue watcher" |
211 | 241 |
_ <- forkIO $ onTimeWatcher qstate |
212 | 242 |
return () |
Also available in: Unified diff