module EZCouch.Sweeper where
import Prelude ()
import ClassyPrelude
import qualified Data.Time as Time
import Control.Concurrent
import Data.Aeson
import EZCouch.Time
import EZCouch.Types
import EZCouch.Action
import EZCouch.Entity
import EZCouch.ReadAction
import EZCouch.WriteAction
import EZCouch.Try
import EZCouch.View
import EZCouch.Model.EntityIsolation (EntityIsolation)
import qualified EZCouch.Model.EntityIsolation as EntityIsolation
import EZCouch.Isolation
import EZCouch.Logging
runSweeper = forever $ do
logLn 2 $ "Running sweeper cycle"
readZombieEntityIsolations >>= releaseIsolations
liftIO $ threadDelay $ 10 ^ 6 * 60 * 60 * 24 * 2
readZombieEntityIsolations :: (MonadAction m)
=> m [Persisted EntityIsolation]
readZombieEntityIsolations = do
now <- readTime
readEntities
0
Nothing
False
(KeysSelectionRangeEnd now)
(ViewByKeys1 (ViewKeyValue $ PathField "till" PathNil))
releaseIsolations isolations = do
logLn 1 $ "Sweeping " ++ show (length isolations) ++ " isolations"
createIdentifiedEntities $ map entityIdAndValue isolations
deleteEntities isolations `catch` \e -> case e of
OperationException _ -> return ()
e -> throwIO e
entityIdAndValue =
(EntityIsolation.entityId &&& EntityIsolation.entityValue) . persistedValue