Skip to content

Commit 3c26e65

Browse files
author
Matt George
committed
Merge remote branch 'aezell/requeue_jobs'
2 parents 50c495a + f72ada0 commit 3c26e65

File tree

5 files changed

+67
-6
lines changed

5 files changed

+67
-6
lines changed

pyres/failure/__init__.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,13 @@ def clear(resq):
2020
def requeue(resq, failure_object):
2121
queue = failure_object._queue
2222
payload = failure_object._payload
23-
return resq.push(queue,payload)
23+
return resq.push(queue, payload)
24+
25+
def retry(resq, queue, payload):
26+
job = resq.decode(payload)
27+
resq.push(queue, job['payload'])
28+
return delete(resq, payload)
29+
30+
def delete(resq, payload):
31+
return resq.redis.lrem(name = 'resque:failed', num = 1, value = payload)
2432

pyres/failure/redis.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,18 @@ def save(self, resq=None):
2424
@classmethod
2525
def count(cls, resq):
2626
return int(resq.redis.llen('resque:failed'))
27-
27+
2828
@classmethod
2929
def all(cls, resq, start=0, count=1):
30-
return resq.list_range('resque:failed', start, count)
31-
30+
from base64 import b64encode
31+
items = resq.redis.lrange('resque:failed', start, count) or []
32+
ret_list = []
33+
for i in items:
34+
failure = ResQ.decode(i)
35+
failure['redis_value'] = b64encode(i)
36+
ret_list.append(failure)
37+
return ret_list
38+
3239
@classmethod
3340
def clear(cls, resq):
3441
return resq.redis.delete('resque:failed')

resweb/server.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,33 @@ def failed(request):
4242
start = request.GET.get('start',0)
4343
start = int(start)
4444
return str(Failed(HOST, start).render())
45+
46+
@post('/failed/retry/')
47+
def failed_retry(request):
48+
from base64 import b64decode
49+
from pyres import failure
50+
try:
51+
import json
52+
except ImportError:
53+
import simplejson as json
54+
failed_job = request.POST['failed_job']
55+
job = b64decode(failed_job)
56+
decoded = ResQ.decode(job)
57+
failure.retry(HOST, decoded['queue'], job)
58+
raise Redirect('/failed/')
59+
60+
@post('/failed/delete/')
61+
def failed_delete(request):
62+
from base64 import b64decode
63+
from pyres import failure
64+
try:
65+
import json
66+
except ImportError:
67+
import simplejson as json
68+
failed_job = request.POST['failed_job']
69+
job = b64decode(failed_job)
70+
failure.delete(HOST, job)
71+
raise Redirect('/failed/')
4572

4673
@get('/workers/(?P<worker_id>\w.+)/')
4774
def worker(request, worker_id):
@@ -77,7 +104,6 @@ def delayed_timestamp(request, timestamp):
77104

78105
@get('/media/(?P<filename>.+)')
79106
def my_media(request, filename):
80-
print filename
81107
#return serve_static_file(request, filename)
82108
#my_media.content_type = content_type(filename)
83109

resweb/templates/failed.mustache

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,19 @@ $(document).ready(function(){
3434
<a href="#" class="backtrace">{{error}}</a>
3535
<pre style='display:none'>{{traceback}}</pre>
3636
</dd>
37+
<dt>
38+
Payload Actions
39+
</dt>
40+
<dd>
41+
<form action="/failed/retry/" method="post" accept-charset="utf-8">
42+
<p><input type="hidden" name="failed_job" value="{{redis_value}}" id="failed_job" />
43+
<p><input type="submit" value="Requeue" /></p>
44+
</form>
45+
<form action="/failed/delete/" method="post" accept-charset="utf-8">
46+
<p><input type="hidden" name="failed_job" value="{{redis_value}}" id="failed_job" />
47+
<p><input type="submit" value="Delete" /></p>
48+
</form>
49+
</dd>
3750
</dl>
3851
<div class='r'>
3952
</div>

resweb/views.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ def link_func(self, start):
202202
class Failed(ResWeb):
203203
def __init__(self, host, start=0):
204204
self._start = start
205+
self.host = host
205206
super(Failed, self).__init__(host)
206207

207208
def start(self):
@@ -214,10 +215,15 @@ def size(self):
214215
return str(failure.count(self.resq) or 0)
215216

216217
def failed_jobs(self):
218+
from base64 import b64encode
219+
try:
220+
import json
221+
except ImportError:
222+
import simplejson as json
217223
jobs = []
218224
for job in failure.all(self.resq, self._start, self._start + 20):
219225
item = job
220-
item['failed_at'] = str(datetime.datetime.fromtimestamp(float(item['failed_at'])))
226+
item['failed_at'] = str(datetime.datetime.fromtimestamp(float(job['failed_at'])))
221227
item['worker_url'] = '/workers/%s/' % job['worker']
222228
item['payload_args'] = str(job['payload']['args'])
223229
item['payload_class'] = job['payload']['class']
@@ -230,6 +236,7 @@ def pagination(self):
230236

231237
def link_func(self, start):
232238
return '/failed/?start=%s' % start
239+
233240
class Stats(ResWeb):
234241
def __init__(self, host, key_id):
235242
self.key_id = key_id

0 commit comments

Comments
 (0)