Commit 8a883b80770cb39d541e30e6436da3d6f8314126

Authored by Sergio Oliveira
1 parent 34773388

Implemented locking to allow only one importing task at time

Signed-off-by: Sergio Oliveira <sergio@tracy.com.br>
Showing 1 changed file with 18 additions and 1 deletions   Show diff stats
colab/plugins/data/tasks.py
... ... @@ -3,6 +3,8 @@
3 3 import importlib
4 4 import logging
5 5  
  6 +import redis
  7 +
6 8 from django.conf import settings
7 9  
8 10 from colab.celery import app
... ... @@ -11,6 +13,20 @@ LOGGER = logging.getLogger(&#39;colab.plugins.data&#39;)
11 13 TASKS = set()
12 14  
13 15  
  16 +def lock(method, name):
  17 + def wrapped_method(self, *args, **kwargs):
  18 + lock_id = 'colab-data-importer-{}'.format(name)
  19 + lock = redis.Redis().lock(lock_id)
  20 +
  21 + if lock.acquire(blocking=False):
  22 + try:
  23 + return method(*args, **kwargs)
  24 + finally:
  25 + lock.release()
  26 +
  27 + return wrapped_method
  28 +
  29 +
14 30 def register_tasks():
15 31  
16 32 global TASKS
... ... @@ -31,7 +47,8 @@ def register_tasks():
31 47 continue
32 48 instance = item()
33 49 task_name = '{}.{}'.format(module.__name__, item_name)
34   - task = app.task(name=task_name, bind=True)(instance.fetch_data)
  50 + thread_safe_method = lock(instance.fetch_data, task_name)
  51 + task = app.task(name=task_name, bind=True)(thread_safe_method)
35 52 TASKS.add(task)
36 53 LOGGER.debug('Registered task: %s', task_name)
37 54  
... ...