|
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:
|