Merge Requests API returns 408 instead of 504 under specific conditions
<!--IssueSummary start--> <details> <summary> Everyone can contribute. [Help move this issue forward](https://handbook.gitlab.com/handbook/marketing/developer-relations/contributor-success/community-contributors-workflows/#contributor-links) while earning points, leveling up and collecting rewards. </summary> - [Close this issue](https://contributors.gitlab.com/manage-issue?action=close&projectId=278964&issueIid=500577) </details> <!--IssueSummary end--> ### Summary When querying the Merge Requests API under specific conditions the API returns a `408` instead of a `504` error. I was not able to isolate a specific failure case to duplicate the issue. These `408` errors seem to happen most frequently when querying for automation users that frequently cycle merge requests, which may impact the system's ability to return results from cache ### Steps to reproduce 1. Have a service user that creates and closes Merge Requests in a large, active namespace 2. Run a script like this with a valid API token and configured to scan for the username and namespace ID: <details><summary>exercise-the-api.py</summary> ```python import os import datetime import gitlab gl = gitlab.Gitlab('https://gitlab.com', private_token="", timeout=60, pagination="keyset", order_by="id", per_page=100, retry_transient_errors=True) gl.enable_debug() username = '' groupid = state = 'opened' num_days = 30 group = gl.groups.get(groupid) oldestDateTime = datetime.datetime.now() - datetime.timedelta(num_days) mrs = group.mergerequests.list(state=state, author_username=username, created_before=oldestDateTime.isoformat(), order_by='created_at', sort='desc', iterator=True) for groupmr in mrs: project = gl.projects.get(groupmr.project_id) mr = project.mergerequests.get(groupmr.iid) try: # print("MR:", mr.title, project.path_with_namespace) branch = mr.source_branch print("MR branch:", branch) except Exception as e: print(e) ``` </details> This script is not required; it's simply supplied as an example. ### What is the current *bug* behavior? Under the specific conditions that can produce this failure the API will return a `408`. The logs show ~15 seconds of `db_duration_s` time, which indicates the API has received a complete query and is attempting to service it. In these cases a `408` is returned, which causes problems for clients expecting a `504`. This dashboard has been filtered to show Kibana logs from a customer that reported this issue. I *believe* other `408` errors may be similar, but I was not able to validate. ### What is the expected *correct* behavior? When this API call reaches 15 seconds of `db_duration_s` time it should return a 504 since I can't see why a `408` would be correct when the DB is used. ### Relevant logs and/or screenshots Scoped Kibana dashboard showing logs of the issue: https://log.gprd.gitlab.net/app/r/s/Pwufd This issues was also discussed in confidential RFH [291](https://gitlab.com/gitlab-com/dev-sub-department/section-dev-request-for-help/-/issues/291) ### Possible fixes <!-- If you can, link to the line of code that might be responsible for the problem. --> <!-- If you don't have /label privileges, follow up with an issue comment of `@gitlab-bot label ~"type::bug"` -->
issue