Browse Source

[fix] always use per site queue, don't add queue when in maintenance mode

version-14
Anand Doshi 9 years ago
parent
commit
04da07fe19
3 changed files with 28 additions and 12 deletions
  1. +5
    -7
      frappe/celery_app.py
  2. +18
    -0
      frappe/tasks.py
  3. +5
    -5
      frappe/utils/doctor.py

+ 5
- 7
frappe/celery_app.py View File

@@ -49,8 +49,7 @@ def get_celery_app():
app.conf.CELERY_SEND_EVENTS = True
app.conf.CELERY_SEND_TASK_SENT_EVENT = True

if conf.celery_queue_per_site:
app.conf.CELERY_ROUTES = (SiteRouter(), AsyncTaskRouter())
app.conf.CELERY_ROUTES = (SiteRouter(), AsyncTaskRouter())

app.conf.CELERYBEAT_SCHEDULE = get_beat_schedule(conf)

@@ -90,11 +89,10 @@ def get_beat_schedule(conf):
},
}

if conf.celery_queue_per_site:
schedule['sync_queues'] = {
'task': 'frappe.tasks.sync_queues',
'schedule': timedelta(seconds=conf.scheduler_interval or DEFAULT_SCHEDULER_INTERVAL)
}
schedule['sync_queues'] = {
'task': 'frappe.tasks.sync_queues',
'schedule': timedelta(seconds=conf.scheduler_interval or DEFAULT_SCHEDULER_INTERVAL)
}

return schedule



+ 18
- 0
frappe/tasks.py View File

@@ -57,10 +57,15 @@ def sync_worker(app, worker, prefix=''):
required_queues = set(get_required_queues(app, prefix=prefix))
to_add = required_queues - active_queues
to_remove = active_queues - required_queues

for queue in to_add:
if is_site_in_maintenance_mode(queue, prefix):
continue

app.control.broadcast('add_consumer', arguments={
'queue': queue
}, reply=True, destination=[worker])

for queue in to_remove:
app.control.broadcast('cancel_consumer', arguments={
'queue': queue
@@ -79,6 +84,19 @@ def get_required_queues(app, prefix=''):
ret.append(app.conf['CELERY_DEFAULT_QUEUE'])
return ret

def is_site_in_maintenance_mode(queue, prefix):
# check if site is in maintenance mode
site = queue.replace(prefix, "")
try:
frappe.init(site=site)
if not frappe.local.conf.db_name or frappe.local.conf.maintenance_mode:
# don't add site if in maintenance mode
return True
finally:
frappe.destroy()

return False

@celery_task()
def scheduler_task(site, event, handler, now=False):
traceback = ""


+ 5
- 5
frappe/utils/doctor.py View File

@@ -16,11 +16,11 @@ def get_redis_conn():
def get_queues(site=None):
"Returns the name of queues where frappe enqueues tasks as per the configuration"
queues = ["celery"]
if frappe.conf.celery_queue_per_site:
sites = [site] if site else frappe.utils.get_sites()
for site in sites:
queues.append(site)
queues.append('longjobs@' + site)
sites = [site] if site else frappe.utils.get_sites()
for site in sites:
queues.append(site)
queues.append('longjobs@' + site)
return queues

def get_task_body(taskstr):


Loading…
Cancel
Save