aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2024-10-02 14:56:59 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2024-10-02 14:56:59 -0400
commitf6c504630ecfa38c1516123019bdf67b921f1107 (patch)
tree597b69dcf3f2f3ac94bc5fd164a81a44dfb51336
parent4b948ef52add8c3a93aef6fd38a3928ccf4e36d7 (diff)
downloadstasis-f6c504630ecfa38c1516123019bdf67b921f1107.tar.gz
Allow user to define the time interval for "task is running" message
-rw-r--r--include/core.h1
-rw-r--r--src/delivery_test.c3
-rw-r--r--src/globals.c1
-rw-r--r--src/stasis_main.c13
4 files changed, 18 insertions, 0 deletions
diff --git a/include/core.h b/include/core.h
index 5011dea..ae0e8fe 100644
--- a/include/core.h
+++ b/include/core.h
@@ -65,6 +65,7 @@ struct STASIS_GLOBAL {
bool enable_rewrite_spec_stage_2; //!< Enable automatic @STR@ replacement in output files
long cpu_limit;
long parallel_fail_fast;
+ int pool_status_interval; //!< Report "Task is running" every n seconds
struct StrList *conda_packages; //!< Conda packages to install after initial activation
struct StrList *pip_packages; //!< Pip packages to install after initial activation
char *tmpdir; //!< Path to temporary storage directory
diff --git a/src/delivery_test.c b/src/delivery_test.c
index 3809768..d79e088 100644
--- a/src/delivery_test.c
+++ b/src/delivery_test.c
@@ -25,18 +25,21 @@ void delivery_tests_run(struct Delivery *ctx) {
perror("mp_pool_init/parallel");
exit(1);
}
+ pool[PARALLEL]->status_interval = globals.pool_status_interval;
pool[SERIAL] = mp_pool_init("serial", ctx->storage.tmpdir);
if (!pool[SERIAL]) {
perror("mp_pool_init/serial");
exit(1);
}
+ pool[SERIAL]->status_interval = globals.pool_status_interval;
pool[SETUP] = mp_pool_init("setup", ctx->storage.tmpdir);
if (!pool[SETUP]) {
perror("mp_pool_init/setup");
exit(1);
}
+ pool[SETUP]->status_interval = globals.pool_status_interval;
// Test block scripts shall exit non-zero on error.
// This will fail a test block immediately if "string" is not found in file.txt:
diff --git a/src/globals.c b/src/globals.c
index 667809b..b93566a 100644
--- a/src/globals.c
+++ b/src/globals.c
@@ -39,6 +39,7 @@ struct STASIS_GLOBAL globals = {
.enable_testing = true, ///< Toggle [test] block "script" execution. "script_setup" always executes.
.enable_rewrite_spec_stage_2 = true, ///< Leave template stings in output files
.parallel_fail_fast = false, ///< Kill ALL multiprocessing tasks immediately on error
+ .pool_status_interval = 30, ///< Report "Task is running"
};
void globals_free() {
diff --git a/src/stasis_main.c b/src/stasis_main.c
index da050f2..8f14e5f 100644
--- a/src/stasis_main.c
+++ b/src/stasis_main.c
@@ -13,12 +13,14 @@
#define OPT_OVERWRITE 1005
#define OPT_NO_REWRITE_SPEC_STAGE_2 1006
#define OPT_PARALLEL_FAIL_FAST 1007
+#define OPT_POOL_STATUS_INTERVAL 1009
static struct option long_options[] = {
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'V'},
{"continue-on-error", no_argument, 0, 'C'},
{"config", required_argument, 0, 'c'},
{"cpu-limit", required_argument, 0, 'l'},
+ {"pool-status-interval", required_argument, 0, OPT_POOL_STATUS_INTERVAL},
{"python", required_argument, 0, 'p'},
{"verbose", no_argument, 0, 'v'},
{"unbuffered", no_argument, 0, 'U'},
@@ -39,6 +41,7 @@ const char *long_options_help[] = {
"Allow tests to fail",
"Read configuration file",
"Number of processes to spawn concurrently (default: cpus - 1)",
+ "Report task status every n seconds (default: 30)",
"Override version of Python in configuration",
"Increase output verbosity",
"Disable line buffering",
@@ -262,6 +265,16 @@ int main(int argc, char *argv[]) {
case OPT_PARALLEL_FAIL_FAST:
globals.parallel_fail_fast = true;
break;
+ case OPT_POOL_STATUS_INTERVAL:
+ globals.pool_status_interval = (int) strtol(optarg, NULL, 10);
+ if (globals.pool_status_interval < 1) {
+ globals.pool_status_interval = 1;
+ } else if (globals.pool_status_interval > 60 * 10) {
+ // Possible poor choice alert
+ fprintf(stderr, "Caution: Excessive pausing between status updates may cause third-party CI/CD"
+ " jobs to fail if the stdout/stderr streams are idle for too long!\n");
+ }
+ break;
case 'U':
setenv("PYTHONUNBUFFERED", "1", 1);
fflush(stdout);