Commit bc338e72 authored by Przemyslaw Kaminski's avatar Przemyslaw Kaminski

[nodeStory] add immediate saver

This is used to save when quitting the server. Previous, debounce
save, didn't work properly on exit.
parent a243b95f
Pipeline #3153 passed with stage
in 91 minutes and 23 seconds
...@@ -80,4 +80,3 @@ main = do ...@@ -80,4 +80,3 @@ main = do
putStrLn $ "Starting with " <> show myMode <> " mode." putStrLn $ "Starting with " <> show myMode <> " mode."
start start
...@@ -62,7 +62,7 @@ main = do ...@@ -62,7 +62,7 @@ main = do
, "" , ""
, "Press ENTER if you want to continue, CTRL+C if you want to stop." , "Press ENTER if you want to continue, CTRL+C if you want to stop."
] ]
_ok <- getLine _ok <- getLine
cfg <- readConfig iniPath cfg <- readConfig iniPath
...@@ -88,7 +88,7 @@ main = do ...@@ -88,7 +88,7 @@ main = do
_ <- runCmdDev env (initFirstTriggers secret :: Cmd GargError [Int64]) _ <- runCmdDev env (initFirstTriggers secret :: Cmd GargError [Int64])
_ <- runCmdDev env (contextsTriggers :: Cmd GargError ()) _ <- runCmdDev env (contextsTriggers :: Cmd GargError ())
-- Move nodes to contexts table -- Move nodes to contexts table
_ <- runCmdDev env sqlNodes2Contexts _ <- runCmdDev env sqlNodes2Contexts
-- Update the hashes -- Update the hashes
...@@ -283,6 +283,3 @@ sqlSchema = do ...@@ -283,6 +283,3 @@ sqlSchema = do
CREATE INDEX IF NOT EXISTS context_node_node_id_idx ON public.context_node_ngrams USING btree (node_id); CREATE INDEX IF NOT EXISTS context_node_node_id_idx ON public.context_node_ngrams USING btree (node_id);
|] |]
...@@ -47,7 +47,7 @@ import Gargantext.API.Admin.Auth.Types (AuthContext) ...@@ -47,7 +47,7 @@ import Gargantext.API.Admin.Auth.Types (AuthContext)
import Gargantext.API.Admin.Settings (newEnv) import Gargantext.API.Admin.Settings (newEnv)
import Gargantext.API.Admin.Types (FireWall(..), PortNumber, cookieSettings, jwtSettings, settings) import Gargantext.API.Admin.Types (FireWall(..), PortNumber, cookieSettings, jwtSettings, settings)
import Gargantext.API.EKG import Gargantext.API.EKG
import Gargantext.API.Ngrams (saveNodeStory) import Gargantext.API.Ngrams (saveNodeStoryImmediate)
import Gargantext.API.Prelude import Gargantext.API.Prelude
import Gargantext.API.Routes import Gargantext.API.Routes
import Gargantext.API.Server (server) import Gargantext.API.Server (server)
...@@ -92,10 +92,10 @@ portRouteInfo port = do ...@@ -92,10 +92,10 @@ portRouteInfo port = do
putStrLn $ "http://localhost:" <> toUrlPiece port <> "/swagger-ui" putStrLn $ "http://localhost:" <> toUrlPiece port <> "/swagger-ui"
-- TODO clean this Monad condition (more generic) ? -- TODO clean this Monad condition (more generic) ?
stopGargantext :: HasNodeStorySaver env => env -> IO () stopGargantext :: HasNodeStoryImmediateSaver env => env -> IO ()
stopGargantext env = do stopGargantext env = do
putStrLn "----- Stopping gargantext -----" putStrLn "----- Stopping gargantext -----"
runReaderT saveNodeStory env runReaderT saveNodeStoryImmediate env
{- {-
startGargantextMock :: PortNumber -> IO () startGargantextMock :: PortNumber -> IO ()
......
...@@ -53,6 +53,9 @@ instance HasNodeStoryVar Env where ...@@ -53,6 +53,9 @@ instance HasNodeStoryVar Env where
instance HasNodeStorySaver Env where instance HasNodeStorySaver Env where
hasNodeStorySaver = hasNodeStory . nse_saver hasNodeStorySaver = hasNodeStory . nse_saver
instance HasNodeStoryImmediateSaver Env where
hasNodeStoryImmediateSaver = hasNodeStory . nse_saver_immediate
instance HasSettings Env where instance HasSettings Env where
settings = env_settings settings = env_settings
...@@ -104,5 +107,8 @@ instance HasNodeStoryVar DevEnv where ...@@ -104,5 +107,8 @@ instance HasNodeStoryVar DevEnv where
instance HasNodeStorySaver DevEnv where instance HasNodeStorySaver DevEnv where
hasNodeStorySaver = hasNodeStory . nse_saver hasNodeStorySaver = hasNodeStory . nse_saver
instance HasNodeStoryImmediateSaver DevEnv where
hasNodeStoryImmediateSaver = hasNodeStory . nse_saver_immediate
instance HasMail DevEnv where instance HasMail DevEnv where
mailSettings = dev_env_mail mailSettings = dev_env_mail
...@@ -17,7 +17,7 @@ import Control.Monad (fail) ...@@ -17,7 +17,7 @@ import Control.Monad (fail)
import Control.Monad.Reader (runReaderT) import Control.Monad.Reader (runReaderT)
import Gargantext.API.Admin.EnvTypes import Gargantext.API.Admin.EnvTypes
import Gargantext.API.Admin.Settings import Gargantext.API.Admin.Settings
import Gargantext.API.Ngrams (saveNodeStory) import Gargantext.API.Ngrams (saveNodeStoryImmediate)
import Gargantext.API.Prelude import Gargantext.API.Prelude
import Gargantext.Core.NodeStory import Gargantext.Core.NodeStory
import Gargantext.Database.Prelude import Gargantext.Database.Prelude
...@@ -66,7 +66,7 @@ runCmdDev :: Show err => DevEnv -> Cmd'' DevEnv err a -> IO a ...@@ -66,7 +66,7 @@ runCmdDev :: Show err => DevEnv -> Cmd'' DevEnv err a -> IO a
runCmdDev env f = runCmdDev env f =
(either (fail . show) pure =<< runCmd env f) (either (fail . show) pure =<< runCmd env f)
`finally` `finally`
runReaderT saveNodeStory env runReaderT saveNodeStoryImmediate env
runCmdDevNoErr :: DevEnv -> Cmd' DevEnv () a -> IO a runCmdDevNoErr :: DevEnv -> Cmd' DevEnv () a -> IO a
runCmdDevNoErr = runCmdDev runCmdDevNoErr = runCmdDev
......
...@@ -55,6 +55,7 @@ module Gargantext.API.Ngrams ...@@ -55,6 +55,7 @@ module Gargantext.API.Ngrams
, r_history , r_history
, NgramsRepoElement(..) , NgramsRepoElement(..)
, saveNodeStory , saveNodeStory
, saveNodeStoryImmediate
, initRepo , initRepo
, TabType(..) , TabType(..)
...@@ -179,7 +180,22 @@ mkChildrenGroups addOrRem nt patches = ...@@ -179,7 +180,22 @@ mkChildrenGroups addOrRem nt patches =
saveNodeStory :: ( MonadReader env m, MonadBase IO m, HasNodeStorySaver env ) saveNodeStory :: ( MonadReader env m, MonadBase IO m, HasNodeStorySaver env )
=> m () => m ()
saveNodeStory = liftBase =<< view hasNodeStorySaver saveNodeStory = do
saver <- view hasNodeStorySaver
liftBase $ do
Gargantext.Prelude.putStrLn "---- Running node story saver ----"
saver
Gargantext.Prelude.putStrLn "---- Node story saver finished ----"
saveNodeStoryImmediate :: ( MonadReader env m, MonadBase IO m, HasNodeStoryImmediateSaver env )
=> m ()
saveNodeStoryImmediate = do
saver <- view hasNodeStoryImmediateSaver
liftBase $ do
Gargantext.Prelude.putStrLn "---- Running node story immediate saver ----"
saver
Gargantext.Prelude.putStrLn "---- Node story immediate saver finished ----"
listTypeConflictResolution :: ListType -> ListType -> ListType listTypeConflictResolution :: ListType -> ListType -> ListType
......
...@@ -54,6 +54,8 @@ module Gargantext.Core.NodeStory ...@@ -54,6 +54,8 @@ module Gargantext.Core.NodeStory
, hasNodeStoryVar , hasNodeStoryVar
, HasNodeStorySaver , HasNodeStorySaver
, hasNodeStorySaver , hasNodeStorySaver
, HasNodeStoryImmediateSaver
, hasNodeStoryImmediateSaver
, NodeStory(..) , NodeStory(..)
, NgramsStatePatch' , NgramsStatePatch'
, NodeListStory , NodeListStory
...@@ -62,6 +64,7 @@ module Gargantext.Core.NodeStory ...@@ -62,6 +64,7 @@ module Gargantext.Core.NodeStory
, initNodeStory , initNodeStory
, nse_getter , nse_getter
, nse_saver , nse_saver
, nse_saver_immediate
, nse_var , nse_var
, unNodeStory , unNodeStory
, getNodeArchiveHistory , getNodeArchiveHistory
...@@ -123,6 +126,7 @@ import qualified Gargantext.Database.Query.Table.Ngrams as TableNgrams ...@@ -123,6 +126,7 @@ import qualified Gargantext.Database.Query.Table.Ngrams as TableNgrams
data NodeStoryEnv = NodeStoryEnv data NodeStoryEnv = NodeStoryEnv
{ _nse_var :: !(MVar NodeListStory) { _nse_var :: !(MVar NodeListStory)
, _nse_saver :: !(IO ()) , _nse_saver :: !(IO ())
, _nse_saver_immediate :: !(IO ())
, _nse_getter :: [NodeId] -> IO (MVar NodeListStory) , _nse_getter :: [NodeId] -> IO (MVar NodeListStory)
--, _nse_cleaner :: !(IO ()) -- every 12 hours: cleans the repos of unused NodeStories --, _nse_cleaner :: !(IO ()) -- every 12 hours: cleans the repos of unused NodeStories
-- , _nse_lock :: !FileLock -- TODO (it depends on the option: if with database or file only) -- , _nse_lock :: !FileLock -- TODO (it depends on the option: if with database or file only)
...@@ -148,6 +152,9 @@ class HasNodeStoryVar env where ...@@ -148,6 +152,9 @@ class HasNodeStoryVar env where
class HasNodeStorySaver env where class HasNodeStorySaver env where
hasNodeStorySaver :: Getter env (IO ()) hasNodeStorySaver :: Getter env (IO ())
class HasNodeStoryImmediateSaver env where
hasNodeStoryImmediateSaver :: Getter env (IO ())
------------------------------------------------------------------------ ------------------------------------------------------------------------
{- | Node Story for each NodeType where the Key of the Map is NodeId {- | Node Story for each NodeType where the Key of the Map is NodeId
...@@ -592,6 +599,11 @@ readNodeStoryEnv :: Pool PGS.Connection -> IO NodeStoryEnv ...@@ -592,6 +599,11 @@ readNodeStoryEnv :: Pool PGS.Connection -> IO NodeStoryEnv
readNodeStoryEnv pool = do readNodeStoryEnv pool = do
mvar <- nodeStoryVar pool Nothing [] mvar <- nodeStoryVar pool Nothing []
saver <- mkNodeStorySaver pool mvar saver <- mkNodeStorySaver pool mvar
let saver_immediate = modifyMVar_ mvar $ \ns -> do
withResource pool $ \c -> do
--printDebug "[mkNodeStorySaver] will call writeNodeStories, ns" ns
writeNodeStories c ns
pure $ clearHistory ns
-- let saver = modifyMVar_ mvar $ \mv -> do -- let saver = modifyMVar_ mvar $ \mv -> do
-- writeNodeStories pool mv -- writeNodeStories pool mv
-- printDebug "[readNodeStoryEnv] saver" mv -- printDebug "[readNodeStoryEnv] saver" mv
...@@ -600,6 +612,7 @@ readNodeStoryEnv pool = do ...@@ -600,6 +612,7 @@ readNodeStoryEnv pool = do
-- return mv' -- return mv'
pure $ NodeStoryEnv { _nse_var = mvar pure $ NodeStoryEnv { _nse_var = mvar
, _nse_saver = saver , _nse_saver = saver
, _nse_saver_immediate = saver_immediate
, _nse_getter = nodeStoryVar pool (Just mvar) } , _nse_getter = nodeStoryVar pool (Just mvar) }
nodeStoryVar :: Pool PGS.Connection -> Maybe (MVar NodeListStory) -> [NodeId] -> IO (MVar NodeListStory) nodeStoryVar :: Pool PGS.Connection -> Maybe (MVar NodeListStory) -> [NodeId] -> IO (MVar NodeListStory)
......
...@@ -57,8 +57,10 @@ readNodeStoryEnv :: NodeStoryDir -> IO NodeStoryEnv ...@@ -57,8 +57,10 @@ readNodeStoryEnv :: NodeStoryDir -> IO NodeStoryEnv
readNodeStoryEnv nsd = do readNodeStoryEnv nsd = do
mvar <- nodeStoryVar nsd Nothing [] mvar <- nodeStoryVar nsd Nothing []
saver <- mkNodeStorySaver nsd mvar saver <- mkNodeStorySaver nsd mvar
let saver_immediate = withMVar mvar (writeNodeStories nsd)
pure $ NodeStoryEnv { _nse_var = mvar pure $ NodeStoryEnv { _nse_var = mvar
, _nse_saver = saver , _nse_saver = saver
, _nse_saver_immediate = saver_immediate
, _nse_getter = nodeStoryVar nsd (Just mvar) } , _nse_getter = nodeStoryVar nsd (Just mvar) }
------------------------------------------------------------------------ ------------------------------------------------------------------------
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment