diff options
author | Suchita Lad | 2025-03-05 16:49:27 +0530 |
---|---|---|
committer | Suchita Lad | 2025-03-05 16:49:27 +0530 |
commit | 15f96a1ca90e0febfdb852ce42c27c214cc61d30 (patch) | |
tree | 90f074c4aef34f4e564a5361a94535865a90cc60 | |
parent | cd79a435e83a5d079dadf92d952691ac57b6d28e (diff) | |
download | Common-Interface-Project-15f96a1ca90e0febfdb852ce42c27c214cc61d30.tar.gz Common-Interface-Project-15f96a1ca90e0febfdb852ce42c27c214cc61d30.tar.bz2 Common-Interface-Project-15f96a1ca90e0febfdb852ce42c27c214cc61d30.zip |
Updated code for one simulation at a time
-rw-r--r-- | blocks/simulationAPI/serializers.py | 13 | ||||
-rw-r--r-- | blocks/simulationAPI/tasks.py | 29 |
2 files changed, 33 insertions, 9 deletions
diff --git a/blocks/simulationAPI/serializers.py b/blocks/simulationAPI/serializers.py index a857c5d7..2ff20309 100644 --- a/blocks/simulationAPI/serializers.py +++ b/blocks/simulationAPI/serializers.py @@ -26,13 +26,16 @@ class TaskSerializer(serializers.HyperlinkedModelSerializer): request = self.context.get('request') file = request.FILES.get('file') logger.info('File Upload: %s', file) + + session_id = request.headers.get("Session-ID") + post = request.POST postdata = post.dict() app_name = postdata.pop('app_name') - session_id = postdata.pop('session_id') parameters = json.dumps(postdata, separators=(',', ':')) - session = Session.objects.create(session_id, app_name) - task = Task.objects.create( - session=session, file=file, parameters=parameters) - logger.info('session: %s, task: %s', session, task) + session, created = Session.objects.get_or_create(session_id=session_id, defaults={"app_name": app_name}) + task = Task.objects.create(session=session, + file=file, parameters=parameters) + # logger.info('session: %s, task: %s', session, task) + logger.info("Session: %s (created: %s), Task: %s", session, created, task) return task diff --git a/blocks/simulationAPI/tasks.py b/blocks/simulationAPI/tasks.py index c2766947..3c9aa4e6 100644 --- a/blocks/simulationAPI/tasks.py +++ b/blocks/simulationAPI/tasks.py @@ -5,18 +5,35 @@ from celery.utils.log import get_task_logger from simulationAPI.helpers import ngspice_helper from simulationAPI.models import Task - +import gevent +from gevent.local import local +from redis import Redis +from redis.exceptions import LockError +from blocks.celery_tasks import app logger = get_task_logger(__name__) +greenlet_local = local() + +def acquire_lock(session_id, timeout=1800): # Set lock timeout (10 minutes) + redis_client = Redis.from_url(app.conf.broker_url) + greenlet_local.lock = redis_client.lock(f"simulation_lock:{session_id}", timeout=timeout) + greenlet_local.lock.acquire(blocking=True) + +def release_lock(): + greenlet_local.lock.release() + @shared_task def process_task(task_id): - try: - file_obj = Task.objects.get(task_id=task_id) + file_obj = Task.objects.get(task_id=task_id) + session_id = file_obj.session.session_id + acquire_lock(session_id) # Prevent multiple runs per session + try: + logger.info("Processing %s %s %s", - task_id, file_obj.file.path, file_obj.app_name) + session_id, file_obj.file.path, file_obj.session.app_name) current_task.update_state( state='PROGRESS', @@ -29,6 +46,7 @@ def process_task(task_id): elif output == "Success": state = 'SUCCESS' current_process = 'Processed Xml, Loading Output' + current_task.update_state( state=state, meta={'current_process': current_process}) @@ -40,3 +58,6 @@ def process_task(task_id): 'exc_message': traceback.format_exc().split('\n')}) logger.exception('Exception Occurred:') raise Ignore() + + finally: + release_lock() # Ensure lock is always released |