fix(jobs): more general no queue same
This commit is contained in:
parent
24491b446b
commit
b1143cb12b
@ -1,3 +1,5 @@
|
|||||||
|
{-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}
|
||||||
|
|
||||||
module Jobs.Queue
|
module Jobs.Queue
|
||||||
( writeJobCtl, writeJobCtlBlock
|
( writeJobCtl, writeJobCtlBlock
|
||||||
, writeJobCtl', writeJobCtlBlock'
|
, writeJobCtl', writeJobCtlBlock'
|
||||||
@ -18,6 +20,8 @@ import qualified Data.Set as Set
|
|||||||
import qualified Data.List.NonEmpty as NonEmpty
|
import qualified Data.List.NonEmpty as NonEmpty
|
||||||
import qualified Data.HashMap.Strict as HashMap
|
import qualified Data.HashMap.Strict as HashMap
|
||||||
|
|
||||||
|
import qualified Data.Aeson as Aeson
|
||||||
|
|
||||||
import Control.Monad.Random (evalRand, mkStdGen, uniform)
|
import Control.Monad.Random (evalRand, mkStdGen, uniform)
|
||||||
|
|
||||||
import qualified Data.Conduit.List as C
|
import qualified Data.Conduit.List as C
|
||||||
@ -30,6 +34,9 @@ import Control.Monad.Trans.Resource (register)
|
|||||||
|
|
||||||
import System.Clock (getTime, Clock(Monotonic))
|
import System.Clock (getTime, Clock(Monotonic))
|
||||||
|
|
||||||
|
import qualified Database.Esqueleto.Legacy as E
|
||||||
|
import qualified Database.Esqueleto.Utils as E
|
||||||
|
|
||||||
|
|
||||||
data JobQueueException = JobQueuePoolEmpty
|
data JobQueueException = JobQueuePoolEmpty
|
||||||
| JobQueueWorkerNotFound
|
| JobQueueWorkerNotFound
|
||||||
@ -92,7 +99,14 @@ queueJobUnsafe :: Bool -> Job -> YesodDB UniWorX (Maybe QueuedJobId)
|
|||||||
queueJobUnsafe queuedJobWriteLastExec job = do
|
queueJobUnsafe queuedJobWriteLastExec job = do
|
||||||
$logDebugS "queueJob" $ tshow job
|
$logDebugS "queueJob" $ tshow job
|
||||||
|
|
||||||
doQueue <- fmap not . and2M (return $ jobNoQueueSame job) $ exists [ QueuedJobContent ==. toJSON job ]
|
doQueue <- maybeT (return True) $ do
|
||||||
|
noQueueSame <- hoistMaybe $ jobNoQueueSame job
|
||||||
|
lift . fmap not . E.selectExists . E.from $ \queuedJob -> case noQueueSame of
|
||||||
|
JobNoQueueSame -> E.where_ $ queuedJob E.^. QueuedJobContent E.==. E.val (toJSON job)
|
||||||
|
JobNoQueueSameTag ->
|
||||||
|
let Aeson.Object obj = toJSON job
|
||||||
|
tag = obj HashMap.! "job"
|
||||||
|
in E.where_ $ (queuedJob E.^. QueuedJobContent) E.->. "job" E.==. E.val tag
|
||||||
|
|
||||||
if
|
if
|
||||||
| doQueue -> Just <$> do
|
| doQueue -> Just <$> do
|
||||||
|
|||||||
@ -18,7 +18,7 @@ module Jobs.Types
|
|||||||
, showWorkerId, newWorkerId
|
, showWorkerId, newWorkerId
|
||||||
, JobQueue, jqInsert, jqDequeue', jqDequeue, jqDepth, jqContents
|
, JobQueue, jqInsert, jqDequeue', jqDequeue, jqDepth, jqContents
|
||||||
, JobPriority(..), prioritiseJob
|
, JobPriority(..), prioritiseJob
|
||||||
, jobNoQueueSame, jobMovable
|
, JobNoQueueSame(..), jobNoQueueSame, jobMovable
|
||||||
, module Cron
|
, module Cron
|
||||||
) where
|
) where
|
||||||
|
|
||||||
@ -302,21 +302,25 @@ prioritiseJob (JobCtlGenerateHealthReport _) = JobPrioRealtime
|
|||||||
prioritiseJob JobCtlDetermineCrontab = JobPrioRealtime
|
prioritiseJob JobCtlDetermineCrontab = JobPrioRealtime
|
||||||
prioritiseJob _ = JobPrioBatch
|
prioritiseJob _ = JobPrioBatch
|
||||||
|
|
||||||
jobNoQueueSame :: Job -> Bool
|
data JobNoQueueSame = JobNoQueueSame | JobNoQueueSameTag
|
||||||
|
deriving (Eq, Ord, Read, Show, Enum, Bounded, Generic, Typeable)
|
||||||
|
deriving anyclass (Universe, Finite)
|
||||||
|
|
||||||
|
jobNoQueueSame :: Job -> Maybe JobNoQueueSame
|
||||||
jobNoQueueSame = \case
|
jobNoQueueSame = \case
|
||||||
JobSendPasswordReset{} -> True
|
JobSendPasswordReset{} -> Just JobNoQueueSame
|
||||||
JobTruncateTransactionLog{} -> True
|
JobTruncateTransactionLog{} -> Just JobNoQueueSame
|
||||||
JobPruneInvitations{} -> True
|
JobPruneInvitations{} -> Just JobNoQueueSame
|
||||||
JobDeleteTransactionLogIPs{} -> True
|
JobDeleteTransactionLogIPs{} -> Just JobNoQueueSame
|
||||||
JobSynchroniseLdapUser{} -> True
|
JobSynchroniseLdapUser{} -> Just JobNoQueueSame
|
||||||
JobChangeUserDisplayEmail{} -> True
|
JobChangeUserDisplayEmail{} -> Just JobNoQueueSame
|
||||||
JobPruneSessionFiles{} -> True
|
JobPruneSessionFiles{} -> Just JobNoQueueSameTag
|
||||||
JobPruneUnreferencedFiles{} -> True
|
JobPruneUnreferencedFiles{} -> Just JobNoQueueSameTag
|
||||||
JobInjectFiles{} -> True
|
JobInjectFiles{} -> Just JobNoQueueSameTag
|
||||||
JobPruneFallbackPersonalisedSheetFilesKeys{} -> True
|
JobPruneFallbackPersonalisedSheetFilesKeys{} -> Just JobNoQueueSameTag
|
||||||
JobRechunkFiles{} -> True
|
JobRechunkFiles{} -> Just JobNoQueueSameTag
|
||||||
JobDetectMissingFiles{} -> True
|
JobDetectMissingFiles{} -> Just JobNoQueueSameTag
|
||||||
_ -> False
|
_ -> Nothing
|
||||||
|
|
||||||
jobMovable :: JobCtl -> Bool
|
jobMovable :: JobCtl -> Bool
|
||||||
jobMovable = isn't _JobCtlTest
|
jobMovable = isn't _JobCtlTest
|
||||||
|
|||||||
Reference in New Issue
Block a user