55from mrq .queue import Queue
66from bson import ObjectId
77from mrq .context import connections , get_current_config , get_current_job
8+ from mrq .job import set_queues_size
89from collections import defaultdict
910from mrq .utils import group_iter
1011import datetime
@@ -59,7 +60,7 @@ def build_query(self):
5960
6061 for key in params_dict :
6162 query ["params.%s" % key ] = params_dict [key ]
62-
63+
6364 if current_job and "_id" not in query :
6465 query ["_id" ] = {"$lte" : current_job .id }
6566
@@ -91,13 +92,24 @@ def perform_action(self, action, query, destination_queue):
9192 result_ttl = max ([default_job_timeout ] + tasks_ttls )
9293
9394 now = datetime .datetime .utcnow ()
95+
96+ size_by_queues = defaultdict (int )
97+ if "queue" not in query :
98+ for job in self .collection .find (query , projection = {"queue" : 1 }):
99+ size_by_queues [job ["queue" ]] += 1
100+
94101 ret = self .collection .update (query , {"$set" : {
95102 "status" : "cancel" ,
96103 "dateexpires" : now + datetime .timedelta (seconds = result_ttl ),
97104 "dateupdated" : now
98105 }}, multi = True )
99106 stats ["cancelled" ] = ret ["n" ]
100107
108+ if "queue" in query :
109+ if isinstance (query ["queue" ], str ):
110+ size_by_queues [query ["queue" ]] = ret ["n" ]
111+ set_queues_size (size_by_queues , action = "decr" )
112+
101113 # Special case when emptying just by queue name: empty it directly!
102114 # In this case we could also loose some jobs that were queued after
103115 # the MongoDB update. They will be "lost" and requeued later like the other case
@@ -123,22 +135,23 @@ def perform_action(self, action, query, destination_queue):
123135 jobs_by_queue [job ["queue" ]].append (job ["_id" ])
124136 stats ["requeued" ] += 1
125137
126- for queue in jobs_by_queue :
138+ for queue in jobs_by_queue :
139+ updates = {
140+ "status" : "queued" ,
141+ "datequeued" : datetime .datetime .utcnow (),
142+ "dateupdated" : datetime .datetime .utcnow ()
143+ }
127144
128- updates = {
129- "status" : "queued" ,
130- "datequeued" : datetime .datetime .utcnow (),
131- "dateupdated" : datetime .datetime .utcnow ()
132- }
145+ if destination_queue is not None :
146+ updates ["queue" ] = destination_queue
133147
134- if destination_queue is not None :
135- updates ["queue " ] = destination_queue
148+ if action == "requeue" :
149+ updates ["retry_count " ] = 0
136150
137- if action == "requeue" :
138- updates ["retry_count" ] = 0
151+ self .collection .update ({
152+ "_id" : {"$in" : jobs_by_queue [queue ]}
153+ }, {"$set" : updates }, multi = True )
139154
140- self .collection .update ({
141- "_id" : {"$in" : jobs_by_queue [queue ]}
142- }, {"$set" : updates }, multi = True )
155+ set_queues_size ({queue : len (jobs ) for queue , jobs in jobs_by_queue .iteritems ()})
143156
144157 return stats
0 commit comments