Revision 1c532d2d src/Ganeti/JQScheduler.hs

b/src/Ganeti/JQScheduler.hs
32 32

  
33 33
import Control.Arrow
34 34
import Control.Concurrent
35
import Control.Exception
35 36
import Control.Monad
36 37
import Data.List
37 38
import Data.IORef
......
161 162
  in (queue {qEnqueued=remain, qRunning=qRunning queue ++ chosen}
162 163
     , map jJob chosen)
163 164

  
165
-- | Requeue jobs that were previously selected for execution
166
-- but couldn't be started.
167
requeueJobs :: JQStatus -> [QueuedJob] -> IOError -> IO ()
168
requeueJobs qstate jobs err = do
169
  let jids = map qjId jobs
170
      jidsString = commaJoin $ map (show . fromJobId) jids
171
      rmJobs = filter ((`notElem` jids) . qjId . jJob)
172
  logWarning $ "Starting jobs failed: " ++ show err
173
  logWarning $ "Rescheduling jobs: " ++ jidsString
174
  modifyJobs qstate (onRunningJobs rmJobs)
175
  modifyJobs qstate (onQueuedJobs . (++) $ map unreadJob jobs)
176

  
164 177
-- | Schedule jobs to be run. This is the IO wrapper around the
165 178
-- pure `selectJobsToRun`.
166 179
scheduleSomeJobs :: JQStatus -> IO ()
......
168 181
  chosen <- atomicModifyIORef (jqJobs qstate) selectJobsToRun
169 182
  unless (null chosen) . logInfo . (++) "Starting jobs: " . commaJoin
170 183
    $ map (show . fromJobId . qjId) chosen
171
  JQ.startJobs chosen
184
  result <- try $ JQ.startJobs chosen
185
  either (requeueJobs qstate chosen) return result
172 186

  
173 187
-- | Format the job queue status in a compact, human readable way.
174 188
showQueue :: Queue -> String

Also available in: Unified diff