Skip to content

Commit

Permalink
Transfers: skip missing requests in poller/receiver. Closes #5429
Browse files Browse the repository at this point in the history
If get_request returns an empty result, the request doesn't exist in
the database. This can happen under normal operation if the cleaner
deleted the request in the meantime. So gracefully handle this case
by skipping the request.
  • Loading branch information
rcarpa committed Jul 12, 2022
1 parent 1fca0f8 commit f5164ea
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 1 deletion.
5 changes: 5 additions & 0 deletions lib/rucio/core/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -696,6 +696,11 @@ def set_request_state(request_id, state, external_id=None, transferred_at=None,
update_items['attributes'] = json.dumps(attributes)

request = get_request(request_id, session=session)
if not request:
# The request was deleted in the meantime. Ignore it.
logger(logging.WARNING, "Request %s not found. Cannot set its state to %s", request_id, state)
return

if state in [RequestState.FAILED, RequestState.DONE, RequestState.LOST] and (request["external_id"] != external_id):
logger(logging.ERROR, "Request %s should not be updated to 'Failed' or 'Done' without external transfer_id" % request_id)
else:
Expand Down
8 changes: 7 additions & 1 deletion lib/rucio/transfertool/fts3.py
Original file line number Diff line number Diff line change
Expand Up @@ -506,7 +506,10 @@ def initialize(self, session, logger=logging.log):
transfer_id = self._transfer_id
if new_state:
request = self.request(session)
if request['external_id'] == transfer_id and request['state'] != new_state:
if not request:
logger(logging.WARNING, '%s: no request with this id in the database. Skipping. external_id: %s (%s). new_state: %s', request_id, transfer_id, self.external_host, new_state)
return
if request and request['external_id'] == transfer_id and request['state'] != new_state:
src_rse_name, src_rse_id = self._find_used_source_rse(session, logger)

self._reason = reason
Expand Down Expand Up @@ -591,6 +594,9 @@ def initialize(self, session, logger=logging.log):
transfer_id = self._transfer_id
if new_state:
request = self.request(session)
if not request:
logger(logging.WARNING, '%s: no request with this id in the database. Skipping. external_id: %s (%s). new_state: %s', request_id, transfer_id, self.external_host, new_state)
return
if request['external_id'] == transfer_id and request['state'] != new_state:
src_rse_name, src_rse_id = self._find_used_source_rse(session, logger)

Expand Down

0 comments on commit f5164ea

Please sign in to comment.