Revision 1c532d2d
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