From a9bea38ca0e61250289764fd0d50c0e47a99b841 Mon Sep 17 00:00:00 2001
From: Jorrit Schaap <schaap@astron.nl>
Date: Tue, 28 Feb 2017 11:28:43 +0000
Subject: [PATCH] Task #10339: remove task from radb when setting status in
 otdb does not succeed do to delete task

---
 .../lib/webservice.py                         | 35 ++++++++++---------
 1 file changed, 19 insertions(+), 16 deletions(-)

diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/webservice.py b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/webservice.py
index d2a3e20f1fd..82d06b101c9 100755
--- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/webservice.py
+++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/webservice.py
@@ -40,6 +40,7 @@ from flask import request
 from flask import abort
 from flask import url_for
 from lofar.common.flask_utils import gzipped
+from lofar.messaging.RPC import RPCException
 from lofar.sas.resourceassignment.resourceassignmenteditor.fakedata import *
 from lofar.sas.resourceassignment.resourceassignmenteditor.changeshandler import ChangesHandler, CHANGE_DELETE_TYPE
 from lofar.sas.datamanagement.common.config import DEFAULT_DM_NOTIFICATION_BUSNAME, DEFAULT_DM_NOTIFICATION_SUBJECTS
@@ -403,27 +404,29 @@ def putTask(task_id):
                 if not task:
                     abort(404, "unknown task %s" % str(updatedTask))
 
-                otdbrpc.taskSetStatus(task['otdb_id'], updatedTask['status'])
-
-                #block until radb and mom task status are equal to otdb task status (with timeout)
-                start_wait = datetime.utcnow()
-
-                while True:
-                    task = radb().getTask(task_id)
-                    details = momqueryrpc.getProjectDetails(task['mom_id']).get(task['mom_id'])
+                try:
+                    otdbrpc.taskSetStatus(task['otdb_id'], updatedTask['status'])
 
-                    if task['status'] == updatedTask['status'] and details['object_status'] == updatedTask['status']:
-                        break
+                    #block until radb and mom task status are equal to otdb task status (with timeout)
+                    start_wait = datetime.utcnow()
 
-                    if datetime.utcnow() - start_wait > timedelta(seconds=10):
-                        break
+                    while True:
+                        task = radb().getTask(task_id)
+                        details = momqueryrpc.getProjectDetails(task['mom_id']).get(task['mom_id'])
 
-                    time.sleep(0.2)
+                        if task['status'] == updatedTask['status'] and details['object_status'] == updatedTask['status']:
+                            break
 
+                        if datetime.utcnow() - start_wait > timedelta(seconds=10):
+                            break
 
-            #radb().updateTaskAndResourceClaims(task_id,
-                                              #starttime=updatedTask.get('starttime', None),
-                                              #endtime=updatedTask.get('endtime', None))
+                        time.sleep(0.2)
+                except RPCException as e:
+                    if 'does not exist' in e.message:
+                        # task does not exist (anymore) in otdb
+                        #so remove it from radb as well (with cascading deletes on specification)
+                        logger.warn('task with otdb_id %s does not exist anymore in OTDB. removing task radb_id %s from radb', task['otdb_id'], task['id'])
+                        radb().deleteSpecification(task['specification_id'])
 
             if 'data_pinned' in updatedTask:
                 task = radb().getTask(task_id)
-- 
GitLab