Switch to unified view

a/Allura/allura/command/taskd.py b/Allura/allura/command/taskd.py
...
...
17
17
18
import logging
18
import logging
19
import os
19
import os
20
import time
20
import time
21
import Queue
21
import Queue
22
from contextlib import contextmanager
22
from datetime import datetime, timedelta
23
from datetime import datetime, timedelta
23
import signal
24
import signal
24
import sys
25
import sys
25
26
26
import faulthandler
27
import faulthandler
27
import pylons
28
import pylons
29
from setproctitle import setproctitle, getproctitle
30
28
from paste.deploy import loadapp
31
from paste.deploy import loadapp
29
from paste.deploy.converters import asint
32
from paste.deploy.converters import asint
30
from webob import Request
33
from webob import Request
31
34
32
import base
35
import base
33
36
34
faulthandler.enable()
37
faulthandler.enable()
35
38
36
status_log = logging.getLogger('taskdstatus')
39
status_log = logging.getLogger('taskdstatus')
40
41
42
@contextmanager
43
def proctitle(title):
44
    """Temporarily change the process title, then restore it."""
45
    orig_title = getproctitle()
46
    try:
47
        setproctitle(title)
48
        yield
49
        setproctitle(orig_title)
50
    except:
51
        setproctitle(orig_title)
52
        raise
37
53
38
54
39
class TaskdCommand(base.Command):
55
class TaskdCommand(base.Command):
40
    summary = 'Task server'
56
    summary = 'Task server'
41
    parser = base.Command.standard_parser(verbose=True)
57
    parser = base.Command.standard_parser(verbose=True)
42
    parser.add_option('--only', dest='only', type='string', default=None,
58
    parser.add_option('--only', dest='only', type='string', default=None,
43
                      help='only handle tasks of the given name(s) (can be comma-separated list)')
59
                      help='only handle tasks of the given name(s) (can be comma-separated list)')
44
60
45
    def command(self):
61
    def command(self):
62
        setproctitle('taskd')
46
        self.basic_setup()
63
        self.basic_setup()
47
        self.keep_running = True
64
        self.keep_running = True
48
        self.restart_when_done = False
65
        self.restart_when_done = False
49
        base.log.info('Starting taskd, pid %s' % os.getpid())
66
        base.log.info('Starting taskd, pid %s' % os.getpid())
50
        signal.signal(signal.SIGHUP, self.graceful_restart)
67
        signal.signal(signal.SIGHUP, self.graceful_restart)
...
...
119
                    self.task = M.MonQTask.get(
136
                    self.task = M.MonQTask.get(
120
                            process=name,
137
                            process=name,
121
                            waitfunc=waitfunc,
138
                            waitfunc=waitfunc,
122
                            only=only)
139
                            only=only)
123
                    if self.task:
140
                    if self.task:
141
                        with(proctitle("taskd:{0}:{1}".format(
142
                            self.task.task_name, self.task._id))):
124
                        # Build the (fake) request
143
                            # Build the (fake) request
125
                        r = Request.blank('/--%s--/%s/' % (self.task.task_name, self.task._id),
144
                            r = Request.blank('/--%s--/%s/' % (self.task.task_name, self.task._id),
126
                                          {'task': self.task,
145
                                              {'task': self.task,
127
                                           'wsgi.errors': wsgi_error_log,  # ErrorMiddleware records error details here
146
                                               'wsgi.errors': wsgi_error_log,  # ErrorMiddleware records error details here
128
                                           })
147
                                               })
129
                        list(wsgi_app(r.environ, start_response))
148
                            list(wsgi_app(r.environ, start_response))
130
                        self.task = None
149
                            self.task = None
131
            except Exception as e:
150
            except Exception as e:
132
                if self.keep_running:
151
                if self.keep_running:
133
                    base.log.exception('taskd error %s; pausing for 10s before taking more tasks' % e)
152
                    base.log.exception('taskd error %s; pausing for 10s before taking more tasks' % e)
134
                    time.sleep(10)
153
                    time.sleep(10)
135
                else:
154
                else: