Skip to content

chore: Extend workspace unsafe/unwrap/expect lints - #1120

Merged
gtema merged 1 commit into
mainfrom
clippy
Jul 30, 2026
Merged

chore: Extend workspace unsafe/unwrap/expect lints#1120
gtema merged 1 commit into
mainfrom
clippy

Conversation

@gtema

@gtema gtema commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Wire [lints] workspace = true into api-types, audit, core, core-types,
keystone, local-emergency-store, storage-api, webauthn, and
k8s-auth-driver-sql, and drop storage-crypto-{pkcs11,tpm}'s own
unsafe_code = "forbid" override in favor of the workspace one — no crate
outside storage-crypto may contain unsafe code.

Fix resulting violations without weakening the policy:

  • core: replace two unsafe std::env::set_var/remove_var calls in
    auth_plugin.rs tests with temp_env::with_var instead of loosening
    unsafe_code to "deny" (overridable) as a workaround.
  • core-types: keep SecurityContextTestingBuilder::build() panicking via
    plain .expect() + #[allow(clippy::expect_used)], not a hand-rolled
    match/panic! that dodges the lint.
  • audit/webauthn integration tests: annotate helper functions
    (hex_decode, vectors_path, get_provider_mocks, get_isolated_database,
    get_state) with targeted #[allow(clippy::expect_used/unwrap_used)] —
    clippy.toml's allow-*-in-tests only exempts #[test] fns/#[cfg(test)]
    modules, not free helpers called from them.
  • identity-driver-sql: factor the repeated 4-tuple/3-tuple in
    fetch_joined_user_details into JoinedUserDetails/JoinedUserDetailsRow
    type aliases (clippy::type_complexity).
  • core/rate_limit.rs: gate IpRateLimitKey, rate_limit_key_for_ip, and
    the IpAddr import behind cfg(any(feature = "api", test)) to match
    their only caller (check_ip); mark trusted_proxies dead_code outside
    that cfg since it's written unconditionally but only read there.

Signed-off-by: Artem Goncharov artem.goncharov@gmail.com

Wire `[lints] workspace = true` into api-types, audit, core, core-types,
keystone, local-emergency-store, storage-api, webauthn, and
k8s-auth-driver-sql, and drop storage-crypto-{pkcs11,tpm}'s own
unsafe_code = "forbid" override in favor of the workspace one — no crate
outside storage-crypto may contain unsafe code.

Fix resulting violations without weakening the policy:
- core: replace two unsafe std::env::set_var/remove_var calls in
  auth_plugin.rs tests with temp_env::with_var instead of loosening
  unsafe_code to "deny" (overridable) as a workaround.
- core-types: keep SecurityContextTestingBuilder::build() panicking via
  plain .expect() + #[allow(clippy::expect_used)], not a hand-rolled
  match/panic! that dodges the lint.
- audit/webauthn integration tests: annotate helper functions
  (hex_decode, vectors_path, get_provider_mocks, get_isolated_database,
  get_state) with targeted #[allow(clippy::expect_used/unwrap_used)] —
  clippy.toml's allow-*-in-tests only exempts #[test] fns/#[cfg(test)]
  modules, not free helpers called from them.
- identity-driver-sql: factor the repeated 4-tuple/3-tuple in
  fetch_joined_user_details into JoinedUserDetails/JoinedUserDetailsRow
  type aliases (clippy::type_complexity).
- core/rate_limit.rs: gate IpRateLimitKey, rate_limit_key_for_ip, and
  the IpAddr import behind cfg(any(feature = "api", test)) to match
  their only caller (check_ip); mark trusted_proxies dead_code outside
  that cfg since it's written unconditionally but only read there.

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

Copy link
Copy Markdown

🦢 Load Test Results

Goose Attack Report

Plan Overview

Action Started Stopped Elapsed Users
Increasing 26-07-30 11:10:19 26-07-30 11:10:35 00:00:16 0 → 30
Maintaining 26-07-30 11:10:35 26-07-30 11:11:05 00:00:30 30
Decreasing 26-07-30 11:11:05 26-07-30 11:11:29 00:00:24 0 ← 30

Request Metrics

Method Name # Requests # Fails Average (ms) Min (ms) Max (ms) RPS Failures/s
DELETE DELETE /v3/auth/tokens 420 0 97.68 11 122 14.00 0.00
DELETE DELETE /v3/projects/:id (teardown) 2 0 29.50 28 31 0.07 0.00
DELETE DELETE /v3/users/:id (teardown) 3 0 30.67 28 36 0.10 0.00
GET 4477 0 104.08 72 147 149.23 0.00
GET GET /v3/auth/tokens (validate new) 418 1 241.03 61 60001 13.93 0.03
GET GET /v3/projects/:id 614 0 97.69 82 121 20.47 0.00
GET GET /v3/projects/:id (catalog) 616 0 97.13 90 124 20.53 0.00
GET GET /v3/users/:id 879 0 102.43 83 130 29.30 0.00
GET GET /v3/users/:id (catalog) 728 0 102.29 90 131 24.27 0.00
POST POST /v3/auth/tokens 416 0 92.00 84 119 13.87 0.00
Aggregated 8573 1 108.54 11 60001 285.77 0.03

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 98 98 99 100 100 110 110 120
DELETE DELETE /v3/projects/:id (teardown) 28 28 28 31 31 31 31 31
DELETE DELETE /v3/users/:id (teardown) 28 28 28 28 36 36 36 36
GET 100 100 110 110 120 120 130 147
GET GET /v3/auth/tokens (validate new) 97 98 99 100 100 100 110 60,000
GET GET /v3/projects/:id 97 98 99 100 100 110 110 120
GET GET /v3/projects/:id (catalog) 96 97 98 99 100 100 110 120
GET GET /v3/users/:id 100 100 100 110 110 110 120 130
GET GET /v3/users/:id (catalog) 100 100 100 110 110 110 120 130
POST POST /v3/auth/tokens 91 92 93 94 96 99 110 119
Aggregated 100 100 100 110 110 120 120 60,000

Status Code Metrics

Method Name Status Codes
DELETE DELETE /v3/auth/tokens 420 [204]
DELETE DELETE /v3/projects/:id (teardown) 2 [204]
DELETE DELETE /v3/users/:id (teardown) 3 [204]
GET 4,477 [200]
GET GET /v3/auth/tokens (validate new) 417 [200], 1 [0]
GET GET /v3/projects/:id 614 [200]
GET GET /v3/projects/:id (catalog) 616 [200]
GET GET /v3/users/:id 879 [200]
GET GET /v3/users/:id (catalog) 728 [200]
POST POST /v3/auth/tokens 416 [201]
Aggregated 7,731 [200], 416 [201], 1 [0], 425 [204]

Transaction Metrics

Transaction # Times Run # Fails Average (ms) Min (ms) Max (ms) RPS Failures/s
ReadHeavy
0.0 1 0 20.00 20 20 0.03 0.00
0.1 705 0 103.65 94 136 23.50 0.00
0.2 702 0 97.78 90 130 23.40 0.00
0.3 701 0 97.43 89 123 23.37 0.00
TokenLifecycle
1.0 0 0 0.00 0 0 0.00 0.00
1.1 420 0 431.03 174 60094 14.00 0.00
ValidateToken
2.0 0 0 0.00 0 0 0.00 0.00
2.1 1025 0 117.25 87 147 34.17 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 879 0 102.47 83 130 29.30 0.00
3.3 3 0 30.67 28 36 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 614 0 97.72 82 121 20.47 0.00
4.3 2 0 29.50 28 31 0.07 0.00
UserRead
5.0 0 0 0.00 0 0 0.00 0.00
5.1 729 0 103.82 96 130 24.30 0.00
5.2 728 0 102.32 90 131 24.27 0.00
ProjectRead
6.0 0 0 0.00 0 0 0.00 0.00
6.1 615 0 98.01 72 125 20.50 0.00
6.2 616 0 97.17 90 124 20.53 0.00
Aggregated 7740 0 120.22 20 60094 258.00 0.00

Scenario Metrics

Transaction # Users # Times Run Average (ms) Min (ms) Max (ms) Scenarios/s Iterations
ReadHeavy 7 700 299.92 282 341 23.33 100.00
TokenLifecycle 4 415 288.98 274 321 13.83 103.75
ValidateToken 4 1021 117.31 108 147 34.03 255.25
UserCRUD 3 876 102.51 94 130 29.20 292.00
ProjectCRUD 2 612 97.77 90 121 20.40 306.00
UserRead 5 726 206.65 194 239 24.20 145.20
ProjectRead 4 615 195.76 183 227 20.50 153.75
Aggregated 29 4965 175.17 90 341 165.50 1355.95

Error Metrics

Method Name # Error
GET GET /v3/auth/tokens (validate new) 1 error sending request GET /v3/auth/tokens (validate new): operation timed out

View full report

@github-actions

Copy link
Copy Markdown

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

rust

Totals
======
Ran: 133 tests in 32.1472 sec.
 - Passed: 63
 - Skipped: 4
 - Expected Fail: 0
 - Unexpected Success: 0
 - Failed: 66
Sum of execute time for each test: 23.4355 sec.
Failed test IDs
===== FAILED TESTS (target=rust) =====
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_application_credentials.ApplicationCredentialsV3AdminTest.test_create_application_credential_with_roles[id-3b3dd48f-3388-406a-a9e6-4d078a552d0e]
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_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_domains_negative.DomainsNegativeTestJSON.test_create_domain_with_name_length_over_64[id-37b1bbf2-d664-4785-9a11-333438586eae,negative]
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]
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_delete_active_domain[gate,id-1f3fbff5-4e44-400d-9ca1-d953f05f609b,negative]
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_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_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]
setUpClass (tempest.api.identity.admin.v3.test_endpoint_groups.EndPointGroupsTest)
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_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_groups.GroupsV3TestJSON.test_group_users_add_list_delete[id-1598521a-2f36-4606-8df9-30772bd51339,smoke]
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_groups.GroupsV3TestJSON.test_list_user_groups[id-64573281-d26a-4a52-b899-503cb0f4e4ec]
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.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_users_negative.UsersNegativeTest.test_create_user_for_non_existent_domain[id-e75f006c-89cc-477b-874d-588e4eab4b17,negative]
tempest.api.identity.admin.v3.test_list_projects.ListProjectsStaticTestJSON.test_list_projects[id-1d830662-22ad-427c-8c3e-4ec854b0af44]
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.v3.test_catalog.IdentityCatalogTest.test_catalog_standardization[id-56b57ced-22b8-4127-9b8a-565dfb0207e2]
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.admin.v3.test_list_users.UsersV3TestJSON.test_list_users_with_not_enabled[id-bff8bf2f-9408-4ef5-b63a-753c8c2124eb]
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_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_tokens.TokensV3TestJSON.test_get_available_domain_scopes[id-ec5ecb05-af64-4c04-ac86-4d9f6f12f185]
tempest.api.identity.admin.v3.test_users.UsersV3TestJSON.test_list_user_projects[id-a831e70c-e35b-430b-92ed-81ebbc5437b8]
tempest.api.identity.admin.v3.test_tokens.TokensV3TestJSON.test_rescope_token[id-565fa210-1da1-4563-999b-f7b5b67cf112]
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.v3.test_tokens.TokensV3Test.test_validate_token[id-a9512ac3-3909-48a4-b395-11f438e16260]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_expire[id-0ed14b66-cefd-4b5c-a964-65759453e292]
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_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_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 added this pull request to the merge queue Jul 30, 2026
@github-actions

Copy link
Copy Markdown

🐰 Bencher Report

Projectkeystone
Branchclippy
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
130,050.00 ns
(-60.67%)Baseline: 330,662.22 ns
1,646,361.36 ns
(7.90%)
Command_Serde/apply/set📈 view plot
🚷 view threshold
143,790.00 ns
(-61.04%)Baseline: 369,076.91 ns
1,711,427.52 ns
(8.40%)
Command_Serde/pack/delete📈 view plot
🚷 view threshold
121.10 ns
(+2.67%)Baseline: 117.96 ns
157.94 ns
(76.68%)
Command_Serde/pack/delete_index📈 view plot
🚷 view threshold
108.76 ns
(+4.11%)Baseline: 104.47 ns
139.02 ns
(78.23%)
Command_Serde/pack/set📈 view plot
🚷 view threshold
198.64 ns
(+5.33%)Baseline: 188.59 ns
250.48 ns
(79.31%)
Command_Serde/pack/set_index📈 view plot
🚷 view threshold
108.49 ns
(+3.86%)Baseline: 104.45 ns
139.25 ns
(77.91%)
Command_Serde/unpack/delete📈 view plot
🚷 view threshold
191.11 ns
(+4.23%)Baseline: 183.36 ns
265.09 ns
(72.09%)
Command_Serde/unpack/delete_index📈 view plot
🚷 view threshold
157.33 ns
(+2.39%)Baseline: 153.65 ns
216.19 ns
(72.77%)
Command_Serde/unpack/set📈 view plot
🚷 view threshold
275.34 ns
(+7.69%)Baseline: 255.67 ns
349.43 ns
(78.80%)
Command_Serde/unpack/set_index📈 view plot
🚷 view threshold
156.16 ns
(+3.63%)Baseline: 150.70 ns
210.88 ns
(74.05%)
Payload_encryption/pack/remove_cmd📈 view plot
🚷 view threshold
128.49 ns
(+15.09%)Baseline: 111.64 ns
148.80 ns
(86.35%)
Payload_encryption/pack/set_cmd📈 view plot
🚷 view threshold
245.50 ns
(+26.05%)Baseline: 194.77 ns
266.25 ns
(92.20%)
Payload_encryption/unpack/remove_cmd📈 view plot
🚷 view threshold
219.84 ns
(+14.63%)Baseline: 191.79 ns
278.83 ns
(78.84%)
Payload_encryption/unpack/set_cmd📈 view plot
🚷 view threshold
317.95 ns
(+18.73%)Baseline: 267.79 ns
372.86 ns
(85.27%)
Raft_1Node_Latency/prefix/1node📈 view plot
🚷 view threshold
2,476,400.00 ns
(-7.64%)Baseline: 2,681,155.62 ns
6,698,273.97 ns
(36.97%)
Raft_1Node_Latency/read/1node📈 view plot
🚷 view threshold
42,077.00 ns
(+11.84%)Baseline: 37,622.83 ns
53,595.65 ns
(78.51%)
Raft_1Node_Latency/remove/1node📈 view plot
🚷 view threshold
368,800.00 ns
(-57.18%)Baseline: 861,366.72 ns
4,178,387.79 ns
(8.83%)
Raft_1Node_Latency/write/1node📈 view plot
🚷 view threshold
384,740.00 ns
(-61.04%)Baseline: 987,527.81 ns
5,501,799.50 ns
(6.99%)
build_snapshot/default📈 view plot
🚷 view threshold
112,920.00 ns
(-10.45%)Baseline: 126,101.94 ns
221,633.95 ns
(50.95%)
fernet token/project📈 view plot
🚷 view threshold
1,493.90 ns
(+6.33%)Baseline: 1,404.94 ns
1,794.34 ns
(83.26%)
get_data_keyspace📈 view plot
🚷 view threshold
0.31 ns
(-0.49%)Baseline: 0.31 ns
0.39 ns
(80.48%)
get_db📈 view plot
🚷 view threshold
0.31 ns
(-0.66%)Baseline: 0.31 ns
0.39 ns
(80.46%)
get_fernet_token_timestamp/project📈 view plot
🚷 view threshold
134.49 ns
(-2.90%)Baseline: 138.51 ns
179.09 ns
(75.10%)
get_keyspace📈 view plot
🚷 view threshold
4.26 ns
(-28.79%)Baseline: 5.98 ns
13.92 ns
(30.59%)
🐰 View full continuous benchmarking report in Bencher

Merged via the queue into main with commit 92a8451 Jul 30, 2026
37 checks passed
ShJ-code added a commit to ShJ-code/keystone that referenced this pull request Jul 31, 2026
`batched_fetch` cast its `&Cell<usize>` argument to a `*const` and
dereferenced it inside the returned closure, to escape a borrow lifetime
that the `impl FnMut` return type cannot name. Its comment called this
"SAFETY-free", which it was not: nothing tied the pointer's validity to
the closure. It held only by the convention that every caller happened
to keep the counter alive on its own stack frame for at least as long.

Share the counter through `Rc<Cell<usize>>` instead. The returned
closure owns its handle, the lifetime problem disappears with it, and
both `unsafe` blocks go away without changing what any test asserts.

The block compiled for as long as it did because the keystone crate had
no `[lints] workspace = true`, so the workspace's
`unsafe_code = "forbid"` never reached it. Rebasing this branch onto
main picked up openstack-experimental#1120, which added that stanza, turning the pre-existing
block into a hard error on the lib test target -- hence a CI failure on
a line this branch had not otherwise touched since it was written.

No production code is affected; `batched_fetch` is a test-only helper
for the `collect_authorized_page` refill tests.

Signed-off-by: ShJ-code <sihao_jiang@outlook.com>
@gtema
gtema deleted the clippy branch July 31, 2026 07:24
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