Revision 96d55b50 src/Ganeti/JQScheduler.hs
b/src/Ganeti/JQScheduler.hs | ||
---|---|---|
29 | 29 |
, initJQScheduler |
30 | 30 |
, enqueueNewJobs |
31 | 31 |
, dequeueJob |
32 |
, setJobPriority |
|
32 | 33 |
) where |
33 | 34 |
|
34 | 35 |
import Control.Arrow |
35 | 36 |
import Control.Concurrent |
36 | 37 |
import Control.Exception |
37 | 38 |
import Control.Monad |
39 |
import Control.Monad.IO.Class |
|
38 | 40 |
import Data.Function (on) |
39 | 41 |
import Data.List |
40 | 42 |
import Data.Maybe |
... | ... | |
330 | 332 |
logDebug $ "Result of dequeing job " ++ show (fromJobId jid) |
331 | 333 |
++ " is " ++ show result' |
332 | 334 |
return result' |
335 |
|
|
336 |
-- | Change the priority of a queued job (once the job is handed over |
|
337 |
-- to execution, the job itself needs to be informed). To avoid the |
|
338 |
-- job being started unmodified, it is temporarily unqueued during the |
|
339 |
-- change. Return the modified job, if the job's priority was sucessfully |
|
340 |
-- modified, Nothing, if the job already started, and a Bad value, if the job |
|
341 |
-- is unkown. |
|
342 |
setJobPriority :: JQStatus -> JobId -> Int -> IO (Result (Maybe QueuedJob)) |
|
343 |
setJobPriority state jid prio = runResultT $ do |
|
344 |
maybeJob <- mkResultT . atomicModifyIORef (jqJobs state) $ rmJob jid |
|
345 |
case maybeJob of |
|
346 |
Nothing -> return Nothing |
|
347 |
Just job -> do |
|
348 |
let job' = changeJobPriority prio job |
|
349 |
qDir <- liftIO queueDir |
|
350 |
mkResultT $ writeJobToDisk qDir job' |
|
351 |
liftIO $ enqueueNewJobs state [job'] |
|
352 |
return $ Just job' |
Also available in: Unified diff