summaryrefslogtreecommitdiffstats
path: root/src/retrace
diff options
context:
space:
mode:
Diffstat (limited to 'src/retrace')
-rw-r--r--src/retrace/create.wsgi2
-rw-r--r--src/retrace/retrace.py17
-rw-r--r--src/retrace/worker.c16
-rwxr-xr-xsrc/retrace/worker.py5
4 files changed, 28 insertions, 12 deletions
diff --git a/src/retrace/create.wsgi b/src/retrace/create.wsgi
index e26ae0cc..7c5f81b4 100644
--- a/src/retrace/create.wsgi
+++ b/src/retrace/create.wsgi
@@ -104,7 +104,7 @@ def application(environ, start_response):
return response(start_response, "403 Forbidden",
"Required file \"%s\" is missing" % required_file)
- Popen(["/usr/bin/abrt-retrace-worker", "%d" % taskid])
+ call(["/usr/bin/abrt-retrace-worker", "%d" % taskid])
return response(start_response, "201 Created", "",
[("X-Task-Id", "%d" % taskid),
diff --git a/src/retrace/retrace.py b/src/retrace/retrace.py
index 39588d90..56bfd46e 100644
--- a/src/retrace/retrace.py
+++ b/src/retrace/retrace.py
@@ -21,7 +21,7 @@ PACKAGE_PARSER = re.compile("^(.+)-([0-9]+(\.[0-9]+)*-[0-9]+)\.([^-]+)$")
DF_OUTPUT_PARSER = re.compile("^([^ ^\t]*)[ \t]+([0-9]+)[ \t]+([0-9]+)[ \t]+([0-9]+)[ \t]+([0-9]+%)[ \t]+(.*)$")
DU_OUTPUT_PARSER = re.compile("^([0-9]+)")
URL_PARSER = re.compile("^/([0-9]+)/?")
-WORKER_RUNNING_PARSER = re.compile("^([0-9]+)[ \t]+[0-9]+[ \t]+([^ ^\t]+)[ \t]+.*abrt-retrace-worker ([0-9]+)$")
+WORKER_RUNNING_PARSER = re.compile("^[ \t]*([0-9]+)[ \t]+[0-9]+[ \t]+([^ ^\t]+)[ \t]+.*abrt-retrace-worker ([0-9]+)$")
HANDLE_ARCHIVE = {
"application/x-xz-compressed-tar": {
@@ -315,7 +315,7 @@ def kill_process_and_childs(process_id, ps_output=None):
return result
-def cleanup_task(taskid):
+def cleanup_task(taskid, gc=True):
null = open("/dev/null", "w")
savedir = "%s/%d" % (CONFIG["SaveDir"], taskid)
@@ -334,12 +334,13 @@ def cleanup_task(taskid):
except:
pass
- try:
- log = open(newlog, "a")
- log.write("Killed by garbage collector\n")
- log.close()
- except:
- pass
+ if gc:
+ try:
+ log = open(newlog, "a")
+ log.write("Killed by garbage collector\n")
+ log.close()
+ except:
+ pass
null.close()
diff --git a/src/retrace/worker.c b/src/retrace/worker.c
index 83773e61..a49f74c3 100644
--- a/src/retrace/worker.c
+++ b/src/retrace/worker.c
@@ -16,6 +16,7 @@ int main(int argc, char **argv)
int i;
struct passwd *apache_user;
const char *apache_username = "apache";
+ pid_t pid;
if (argc != 2)
{
@@ -50,7 +51,20 @@ int main(int argc, char **argv)
/* required by mock to be able to write into result directory */
setenv("SUDO_GID", "0", 1);
- /* launch worker.py */
+ /* fork and launch worker.py */
+ pid = fork();
+
+ if (pid < 0)
+ {
+ fputs("Unable to fork.", stderr);
+ return 6;
+ }
+
+ /* parent - exit */
+ if (pid > 0)
+ return 0;
+
+ /* child */
sprintf(command, "/usr/bin/python /usr/share/abrt-retrace/worker.py \"%s\"", argv[1]);
pipe = popen(command, "r");
if (pipe == NULL)
diff --git a/src/retrace/worker.py b/src/retrace/worker.py
index ad2badf1..24defa66 100755
--- a/src/retrace/worker.py
+++ b/src/retrace/worker.py
@@ -27,8 +27,9 @@ def set_status(statusid):
def fail(exitcode):
"Kills script with given exitcode"
- LOG.close()
set_status(STATUS_FAIL)
+ LOG.close()
+ cleanup_task(int(taskid), False)
sys.exit(exitcode)
def retrace_run(errorcode, cmd):
@@ -287,7 +288,7 @@ if __name__ == "__main__":
else:
LOG.write("OK\n")
- # publish bactkrace and log
+ # publish backtrace and log
set_status(STATUS_FINISHING)
try: