summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuchita Lad2025-03-05 16:49:27 +0530
committerSuchita Lad2025-03-05 16:49:27 +0530
commit15f96a1ca90e0febfdb852ce42c27c214cc61d30 (patch)
tree90f074c4aef34f4e564a5361a94535865a90cc60
parentcd79a435e83a5d079dadf92d952691ac57b6d28e (diff)
downloadCommon-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.py13
-rw-r--r--blocks/simulationAPI/tasks.py29
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