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