Skip to content

perf(db): 3 optimizations for DB queries - #1111

Merged
gtema merged 1 commit into
mainfrom
perf
Jul 28, 2026
Merged

perf(db): 3 optimizations for DB queries#1111
gtema merged 1 commit into
mainfrom
perf

Conversation

@gtema

@gtema gtema commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Token validation fetched the scope's domain separately from the
already-resolved user domain, even when both point at the same
row (the common case: project and user in the same domain). Skip
the second get_domain lookup when domain_ids match.

resolve_implied_roles pulled the entire implied_role table on every
call, regardless of how many roles were actually being resolved.
Walk the imply graph breadth-first from the assignments' own role
IDs via list_role_imply_rules_by_prior instead, since effective-role
sets are typically a handful of roles.

Also select last local user password only when showing single or listing
users.

@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown

🦢 Load Test Results

Goose Attack Report

Plan Overview

Action Started Stopped Elapsed Users
Increasing 26-07-28 13:41:52 26-07-28 13:42:07 00:00:15 0 → 30
Maintaining 26-07-28 13:42:07 26-07-28 13:42:38 00:00:31 30
Decreasing 26-07-28 13:42:38 26-07-28 13:42:38 00:00:00 0 ← 30

Request Metrics

Method Name # Requests # Fails Average (ms) Min (ms) Max (ms) RPS Failures/s
DELETE DELETE /v3/auth/tokens 432 0 127.00 16 157 14.40 0.00
DELETE DELETE /v3/projects/:id (teardown) 2 0 71.00 65 77 0.07 0.00
DELETE DELETE /v3/users/:id (teardown) 3 0 45.67 34 63 0.10 0.00
GET 3951 0 118.06 85 222 131.70 0.00
GET GET /v3/auth/tokens (validate new) 431 0 126.60 48 154 14.37 0.00
GET GET /v3/projects/:id 587 0 102.14 92 131 19.57 0.00
GET GET /v3/projects/:id (catalog) 589 0 102.17 91 135 19.63 0.00
GET GET /v3/users/:id 842 0 107.07 95 138 28.07 0.00
GET GET /v3/users/:id (catalog) 696 0 106.87 95 136 23.20 0.00
POST POST /v3/auth/tokens 427 0 95.79 87 129 14.23 0.00
Aggregated 7960 0 113.28 16 222 265.33 0.00

Response Time Metrics

Method Name 50%ile (ms) 60%ile (ms) 70%ile (ms) 80%ile (ms) 90%ile (ms) 95%ile (ms) 99%ile (ms) 100%ile (ms)
DELETE DELETE /v3/auth/tokens 130 130 130 130 130 140 150 157
DELETE DELETE /v3/projects/:id (teardown) 65 65 65 77 77 77 77 77
DELETE DELETE /v3/users/:id (teardown) 40 40 40 40 63 63 63 63
GET 110 110 110 120 180 190 200 220
GET GET /v3/auth/tokens (validate new) 130 130 130 130 130 140 150 150
GET GET /v3/projects/:id 100 100 100 110 110 110 120 130
GET GET /v3/projects/:id (catalog) 100 100 100 110 110 110 120 135
GET GET /v3/users/:id 110 110 110 110 110 120 130 138
GET GET /v3/users/:id (catalog) 110 110 110 110 110 120 130 136
POST POST /v3/auth/tokens 95 96 97 99 100 100 110 129
Aggregated 110 110 110 120 130 180 200 220

Status Code Metrics

Method Name Status Codes
DELETE DELETE /v3/auth/tokens 432 [204]
DELETE DELETE /v3/projects/:id (teardown) 2 [204]
DELETE DELETE /v3/users/:id (teardown) 3 [204]
GET 3,951 [200]
GET GET /v3/auth/tokens (validate new) 431 [200]
GET GET /v3/projects/:id 587 [200]
GET GET /v3/projects/:id (catalog) 589 [200]
GET GET /v3/users/:id 842 [200]
GET GET /v3/users/:id (catalog) 696 [200]
POST POST /v3/auth/tokens 427 [201]
Aggregated 7,096 [200], 437 [204], 427 [201]

Transaction Metrics

Transaction # Times Run # Fails Average (ms) Min (ms) Max (ms) RPS Failures/s
ReadHeavy
0.0 1 0 28.00 28 28 0.03 0.00
0.1 673 0 108.33 96 141 22.43 0.00
0.2 672 0 102.02 91 134 22.40 0.00
0.3 675 0 101.93 90 135 22.50 0.00
TokenLifecycle
1.0 0 0 0.00 0 0 0.00 0.00
1.1 432 0 350.51 159 387 14.40 0.00
ValidateToken
2.0 0 0 0.00 0 0 0.00 0.00
2.1 645 0 187.16 112 222 21.50 0.00
UserCRUD
3.0 0 0 0.00 0 0 0.00 0.00
3.1 0 0 0.00 0 0 0.00 0.00
3.2 842 0 107.14 95 138 28.07 0.00
3.3 3 0 45.67 34 63 0.10 0.00
ProjectCRUD
4.0 0 0 0.00 0 0 0.00 0.00
4.1 0 0 0.00 0 0 0.00 0.00
4.2 587 0 102.20 92 131 19.57 0.00
4.3 2 0 71.50 65 78 0.07 0.00
UserRead
5.0 0 0 0.00 0 0 0.00 0.00
5.1 699 0 108.47 85 144 23.30 0.00
5.2 696 0 106.94 95 136 23.20 0.00
ProjectRead
6.0 0 0 0.00 0 0 0.00 0.00
6.1 587 0 102.06 92 132 19.57 0.00
6.2 589 0 102.24 91 135 19.63 0.00
Aggregated 7103 0 126.95 28 387 236.77 0.00

Scenario Metrics

Transaction # Users # Times Run Average (ms) Min (ms) Max (ms) Scenarios/s Iterations
ReadHeavy 7 671 313.30 290 351 22.37 95.86
TokenLifecycle 5 427 351.46 328 387 14.23 85.40
ValidateToken 4 641 187.36 171 222 21.37 160.25
UserCRUD 3 839 107.17 95 138 27.97 279.67
ProjectCRUD 2 585 102.21 92 131 19.50 292.50
UserRead 5 695 215.93 198 248 23.17 139.00
ProjectRead 4 585 204.79 184 238 19.50 146.25
Aggregated 30 4443 202.56 92 387 148.10 1198.92

View full report

Token validation fetched the scope's domain separately from the
already-resolved user domain, even when both point at the same
row (the common case: project and user in the same domain). Skip
the second `get_domain` lookup when domain_ids match.

resolve_implied_roles pulled the entire implied_role table on every
call, regardless of how many roles were actually being resolved.
Walk the imply graph breadth-first from the assignments' own role
IDs via list_role_imply_rules_by_prior instead, since effective-role
sets are typically a handful of roles.

Also select last local user password only when showing single or listing
users.

Signed-off-by: Artem Goncharov <artem.goncharov@gmail.com>
@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown

🧪 Tempest Identity Compatibility Results (advisory, non-blocking)

rust

Totals
======
Ran: 133 tests in 29.8527 sec.
 - Passed: 63
 - Skipped: 4
 - Expected Fail: 0
 - Unexpected Success: 0
 - Failed: 66
Sum of execute time for each test: 19.6395 sec.
Failed test IDs
===== FAILED TESTS (target=rust) =====
tempest.api.identity.admin.v3.test_application_credentials.ApplicationCredentialsV3AdminTest.test_create_application_credential_with_roles[id-3b3dd48f-3388-406a-a9e6-4d078a552d0e]
tempest.api.identity.admin.v3.test_domain_configuration.DomainConfigurationTestJSON.test_create_domain_config_and_show_config_groups_and_options[id-9e3ff13c-f597-4f01-9377-d6c06c2a1477]
tempest.api.identity.admin.v3.test_domain_configuration.DomainConfigurationTestJSON.test_create_update_and_delete_domain_config[id-7161023e-5dd0-4612-9da0-1bac6ac30b63]
tempest.api.identity.admin.v3.test_credentials.CredentialsTestJSON.test_credentials_create_get_update_delete[id-7cd59bf9-bda4-4c72-9467-d21cab278355,smoke]
tempest.api.identity.admin.v3.test_domain_configuration.DomainConfigurationTestJSON.test_create_update_and_delete_domain_config_groups_and_opts[id-c7510fa2-6661-4170-9c6b-4783a80651e9]
setUpClass (tempest.api.identity.admin.v3.test_endpoint_groups.EndPointGroupsTest)
tempest.api.identity.admin.v3.test_domain_configuration.DomainConfigurationTestJSON.test_show_default_group_config_and_options[id-11a02bf0-6f94-4380-b3b0-c8dc18fc0d22]
tempest.api.identity.admin.v3.test_domains_negative.DomainsNegativeTestJSON.test_create_domain_with_name_length_over_64[id-37b1bbf2-d664-4785-9a11-333438586eae,negative]
tempest.api.identity.admin.v3.test_domains_negative.DomainsNegativeTestJSON.test_delete_active_domain[gate,id-1f3fbff5-4e44-400d-9ca1-d953f05f609b,negative]
tempest.api.identity.admin.v3.test_list_projects.ListProjectsTestJSON.test_list_projects_with_enabled[id-0fe7a334-675a-4509-b00e-1c4b95d5dae8]
tempest.api.identity.admin.v3.test_list_projects.ListProjectsTestJSON.test_list_projects_with_parent[id-6edc66f5-2941-4a17-9526-4073311c1fac]
tempest.api.identity.admin.v3.test_default_project_id.TestDefaultProjectId.test_default_project_id[id-d6110661-6a71-49a7-a453-b5e26640ff6d]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_check_revoke_roles_on_projects_group[id-26021436-d5a4-4256-943c-ded01e0d4b45]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_check_revoke_roles_on_projects_user[id-18b70e45-7687-4b72-8277-b8f1a47d7591]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_check_revoke_roles_on_domains_group[id-c7a8dda2-be50-4fb4-9a9c-e830771078b1]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_check_revoke_roles_on_domains_user[id-4e6f0366-97c8-423c-b2be-41eae6ac91c8]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_revoke_user_roles_on_domain[id-3acf666e-5354-42ac-8e17-8b68893bcd36]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_revoke_user_roles_on_project_tree[id-9f02ccd9-9b57-46b4-8f77-dd5a736f3a06]
tempest.api.identity.admin.v3.test_domains.DomainsTestJSON.test_create_domain_without_description[id-2abf8764-309a-4fa9-bc58-201b799817ad]
tempest.api.identity.admin.v3.test_domains.DomainsTestJSON.test_create_update_delete_domain[id-f2f5b44a-82e8-4dad-8084-0661ea3b18cf,smoke]
tempest.api.identity.admin.v3.test_list_users.UsersV3TestJSON.test_list_users_with_not_enabled[id-bff8bf2f-9408-4ef5-b63a-753c8c2124eb]
tempest.api.identity.admin.v3.test_domains.DomainsTestJSON.test_domain_delete_cascades_content[id-d8d318b7-d1b3-4c37-94c5-3c5ba0b121ea]
tempest.api.identity.admin.v3.test_domains.DomainsTestJSON.test_list_domains_filter_by_enabled[id-3fd19840-65c1-43f8-b48c-51bdd066dff9]
tempest.api.identity.admin.v3.test_list_projects.ListProjectsStaticTestJSON.test_list_projects[id-1d830662-22ad-427c-8c3e-4ec854b0af44]
tempest.api.identity.admin.v3.test_project_tags.IdentityV3ProjectTagsTest.test_list_update_delete_project_tags[id-7c123aac-999d-416a-a0fb-84b915ab10de]
tempest.api.identity.admin.v3.test_projects.ProjectsTestJSON.test_create_is_domain_project[id-a7eb9416-6f9b-4dbb-b71b-7f73aaef59d5]
tempest.api.identity.admin.v3.test_projects.ProjectsTestJSON.test_project_create_with_parent[id-1854f9c0-70bc-4d11-a08a-1c789d339e3d]
tempest.api.identity.admin.v3.test_projects.ProjectsTestJSON.test_project_get_equals_list[id-d1db68b6-aebe-4fa0-b79d-d724d2e21162]
tempest.api.identity.v3.test_catalog.IdentityCatalogTest.test_catalog_standardization[id-56b57ced-22b8-4127-9b8a-565dfb0207e2]
tempest.api.identity.admin.v3.test_groups.GroupsV3TestJSON.test_group_users_add_list_delete[id-1598521a-2f36-4606-8df9-30772bd51339,smoke]
tempest.api.identity.admin.v3.test_groups.GroupsV3TestJSON.test_list_user_groups[id-64573281-d26a-4a52-b899-503cb0f4e4ec]
tempest.api.identity.admin.v3.test_policies.PoliciesTestJSON.test_create_update_delete_policy[id-e544703a-2f03-4cf2-9b0f-350782fdb0d3,smoke]
tempest.api.identity.admin.v3.test_policies.PoliciesTestJSON.test_list_policies[id-1a0ad286-2d06-4123-ab0d-728893a76201]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_create_and_show_consumer[id-c8307ea6-a86c-47fd-ae7b-5b3b2caca76d]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_delete_consumer[id-fdfa1b7f-2a31-4354-b2c7-f6ae20554f93]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_list_consumers[id-09ca50de-78f2-4ffb-ac71-f2254036b2b8]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_update_consumer[id-080a9b1a-c009-47c0-9979-5305bf72e3dc]
tempest.api.identity.admin.v3.test_projects_negative.ProjectsNegativeStaticTestJSON.test_create_projects_name_length_over_64[id-502b6ceb-b0c8-4422-bf53-f08fdb21e2f0,negative]
tempest.api.identity.v3.test_tokens.TokensV3Test.test_validate_token[id-a9512ac3-3909-48a4-b395-11f438e16260]
tempest.api.identity.admin.v3.test_tokens.TokensV3TestJSON.test_get_available_domain_scopes[id-ec5ecb05-af64-4c04-ac86-4d9f6f12f185]
tempest.api.identity.admin.v3.test_tokens.TokensV3TestJSON.test_rescope_token[id-565fa210-1da1-4563-999b-f7b5b67cf112]
tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_media_types[id-657c1970-4722-4189-8831-7325f3bc4265,smoke]
tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_resources[id-b9232f5e-d9e5-4d97-b96c-28d3db4de1bd,smoke]
tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_identity_v3_existence[id-79aec9ae-710f-4c54-a4fc-3aa25b4feac3]
tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_list_api_versions[id-721f480f-35b6-46c7-846e-047e6acea0dc,smoke]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_assignments_for_domain_roles[id-3859df7e-5b78-4e4d-b10e-214c8953842a]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_assignments_for_implied_roles_create_delete[id-c8828027-df48-4021-95df-b65b92c7429e]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_group_on_domain[id-4bf8a70b-e785-413a-ad53-9f91ce02faa7]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_group_on_project[id-cbf11737-1904-4690-9613-97bcbb3df1c4]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_group_on_system[id-c888fe4f-8018-48db-b959-542225c1b4b6]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_user_on_domain[id-6c9a2940-3625-43a3-ac02-5dcec62ef3bd]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_implied_domain_roles[id-eb1e1c24-1bc4-4d47-9748-e127a1852c82]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_implied_roles_create_check_show_delete[id-c90c316c-d706-4728-bcba-eb1912081b69]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_role_create_update_show_list[id-18afc6c0-46cf-4911-824e-9989cc056c3a,smoke]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_get_trusts_all[id-4773ebd5-ecbf-4255-b8d8-b63e6f72b65d,smoke]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_get_trusts_query[id-6268b345-87ca-47c0-9ce3-37792b43403a]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_expire[id-0ed14b66-cefd-4b5c-a964-65759453e292]
tempest.api.identity.admin.v3.test_users.UsersV3TestJSON.test_list_user_projects[id-a831e70c-e35b-430b-92ed-81ebbc5437b8]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_impersonate[id-5a0a91a4-baef-4a14-baba-59bf4d7fcace]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_noimpersonate[id-ed2a8779-a7ac-49dc-afd7-30f32f936ed2]
tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_create_application_credential[id-8080c75c-eddc-4786-941a-c2da7039ae61]
tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_create_application_credential_expires[id-852daf0c-42b5-4239-8466-d193d0543ed3]
tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_list_application_credentials[id-ff0cd457-6224-46e7-b79e-0ada4964a8a6]
tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_query_application_credentials[id-9bb5e5cc-5250-493a-8869-8b665f6aa5f6]
tempest.api.identity.admin.v3.test_users_negative.UsersNegativeTest.test_create_user_for_non_existent_domain[id-e75f006c-89cc-477b-874d-588e4eab4b17,negative]
tempest.api.identity.v3.test_projects.IdentityV3ProjectsTest.test_list_projects_returns_only_authorized_projects[id-86128d46-e170-4644-866a-cc487f699e1d]
===== END FAILED TESTS (target=rust) =====

View full run

@gtema gtema changed the title perf(db): 2 optimizations for DB queries perf(db): 3 optimizations for DB queries Jul 28, 2026
@gtema
gtema enabled auto-merge July 28, 2026 13:47
@gtema
gtema added this pull request to the merge queue Jul 28, 2026
@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown

🐰 Bencher Report

Projectkeystone
Branchperf
Testbedubuntu-latest
Click to view all benchmark results
BenchmarkLatencyBenchmark Result
nanoseconds (ns)
(Result Δ%)
Upper Boundary
nanoseconds (ns)
(Limit %)
Command_Serde/apply/remove📈 view plot
🚷 view threshold
142,580.00 ns
(-53.75%)Baseline: 308,263.34 ns
1,597,799.48 ns
(8.92%)
Command_Serde/apply/set📈 view plot
🚷 view threshold
157,980.00 ns
(-51.98%)Baseline: 328,976.91 ns
1,575,959.92 ns
(10.02%)
Command_Serde/pack/delete📈 view plot
🚷 view threshold
122.07 ns
(+2.98%)Baseline: 118.54 ns
155.79 ns
(78.36%)
Command_Serde/pack/delete_index📈 view plot
🚷 view threshold
108.64 ns
(+3.63%)Baseline: 104.83 ns
136.39 ns
(79.65%)
Command_Serde/pack/set📈 view plot
🚷 view threshold
194.54 ns
(+2.46%)Baseline: 189.88 ns
247.71 ns
(78.53%)
Command_Serde/pack/set_index📈 view plot
🚷 view threshold
108.36 ns
(+3.39%)Baseline: 104.80 ns
136.52 ns
(79.37%)
Command_Serde/unpack/delete📈 view plot
🚷 view threshold
192.95 ns
(+4.28%)Baseline: 185.03 ns
264.20 ns
(73.03%)
Command_Serde/unpack/delete_index📈 view plot
🚷 view threshold
157.51 ns
(+1.59%)Baseline: 155.04 ns
215.66 ns
(73.04%)
Command_Serde/unpack/set📈 view plot
🚷 view threshold
281.47 ns
(+8.60%)Baseline: 259.18 ns
352.25 ns
(79.91%)
Command_Serde/unpack/set_index📈 view plot
🚷 view threshold
154.81 ns
(+1.63%)Baseline: 152.33 ns
211.09 ns
(73.34%)
Payload_encryption/pack/remove_cmd📈 view plot
🚷 view threshold
127.01 ns
(+13.46%)Baseline: 111.94 ns
147.98 ns
(85.83%)
Payload_encryption/pack/set_cmd📈 view plot
🚷 view threshold
198.83 ns
(+1.66%)Baseline: 195.58 ns
265.38 ns
(74.92%)
Payload_encryption/unpack/remove_cmd📈 view plot
🚷 view threshold
211.87 ns
(+8.82%)Baseline: 194.69 ns
279.60 ns
(75.78%)
Payload_encryption/unpack/set_cmd📈 view plot
🚷 view threshold
305.88 ns
(+12.57%)Baseline: 271.72 ns
375.59 ns
(81.44%)
Raft_1Node_Latency/prefix/1node📈 view plot
🚷 view threshold
2,491,000.00 ns
(-8.47%)Baseline: 2,721,646.09 ns
6,564,437.07 ns
(37.95%)
Raft_1Node_Latency/read/1node📈 view plot
🚷 view threshold
43,876.00 ns
(+14.79%)Baseline: 38,222.69 ns
54,116.03 ns
(81.08%)
Raft_1Node_Latency/remove/1node📈 view plot
🚷 view threshold
417,320.00 ns
(-47.50%)Baseline: 794,955.62 ns
3,891,058.86 ns
(10.73%)
Raft_1Node_Latency/write/1node📈 view plot
🚷 view threshold
417,970.00 ns
(-55.91%)Baseline: 947,995.31 ns
5,439,675.79 ns
(7.68%)
build_snapshot/default📈 view plot
🚷 view threshold
114,670.00 ns
(-7.07%)Baseline: 123,400.02 ns
208,899.32 ns
(54.89%)
fernet token/project📈 view plot
🚷 view threshold
1,504.90 ns
(+6.90%)Baseline: 1,407.74 ns
1,791.01 ns
(84.03%)
get_data_keyspace📈 view plot
🚷 view threshold
0.31 ns
(-0.40%)Baseline: 0.31 ns
0.39 ns
(80.84%)
get_db📈 view plot
🚷 view threshold
0.31 ns
(-0.49%)Baseline: 0.31 ns
0.39 ns
(80.84%)
get_fernet_token_timestamp/project📈 view plot
🚷 view threshold
133.79 ns
(-3.96%)Baseline: 139.31 ns
179.94 ns
(74.35%)
get_keyspace📈 view plot
🚷 view threshold
4.28 ns
(-24.88%)Baseline: 5.70 ns
12.89 ns
(33.19%)
🐰 View full continuous benchmarking report in Bencher

@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Jul 28, 2026
@gtema
gtema added this pull request to the merge queue Jul 28, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Jul 28, 2026
@gtema
gtema added this pull request to the merge queue Jul 28, 2026
Merged via the queue into main with commit efcb4f0 Jul 28, 2026
38 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant