Flaky N+1 tests on merge request API specs
The N+1 query recorder tests in spec/requests/api/merge_requests_spec.rb
are flaky when combined with caching, presumably because it interferes with the lazy loading of Gitlab::IssuableMetadata
.
Personally I think we should just remove these tests, but I don't think that should be done in !61067 (merged), so I'm creating this issue to track it.
Logs
1) API::MergeRequests GET /projects/:id/merge_requests behaves like merge requests list when authenticated avoids N+1 queries [178/5069]
Failure/Error:
expect do
get api(endpoint_path, user)
end.not_to exceed_query_limit(control)
Expected a maximum of 43 queries, got 46:
Query Diff:
-----------
SELECT "personal_access_tokens".* FROM "personal_access_tokens"...
-- (expected: 2, got: 0)
WHERE "personal_access_tokens"."token_digest" = 'GKL2cotwwe6ai7Xh4bNLDNPuHWTgw+6E9FgxLIzqs80=' LIMIT 1
-- (expected: 0, got: 2)
WHERE "personal_access_tokens"."token_digest" = '2QJesdkubsnbYrDNUdGz0fhn5HpFiZPDZRvTsN31uCc=' LIMIT 1
SELECT "licenses".* FROM "licenses"...
-- (expected: 2, got: 1)
ORDER BY "licenses"."id" DESC LIMIT 100
INSERT INTO "personal_access_tokens" ("user_id", "name", "expires_at", "created_at", "updated_at", "scopes", "token_digest")...
-- (expected: 1, got: 0)
VALUES (1, 'PAT 36', '2021-05-12', '2021-05-07 09:40:28.657448', '2021-05-07 09:40:28.657448', '---
- api
', 'GKL2cotwwe6ai7Xh4bNLDNPuHWTgw+6E9FgxLIzqs80=') RETURNING "id"
-- (expected: 0, got: 1)
VALUES (1, 'PAT 37', '2021-05-12', '2021-05-07 09:40:28.929503', '2021-05-07 09:40:28.929503', '---
- api
', '2QJesdkubsnbYrDNUdGz0fhn5HpFiZPDZRvTsN31uCc=') RETURNING "id"
UPDATE "personal_access_tokens"...
-- (expected: 1, got: 0)
SET "last_used_at" = '2021-05-07 09:40:28.707748' WHERE "personal_access_tokens"."id" = 36
-- (expected: 0, got: 1)
SET "last_used_at" = '2021-05-07 09:40:28.983134' WHERE "personal_access_tokens"."id" = 37
SELECT "merge_request_assignees".* FROM "merge_request_assignees"...
-- (expected: 1, got: 0)
WHERE "merge_request_assignees"."merge_request_id" IN (28, 29, 27, 26)
-- (expected: 0, got: 1)
WHERE "merge_request_assignees"."merge_request_id" IN (28, 29, 27, 31, 30, 26)
SELECT "notes".* FROM "notes"...
-- (expected: 1, got: 0)
WHERE "notes"."type" IN ('DiffNote', 'DiscussionNote') AND "notes"."noteable_type" IN ('MergeRequest', 'DesignManagement::Design') AND "notes"."system" = FALSE AND "notes"."resol
ved_at" IS NULL AND "notes"."noteable_id" IN (28, 29, 27, 26)
-- (expected: 0, got: 1)
WHERE "notes"."type" IN ('DiffNote', 'DiscussionNote') AND "notes"."noteable_type" IN ('MergeRequest', 'DesignManagement::Design') AND "notes"."system" = FALSE AND "notes"."resol
ved_at" IS NULL AND "notes"."noteable_id" IN (28, 29, 27, 31, 30, 26)
SELECT "label_links".* FROM "label_links"...
-- (expected: 1, got: 0)
WHERE "label_links"."target_type" = 'MergeRequest' AND "label_links"."target_id" IN (28, 29, 27, 26)
-- (expected: 0, got: 1)
WHERE "label_links"."target_type" = 'MergeRequest' AND "label_links"."target_id" IN (28, 29, 27, 31, 30, 26)
SELECT "timelogs".* FROM "timelogs"...
-- (expected: 1, got: 0)
WHERE "timelogs"."merge_request_id" IN (28, 29, 27, 26)
-- (expected: 0, got: 1)
WHERE "timelogs"."merge_request_id" IN (28, 29, 27, 31, 30, 26)
SELECT "merge_request_diffs".* FROM "merge_request_diffs"...
-- (expected: 1, got: 0)
WHERE "merge_request_diffs"."id" IN (28, 29, 27, 26)
-- (expected: 0, got: 1)
WHERE "merge_request_diffs"."id" IN (28, 29, 27, 31, 30, 26)
SELECT "merge_request_reviewers".* FROM "merge_request_reviewers"...
-- (expected: 1, got: 0)
WHERE "merge_request_reviewers"."merge_request_id" IN (28, 29, 27, 26)
-- (expected: 0, got: 1)
WHERE "merge_request_reviewers"."merge_request_id" IN (28, 29, 27, 31, 30, 26)
SELECT "merge_request_metrics".* FROM "merge_request_metrics"...
-- (expected: 1, got: 0)
WHERE "merge_request_metrics"."merge_request_id" IN (28, 29, 27, 26)
-- (expected: 0, got: 1)
WHERE "merge_request_metrics"."merge_request_id" IN (28, 29, 27, 31, 30, 26)
SELECT "merge_request_blocks".* FROM "merge_request_blocks"...
-- (expected: 1, got: 0)
WHERE "merge_request_blocks"."blocked_merge_request_id" IN (28, 29, 27, 26)
-- (expected: 0, got: 1)
WHERE "merge_request_blocks"."blocked_merge_request_id" IN (28, 29, 27, 31, 30, 26)
SELECT "award_emoji"."name", "award_emoji"."awardable_id", COUNT(*) as count FROM "award_emoji"...
-- (expected: 1, got: 0)
WHERE (name IN ('thumbsdown','thumbsup') AND awardable_type = 'MergeRequest' AND awardable_id IN (27,26)) GROUP BY "award_emoji"."name", "award_emoji"."awardable_id"
-- (expected: 0, got: 1)
WHERE (name IN ('thumbsdown','thumbsup') AND awardable_type = 'MergeRequest' AND awardable_id IN (27,31)) GROUP BY "award_emoji"."name", "award_emoji"."awardable_id"
-- (expected: 0, got: 1)
WHERE (name IN ('thumbsdown','thumbsup') AND awardable_type = 'MergeRequest' AND awardable_id IN (31,30)) GROUP BY "award_emoji"."name", "award_emoji"."awardable_id"
-- (expected: 0, got: 1)
WHERE (name IN ('thumbsdown','thumbsup') AND awardable_type = 'MergeRequest' AND awardable_id IN (30,26)) GROUP BY "award_emoji"."name", "award_emoji"."awardable_id"
SELECT "notes"."noteable_id", COUNT(*) as count FROM "notes"...
-- (expected: 1, got: 0)
WHERE "notes"."system" = FALSE AND "notes"."noteable_type" = 'MergeRequest' AND "notes"."noteable_id" IN (27, 26) GROUP BY "notes"."noteable_id"
-- (expected: 0, got: 1)
WHERE "notes"."system" = FALSE AND "notes"."noteable_type" = 'MergeRequest' AND "notes"."noteable_id" IN (27, 31) GROUP BY "notes"."noteable_id"
-- (expected: 0, got: 1)
WHERE "notes"."system" = FALSE AND "notes"."noteable_type" = 'MergeRequest' AND "notes"."noteable_id" IN (31, 30) GROUP BY "notes"."noteable_id"
-- (expected: 0, got: 1)
WHERE "notes"."system" = FALSE AND "notes"."noteable_type" = 'MergeRequest' AND "notes"."noteable_id" IN (30, 26) GROUP BY "notes"."noteable_id"
Shared Example Group: "merge requests list" called from ./spec/requests/api/merge_requests_spec.rb:974
# ./spec/requests/api/merge_requests_spec.rb:69:in `block (4 levels) in <top (required)>'
The failure appears to be caused by the Gitlab::IssuableMetadata
loading:
SELECT "award_emoji"."name", "award_emoji"."awardable_id", COUNT(*) as count FROM "award_emoji"...
-- (expected: 1, got: 0)
WHERE (name IN ('thumbsdown','thumbsup') AND awardable_type = 'MergeRequest' AND awardable_id IN (27,26)) GROUP BY "award_emoji"."name", "award_emoji"."awardable_id"
-- (expected: 0, got: 1)
WHERE (name IN ('thumbsdown','thumbsup') AND awardable_type = 'MergeRequest' AND awardable_id IN (27,31)) GROUP BY "award_emoji"."name", "award_emoji"."awardable_id"
-- (expected: 0, got: 1)
WHERE (name IN ('thumbsdown','thumbsup') AND awardable_type = 'MergeRequest' AND awardable_id IN (31,30)) GROUP BY "award_emoji"."name", "award_emoji"."awardable_id"
-- (expected: 0, got: 1)
WHERE (name IN ('thumbsdown','thumbsup') AND awardable_type = 'MergeRequest' AND awardable_id IN (30,26)) GROUP BY "award_emoji"."name", "award_emoji"."awardable_id"
SELECT "notes"."noteable_id", COUNT(*) as count FROM "notes"...
-- (expected: 1, got: 0)
WHERE "notes"."system" = FALSE AND "notes"."noteable_type" = 'MergeRequest' AND "notes"."noteable_id" IN (27, 26) GROUP BY "notes"."noteable_id"
-- (expected: 0, got: 1)
WHERE "notes"."system" = FALSE AND "notes"."noteable_type" = 'MergeRequest' AND "notes"."noteable_id" IN (27, 31) GROUP BY "notes"."noteable_id"
-- (expected: 0, got: 1)
WHERE "notes"."system" = FALSE AND "notes"."noteable_type" = 'MergeRequest' AND "notes"."noteable_id" IN (31, 30) GROUP BY "notes"."noteable_id"
-- (expected: 0, got: 1)
WHERE "notes"."system" = FALSE AND "notes"."noteable_type" = 'MergeRequest' AND "notes"."noteable_id" IN (30, 26) GROUP BY "notes"."noteable_id"
Edited by Robert May