Jakub Filak c83982
From 883d35109b55928d4c36d3cd6ee262d7cdc5bd4d Mon Sep 17 00:00:00 2001
Jakub Filak c83982
From: Jakub Filak <jfilak@redhat.com>
Jakub Filak c83982
Date: Wed, 15 Jul 2015 10:20:59 +0200
Jakub Filak c83982
Subject: [PATCH] abrtd: de-prioritize post-create event scripts
Jakub Filak c83982
Jakub Filak c83982
The crash processing should not make the computer unusable. It sometimes
Jakub Filak c83982
happens that the captured data causes abrt scripts to take an inadequate
Jakub Filak c83982
amount of resources and the computer becomes less responsive.
Jakub Filak c83982
Jakub Filak c83982
This patch increases the nice value of post-create processes by 10 (I took
Jakub Filak c83982
10 because it is the default value of command 'nice'), so those
Jakub Filak c83982
processes will be scheduled after the more valuable processes.
Jakub Filak c83982
Jakub Filak c83982
Related: rhbz#1236422
Jakub Filak c83982
Jakub Filak c83982
Signed-off-by: Jakub Filak <jfilak@redhat.com>
Jakub Filak c83982
---
Jakub Filak c83982
 doc/abrtd.txt                  |  7 +++++++
Jakub Filak c83982
 src/daemon/abrt-handle-event.c | 19 ++++++++++++++++++-
Jakub Filak c83982
 src/daemon/abrt-server.c       | 14 ++++++++------
Jakub Filak c83982
 3 files changed, 33 insertions(+), 7 deletions(-)
Jakub Filak c83982
Jakub Filak c83982
diff --git a/doc/abrtd.txt b/doc/abrtd.txt
Jakub Filak c83982
index b129d3e..32d044b 100644
Jakub Filak c83982
--- a/doc/abrtd.txt
Jakub Filak c83982
+++ b/doc/abrtd.txt
Jakub Filak c83982
@@ -36,6 +36,13 @@ OPTIONS
Jakub Filak c83982
 -p::
Jakub Filak c83982
    Add program names to log.
Jakub Filak c83982
 
Jakub Filak c83982
+ENVIRONMENT
Jakub Filak c83982
+-----------
Jakub Filak c83982
+ABRT_EVENT_NICE::
Jakub Filak c83982
+  'abrtd' runs its post-mortem processing with the nice value incremented by 10
Jakub Filak c83982
+  in order to not take too much resources and keep the computer responsive.  If
Jakub Filak c83982
+  you want to adjust the increment value, use the ABRT_EVENT_NICE environment
Jakub Filak c83982
+  variable.
Jakub Filak c83982
 
Jakub Filak c83982
 CAVEATS
Jakub Filak c83982
 -------
Jakub Filak c83982
diff --git a/src/daemon/abrt-handle-event.c b/src/daemon/abrt-handle-event.c
Jakub Filak c83982
index 4a21aa4..fda21bd 100644
Jakub Filak c83982
--- a/src/daemon/abrt-handle-event.c
Jakub Filak c83982
+++ b/src/daemon/abrt-handle-event.c
Jakub Filak c83982
@@ -403,16 +403,18 @@ int main(int argc, char **argv)
Jakub Filak c83982
     abrt_init(argv);
Jakub Filak c83982
 
Jakub Filak c83982
     const char *program_usage_string = _(
Jakub Filak c83982
-        "& [-v -i] -e|--event EVENT DIR..."
Jakub Filak c83982
+        "& [-v -i -n INCREMENT] -e|--event EVENT DIR..."
Jakub Filak c83982
         );
Jakub Filak c83982
 
Jakub Filak c83982
     char *event_name = NULL;
Jakub Filak c83982
     int interactive = 0; /* must be _int_, OPT_BOOL expects that! */
Jakub Filak c83982
+    int nice_incr = 0;
Jakub Filak c83982
 
Jakub Filak c83982
     struct options program_options[] = {
Jakub Filak c83982
         OPT__VERBOSE(&g_verbose),
Jakub Filak c83982
         OPT_STRING('e', "event" , &event_name, "EVENT",  _("Run EVENT on DIR")),
Jakub Filak c83982
         OPT_BOOL('i', "interactive" , &interactive, _("Communicate directly to the user")),
Jakub Filak c83982
+        OPT_INTEGER('n',     "nice" , &nice_incr,   _("Increment the nice value by INCREMENT")),
Jakub Filak c83982
         OPT_END()
Jakub Filak c83982
     };
Jakub Filak c83982
 
Jakub Filak c83982
@@ -423,6 +425,21 @@ int main(int argc, char **argv)
Jakub Filak c83982
 
Jakub Filak c83982
     load_abrt_conf();
Jakub Filak c83982
 
Jakub Filak c83982
+    const char *const opt_env_nice = getenv("ABRT_EVENT_NICE");
Jakub Filak c83982
+    if (opt_env_nice != NULL && opt_env_nice[0] != '\0')
Jakub Filak c83982
+    {
Jakub Filak c83982
+        log_debug("Using ABRT_EVENT_NICE=%s to increment the nice value", opt_env_nice);
Jakub Filak c83982
+        nice_incr = xatoi(opt_env_nice);
Jakub Filak c83982
+    }
Jakub Filak c83982
+
Jakub Filak c83982
+    if (nice_incr != 0)
Jakub Filak c83982
+    {
Jakub Filak c83982
+        log_debug("Incrementing the nice value by %d", nice_incr);
Jakub Filak c83982
+        const int ret = nice(nice_incr);
Jakub Filak c83982
+        if (ret == -1)
Jakub Filak c83982
+            perror_msg_and_die("Failed to increment the nice value");
Jakub Filak c83982
+    }
Jakub Filak c83982
+
Jakub Filak c83982
     bool post_create = (strcmp(event_name, "post-create") == 0);
Jakub Filak c83982
     char *dump_dir_name = NULL;
Jakub Filak c83982
     while (*argv)
Jakub Filak c83982
diff --git a/src/daemon/abrt-server.c b/src/daemon/abrt-server.c
Jakub Filak c83982
index d7556e2..9f177e9 100644
Jakub Filak c83982
--- a/src/daemon/abrt-server.c
Jakub Filak c83982
+++ b/src/daemon/abrt-server.c
Jakub Filak c83982
@@ -126,15 +126,17 @@ static int delete_path(const char *dump_dir_name)
Jakub Filak c83982
 
Jakub Filak c83982
 static pid_t spawn_event_handler_child(const char *dump_dir_name, const char *event_name, int *fdp)
Jakub Filak c83982
 {
Jakub Filak c83982
-    char *args[7];
Jakub Filak c83982
+    char *args[9];
Jakub Filak c83982
     args[0] = (char *) LIBEXEC_DIR"/abrt-handle-event";
Jakub Filak c83982
     /* Do not forward ASK_* messages to parent*/
Jakub Filak c83982
     args[1] = (char *) "-i";
Jakub Filak c83982
-    args[2] = (char *) "-e";
Jakub Filak c83982
-    args[3] = (char *) event_name;
Jakub Filak c83982
-    args[4] = (char *) "--";
Jakub Filak c83982
-    args[5] = (char *) dump_dir_name;
Jakub Filak c83982
-    args[6] = NULL;
Jakub Filak c83982
+    args[2] = (char *) "--nice";
Jakub Filak c83982
+    args[3] = (char *) "10";
Jakub Filak c83982
+    args[4] = (char *) "-e";
Jakub Filak c83982
+    args[5] = (char *) event_name;
Jakub Filak c83982
+    args[6] = (char *) "--";
Jakub Filak c83982
+    args[7] = (char *) dump_dir_name;
Jakub Filak c83982
+    args[8] = NULL;
Jakub Filak c83982
 
Jakub Filak c83982
     int pipeout[2];
Jakub Filak c83982
     int flags = EXECFLG_INPUT_NUL | EXECFLG_OUTPUT | EXECFLG_QUIET | EXECFLG_ERR2OUT;
Jakub Filak c83982
-- 
Jakub Filak c83982
2.4.3
Jakub Filak c83982