@@ -49,8 +49,7 @@ def get_celery_app(): | |||||
app.conf.CELERY_SEND_EVENTS = True | app.conf.CELERY_SEND_EVENTS = True | ||||
app.conf.CELERY_SEND_TASK_SENT_EVENT = 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) | 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 | return schedule | ||||
@@ -57,10 +57,15 @@ def sync_worker(app, worker, prefix=''): | |||||
required_queues = set(get_required_queues(app, prefix=prefix)) | required_queues = set(get_required_queues(app, prefix=prefix)) | ||||
to_add = required_queues - active_queues | to_add = required_queues - active_queues | ||||
to_remove = active_queues - required_queues | to_remove = active_queues - required_queues | ||||
for queue in to_add: | for queue in to_add: | ||||
if is_site_in_maintenance_mode(queue, prefix): | |||||
continue | |||||
app.control.broadcast('add_consumer', arguments={ | app.control.broadcast('add_consumer', arguments={ | ||||
'queue': queue | 'queue': queue | ||||
}, reply=True, destination=[worker]) | }, reply=True, destination=[worker]) | ||||
for queue in to_remove: | for queue in to_remove: | ||||
app.control.broadcast('cancel_consumer', arguments={ | app.control.broadcast('cancel_consumer', arguments={ | ||||
'queue': queue | 'queue': queue | ||||
@@ -79,6 +84,19 @@ def get_required_queues(app, prefix=''): | |||||
ret.append(app.conf['CELERY_DEFAULT_QUEUE']) | ret.append(app.conf['CELERY_DEFAULT_QUEUE']) | ||||
return ret | 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() | @celery_task() | ||||
def scheduler_task(site, event, handler, now=False): | def scheduler_task(site, event, handler, now=False): | ||||
traceback = "" | traceback = "" | ||||
@@ -16,11 +16,11 @@ def get_redis_conn(): | |||||
def get_queues(site=None): | def get_queues(site=None): | ||||
"Returns the name of queues where frappe enqueues tasks as per the configuration" | "Returns the name of queues where frappe enqueues tasks as per the configuration" | ||||
queues = ["celery"] | 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 | return queues | ||||
def get_task_body(taskstr): | def get_task_body(taskstr): | ||||