Separate milestone and epic queries when loading roadmap
When epics roadmap is loaded, we load all epics data and milestone data in a single request which is quite expensive:
The GraphQL request we send:
[
{
"operationName": "groupEpics",
"variables": {
"labelName": [],
"authorUsername": "",
"search": "",
"fullPath": "gitlab-org",
"state": "opened",
"sort": "start_date_asc",
"startDate": "2020-4-26",
"dueDate": "2020-8-8"
},
"query": "query groupEpics($fullPath: ID!, $state: EpicState, $sort: EpicSort, $startDate: Time, $dueDate: Time, $labelName: [String!] = [], $authorUsername: String = \"\", $search: String = \"\") {\n group(fullPath: $fullPath) {\n id\n name\n epics(state: $state, sort: $sort, startDate: $startDate, endDate: $dueDate, labelName: $labelName, authorUsername: $authorUsername, search: $search) {\n edges {\n node {\n ...BaseEpic\n parent {\n id\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment BaseEpic on Epic {\n id\n iid\n title\n description\n state\n webUrl\n startDate\n dueDate\n hasChildren\n hasParent\n descendantWeightSum {\n closedIssues\n openedIssues\n __typename\n }\n descendantCounts {\n openedEpics\n closedEpics\n __typename\n }\n group {\n name\n fullName\n fullPath\n __typename\n }\n __typename\n}\n"
},
{
"operationName": "groupMilestones",
"variables": {
"fullPath": "gitlab-org",
"state": "active",
"startDate": "2020-4-26",
"dueDate": "2020-8-8",
"includeDescendants": true
},
"query": "query groupMilestones($fullPath: ID!, $state: MilestoneStateEnum, $startDate: Time, $dueDate: Time, $includeDescendants: Boolean) {\n group(fullPath: $fullPath) {\n id\n name\n milestones(state: $state, startDate: $startDate, endDate: $dueDate, includeDescendants: $includeDescendants) {\n edges {\n node {\n id\n description\n title\n state\n dueDate\n startDate\n webPath\n projectMilestone\n groupMilestone\n subgroupMilestone\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}\n"
}
]
For gitlab-org, it takes ~18s to process this request.
Proposal
Although most of the time takes processing of epics, we send two separate requests - one for milestones, one for epics, the benefit would be we would save about 1s which takes loading of milestones and it wouldn't take so long to show some roadmap data.
Edited by Jan Provaznik