[cli] add support to spawn multiple workers of the same type

Also, added `worker run-single-job` because the `run-single` option
was a bit confusing.
parent 616f2982
Pipeline #7853 passed with stages
in 49 minutes and 16 seconds
...@@ -105,6 +105,7 @@ data ServerArgs = ServerArgs ...@@ -105,6 +105,7 @@ data ServerArgs = ServerArgs
data CLIWorker data CLIWorker
= CLIW_run WorkerArgs = CLIW_run WorkerArgs
| CLIW_runSingleJob WorkerSingleArgs
| CLIW_runAll WorkerAllArgs | CLIW_runAll WorkerAllArgs
| CLIW_stats WorkerStatsArgs | CLIW_stats WorkerStatsArgs
deriving (Show, Eq) deriving (Show, Eq)
...@@ -112,7 +113,12 @@ data CLIWorker ...@@ -112,7 +113,12 @@ data CLIWorker
data WorkerArgs = WorkerArgs data WorkerArgs = WorkerArgs
{ worker_toml :: !SettingsFile { worker_toml :: !SettingsFile
, worker_name :: !Text , worker_name :: !Text
, worker_run_single :: !Bool , worker_count :: !Int
} deriving (Show, Eq)
data WorkerSingleArgs = WorkerSingleArgs
{ worker_toml :: !SettingsFile
, worker_name :: !Text
} deriving (Show, Eq) } deriving (Show, Eq)
data WorkerAllArgs = WorkerAllArgs data WorkerAllArgs = WorkerAllArgs
......
...@@ -42,11 +42,40 @@ workerCLI (CLIW_run (WorkerArgs { .. })) = do ...@@ -42,11 +42,40 @@ workerCLI (CLIW_run (WorkerArgs { .. })) = do
$ List.take 72 $ List.take 72
$ List.cycle ["_"]) :: Prelude.String) $ List.cycle ["_"]) :: Prelude.String)
forConcurrently_ [1..worker_count] $ \idx -> do
withWorkerEnv worker_toml $ \env -> do
let log_cfg = env ^. hasConfig . gc_logging
withLogger log_cfg $ \ioLogger -> do
___
logMsg ioLogger INFO $ "GarganText worker #" <> show idx
logMsg ioLogger INFO $ "worker_name: " <> T.unpack worker_name
logMsg ioLogger INFO $ "worker toml: " <> _SettingsFile worker_toml
___
let ws = env ^. hasConfig . gc_worker
case findDefinitionByName ws worker_name of
Nothing -> do
let workerNames = _wdName <$> (_wsDefinitions ws)
let availableWorkers = T.intercalate ", " workerNames
putText $ "Worker definition not found! Available workers: " <> availableWorkers
Just wd -> do
logMsg ioLogger INFO $ "Starting worker '" <> T.unpack worker_name <> "' #" <> show idx
logMsg ioLogger DEBUG $ "gc config: " <> show (env ^. hasConfig)
logMsg ioLogger DEBUG $ "Worker settings: " <> show ws
___
withPGMQWorkerCtrlC env wd $ \a _state -> do
-- _ <- runReaderT (sendJob Ping) env
wait a
workerCLI (CLIW_runSingleJob (WorkerSingleArgs { .. })) = do
let ___ = putStrLn ((List.concat
$ List.take 72
$ List.cycle ["_"]) :: Prelude.String)
withWorkerEnv worker_toml $ \env -> do withWorkerEnv worker_toml $ \env -> do
let log_cfg = env ^. hasConfig . gc_logging let log_cfg = env ^. hasConfig . gc_logging
withLogger log_cfg $ \ioLogger -> do withLogger log_cfg $ \ioLogger -> do
___ ___
logMsg ioLogger INFO "GarganText worker" logMsg ioLogger INFO "Running single GarganText job"
logMsg ioLogger INFO $ "worker_name: " <> T.unpack worker_name logMsg ioLogger INFO $ "worker_name: " <> T.unpack worker_name
logMsg ioLogger INFO $ "worker toml: " <> _SettingsFile worker_toml logMsg ioLogger INFO $ "worker toml: " <> _SettingsFile worker_toml
___ ___
...@@ -62,13 +91,8 @@ workerCLI (CLIW_run (WorkerArgs { .. })) = do ...@@ -62,13 +91,8 @@ workerCLI (CLIW_run (WorkerArgs { .. })) = do
logMsg ioLogger DEBUG $ "gc config: " <> show (env ^. hasConfig) logMsg ioLogger DEBUG $ "gc config: " <> show (env ^. hasConfig)
logMsg ioLogger DEBUG $ "Worker settings: " <> show ws logMsg ioLogger DEBUG $ "Worker settings: " <> show ws
___ ___
if worker_run_single then withPGMQWorkerSingleCtrlC env wd $ \a _state -> do
withPGMQWorkerSingleCtrlC env wd $ \a _state -> do wait a
wait a
else
withPGMQWorkerCtrlC env wd $ \a _state -> do
-- _ <- runReaderT (sendJob Ping) env
wait a
workerCLI (CLIW_runAll (WorkerAllArgs { .. })) = withWorkerEnv worker_toml $ \env -> do workerCLI (CLIW_runAll (WorkerAllArgs { .. })) = withWorkerEnv worker_toml $ \env -> do
let log_cfg = env ^. hasConfig . gc_logging let log_cfg = env ^. hasConfig . gc_logging
withLogger log_cfg $ \ioLogger -> runAllWorkers ioLogger worker_toml withLogger log_cfg $ \ioLogger -> runAllWorkers ioLogger worker_toml
...@@ -101,7 +125,9 @@ workerCmd = command "worker" (info (helper <*> (fmap CLISub $ fmap CCMD_worker w ...@@ -101,7 +125,9 @@ workerCmd = command "worker" (info (helper <*> (fmap CLISub $ fmap CCMD_worker w
workerParser :: Parser CLIWorker workerParser :: Parser CLIWorker
workerParser = hsubparser ( workerParser = hsubparser (
command "run" (info (helper <*> worker_p) command "run" (info (helper <*> worker_p)
(progDesc "Run a single worker")) <> (progDesc "Run a worker")) <>
command "run-single-job" (info (helper <*> worker_single_p)
(progDesc "Run a single job, then quit")) <>
command "run-all" (info (helper <*> worker_all_p) command "run-all" (info (helper <*> worker_all_p)
(progDesc "Run all worker definitions")) <> (progDesc "Run all worker definitions")) <>
command "stats" (info (helper <*> stats_p) command "stats" (info (helper <*> stats_p)
...@@ -114,8 +140,17 @@ worker_p = fmap CLIW_run $ WorkerArgs ...@@ -114,8 +140,17 @@ worker_p = fmap CLIW_run $ WorkerArgs
<*> strOption ( long "name" <*> strOption ( long "name"
<> metavar "STRING" <> metavar "STRING"
<> help "Worker name, as defined in the .toml file" ) <> help "Worker name, as defined in the .toml file" )
<*> flag False True ( long "run-single" <*> option auto ( long "count"
<> help "Whether to loop or run a single job from queue" ) <> metavar "INT"
<> help "How many concurrent workers to start"
<> value 1 )
worker_single_p :: Parser CLIWorker
worker_single_p = fmap CLIW_runSingleJob $ WorkerSingleArgs
<$> settings_p
<*> strOption ( long "name"
<> metavar "STRING"
<> help "Worker name, as defined in the .toml file" )
worker_all_p :: Parser CLIWorker worker_all_p :: Parser CLIWorker
worker_all_p = fmap CLIW_runAll $ WorkerAllArgs worker_all_p = fmap CLIW_runAll $ WorkerAllArgs
......
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