in gnm_deliverables/views/views.py [0:0]
def post(self, request, atom_id=None):
from time import sleep
logger.info("Received update from launch detector: {0}".format(request.data))
try:
msg = gnm_deliverables.launch_detector.LaunchDetectorUpdate(request.data)
except ValidationError as e:
logger.error("External update didn't validate: {0}".format(str(e)))
logger.error("Offending content was: {0}".format(request.data))
return Response({"status":"invalid_data"}, status=400)
if msg.atom_id=="":
logger.error("Received empty body")
return Response({"status":"invalid_data"},status=400)
attempt = 1
while True:
try:
return self.try_update(request, msg)
except DeliverableAsset.DoesNotExist:
logger.error("Could not find a deliverable asset matching the atom id {0}".format(msg.atom_id))
if attempt>=5:
return Response({"status":"not_found","atom_id":msg.atom_id}, status=404)
else:
attempt+=1
#asynchronous retries would be a LOT better. But would be a lot more work too. We'll
#re-visit if this causes problems. Max delay is 15s.
logger.warning("Retrying for attempt {} after 3s...".format(attempt))
sleep(3)
except Exception as e:
logger.exception("Could not process incoming update for {0}: ".format(atom_id), exc_info=e)
return Response({"status":"server_error", "detail": str(e)}, status=500)