fix(jobs): more general no queue same

This commit is contained in:
Gregor Kleen 2021-08-13 13:53:13 +02:00
parent 24491b446b
commit b1143cb12b
2 changed files with 34 additions and 16 deletions

View File

@ -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

View File

@ -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