Support CS components in PossiblyAffectedOccurrencesFinder
What does this MR do and why?
This MR adds the ability to filter Sbom::Occurrence
records based on the purl_type
and source_package_name
to the Sbom::PossiblyAffectedOccurrencesFinder#execute_in_batches method.
This allows us to use the new sbom_source_packages.name
column added by Add sbom_source_packages table (!140539 - merged) • Adam Cohen • 16.8 so that we can support finding possibly affected Container Scanning components.
Query plans
Both of the following query plans were generated as follows:
-
Connect to the production read-only DB using teleport
-
Open up a rails console and enable sql log output from activerecord queries:
ActiveRecord::Base.logger = Logger.new(STDOUT)`
-
Find the package with the highest number of
sbom_occurrences
by opening up apsql
session against the production read-only DB:SELECT ssp.id, ssp.name, count(*) FROM sbom_source_packages ssp, sbom_occurrences so WHERE so.source_package_id = ssp.id GROUP BY ssp.id, ssp.name ORDER BY count(*) DESC LIMIT 1; id | name | purl_type | count ------+------------+-----------+------- 6 | util-linux | 11 | 7838
-
Use execute_in_batches against the
util-linux
package which has the highest number ofsbom_occurrences
, and output all associations inside the batch:batch_num = 1 Sbom::PossiblyAffectedOccurrencesFinder.new(package_name: 'util-linux', purl_type: 'deb').execute_in_batches(of: 100) do |batch| puts "Batch #{batch_num} " batch.each_with_index do |sbom_occurrence, idx| puts " Record #{idx+1}" possibly_affected_component = Gitlab::VulnerabilityScanning::PossiblyAffectedComponent.from_sbom_occurrence(sbom_occurrence) possibly_affected_component.name possibly_affected_component.version possibly_affected_component.purl_type possibly_affected_component.source possibly_affected_component.pipeline possibly_affected_component.project end batch_num += 1 break if batch_num == 3 end
-
Record the set of
SELECT
statements from the first batch of queries in the rails console and execute them in https://console.postgres.ai/gitlab.
Query plans when sbom_source_packages
table was empty
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/25290/commands/80317
Click to expand
SELECT "sbom_source_packages"."id" FROM "sbom_source_packages" WHERE "sbom_source_packages"."name" = 'perl' AND "sbom_source_packages"."purl_type" = 11 ORDER BY "sbom_source_packages"."id" ASC LIMIT 1
Time: 0.704 ms - planning: 0.607 ms - execution: 0.097 ms - I/O read: 0.000 ms - I/O write: 0.000 ms Shared buffers: - hits: 3 (~24.00 KiB) from the buffer pool - reads: 0 from the OS file cache, including disk I/O - dirtied: 0 - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/25290/commands/80318
Click to expand
SELECT "sbom_occurrences"."id" FROM "sbom_occurrences" WHERE "sbom_occurrences"."source_package_id" = 1 ORDER BY "sbom_occurrences"."id" ASC LIMIT 1
Time: 8.976 ms - planning: 2.334 ms - execution: 6.642 ms - I/O read: 6.478 ms - I/O write: 0.000 ms Shared buffers: - hits: 3 (~24.00 KiB) from the buffer pool - reads: 4 (~32.00 KiB) from the OS file cache, including disk I/O - dirtied: 0 - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/25290/commands/80319
Click to expand
SELECT "sbom_occurrences"."id" FROM "sbom_occurrences" WHERE "sbom_occurrences"."source_package_id" = 1 AND "sbom_occurrences"."id" >= 6 ORDER BY "sbom_occurrences"."id" ASC LIMIT 1 OFFSET 100
Time: 2.465 ms - planning: 2.374 ms - execution: 0.091 ms - I/O read: 0.000 ms - I/O write: 0.000 ms Shared buffers: - hits: 7 (~56.00 KiB) from the buffer pool - reads: 0 from the OS file cache, including disk I/O - dirtied: 0 - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/25290/commands/80320
Click to expand
SELECT "sbom_occurrences"."id", "sbom_occurrences"."created_at", "sbom_occurrences"."updated_at", "sbom_occurrences"."component_version_id", "sbom_occurrences"."project_id", "sbom_occurrences"."pipeline_id", "sbom_occurrences"."source_id", "sbom_occurrences"."commit_sha", "sbom_occurrences"."component_id", "sbom_occurrences"."uuid", "sbom_occurrences"."package_manager", "sbom_occurrences"."component_name", "sbom_occurrences"."input_file_path", "sbom_occurrences"."licenses", "sbom_occurrences"."highest_severity", "sbom_occurrences"."vulnerability_count", "sbom_occurrences"."source_package_id" FROM "sbom_occurrences" WHERE "sbom_occurrences"."source_package_id" = 1 AND "sbom_occurrences"."id" >= 6 AND "sbom_occurrences"."component_version_id" IS NOT NULL
Time: 3.027 ms - planning: 2.904 ms - execution: 0.123 ms - I/O read: 0.000 ms - I/O write: 0.000 ms Shared buffers: - hits: 7 (~56.00 KiB) from the buffer pool - reads: 0 from the OS file cache, including disk I/O - dirtied: 0 - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/25290/commands/80321
Click to expand
SELECT "ci_pipelines"."id", "ci_pipelines"."ref", "ci_pipelines"."sha", "ci_pipelines"."before_sha", "ci_pipelines"."created_at", "ci_pipelines"."updated_at", "ci_pipelines"."tag", "ci_pipelines"."yaml_errors", "ci_pipelines"."committed_at", "ci_pipelines"."project_id", "ci_pipelines"."status", "ci_pipelines"."started_at", "ci_pipelines"."finished_at", "ci_pipelines"."duration", "ci_pipelines"."user_id", "ci_pipelines"."lock_version", "ci_pipelines"."pipeline_schedule_id", "ci_pipelines"."source", "ci_pipelines"."config_source", "ci_pipelines"."protected", "ci_pipelines"."failure_reason", "ci_pipelines"."iid", "ci_pipelines"."merge_request_id", "ci_pipelines"."source_sha", "ci_pipelines"."target_sha", "ci_pipelines"."external_pull_request_id", "ci_pipelines"."ci_ref_id", "ci_pipelines"."locked", "ci_pipelines"."partition_id", "ci_pipelines"."auto_canceled_by_id" FROM "ci_pipelines" WHERE "ci_pipelines"."id" IN (6, 8, 10)
Time: 3.189 ms - planning: 3.121 ms - execution: 0.068 ms - I/O read: 0.000 ms - I/O write: 0.000 ms Shared buffers: - hits: 0 from the buffer pool - reads: 0 from the OS file cache, including disk I/O - dirtied: 0 - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/25290/commands/80322
Click to expand
SELECT "sbom_components".* FROM "sbom_components" WHERE "sbom_components"."id" IN (6, 9, 11)
Time: 11.978 ms - planning: 1.337 ms - execution: 10.641 ms - I/O read: 10.445 ms - I/O write: 0.000 ms Shared buffers: - hits: 9 (~72.00 KiB) from the buffer pool - reads: 4 (~32.00 KiB) from the OS file cache, including disk I/O - dirtied: 0 - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/25290/commands/80323
Click to expand
SELECT "sbom_sources".* FROM "sbom_sources" WHERE "sbom_sources"."id" IN (6, 8, 10)
Time: 21.176 ms - planning: 1.473 ms - execution: 19.703 ms - I/O read: 19.479 ms - I/O write: 0.000 ms Shared buffers: - hits: 6 (~48.00 KiB) from the buffer pool - reads: 4 (~32.00 KiB) from the OS file cache, including disk I/O - dirtied: 1 (~8.00 KiB) - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/25290/commands/80324
Click to expand
SELECT "sbom_component_versions".* FROM "sbom_component_versions" WHERE "sbom_component_versions"."id" IN (4, 6, 8)
Time: 6.760 ms - planning: 1.350 ms - execution: 5.410 ms - I/O read: 5.232 ms - I/O write: 0.000 ms Shared buffers: - hits: 9 (~72.00 KiB) from the buffer pool - reads: 4 (~32.00 KiB) from the OS file cache, including disk I/O - dirtied: 0 - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/25290/commands/80325
Click to expand
SELECT "projects"."id", "projects"."name", "projects"."path", "projects"."description", "projects"."created_at", "projects"."updated_at", "projects"."creator_id", "projects"."namespace_id", "projects"."last_activity_at", "projects"."import_url", "projects"."visibility_level", "projects"."archived", "projects"."avatar", "projects"."merge_requests_template", "projects"."star_count", "projects"."merge_requests_rebase_enabled", "projects"."import_type", "projects"."import_source", "projects"."approvals_before_merge", "projects"."reset_approvals_on_push", "projects"."merge_requests_ff_only_enabled", "projects"."issues_template", "projects"."mirror", "projects"."mirror_last_update_at", "projects"."mirror_last_successful_update_at", "projects"."mirror_user_id", "projects"."shared_runners_enabled", "projects"."runners_token", "projects"."build_allow_git_fetch", "projects"."build_timeout", "projects"."mirror_trigger_builds", "projects"."pending_delete", "projects"."public_builds", "projects"."last_repository_check_failed", "projects"."last_repository_check_at", "projects"."only_allow_merge_if_pipeline_succeeds", "projects"."has_external_issue_tracker", "projects"."repository_storage", "projects"."repository_read_only", "projects"."request_access_enabled", "projects"."has_external_wiki", "projects"."ci_config_path", "projects"."lfs_enabled", "projects"."description_html", "projects"."only_allow_merge_if_all_discussions_are_resolved", "projects"."repository_size_limit", "projects"."printing_merge_request_link_enabled", "projects"."auto_cancel_pending_pipelines", "projects"."service_desk_enabled", "projects"."cached_markdown_version", "projects"."delete_error", "projects"."last_repository_updated_at", "projects"."disable_overriding_approvers_per_merge_request", "projects"."storage_version", "projects"."resolve_outdated_diff_discussions", "projects"."remote_mirror_available_overridden", "projects"."only_mirror_protected_branches", "projects"."pull_mirror_available_overridden", "projects"."jobs_cache_index", "projects"."external_authorization_classification_label", "projects"."mirror_overwrites_diverged_branches", "projects"."pages_https_only", "projects"."external_webhook_token", "projects"."packages_enabled", "projects"."merge_requests_author_approval", "projects"."pool_repository_id", "projects"."runners_token_encrypted", "projects"."bfg_object_map", "projects"."detected_repository_languages", "projects"."merge_requests_disable_committers_approval", "projects"."require_password_to_approve", "projects"."max_pages_size", "projects"."max_artifacts_size", "projects"."pull_mirror_branch_prefix", "projects"."remove_source_branch_after_merge", "projects"."marked_for_deletion_at", "projects"."marked_for_deletion_by_user_id", "projects"."autoclose_referenced_issues", "projects"."suggestion_commit_message", "projects"."project_namespace_id", "projects"."hidden", "projects"."organization_id" FROM "projects" WHERE "projects"."id" = 1
Time: 15.348 ms - planning: 7.831 ms - execution: 7.517 ms - I/O read: 7.308 ms - I/O write: 0.000 ms Shared buffers: - hits: 0 from the buffer pool - reads: 5 (~40.00 KiB) from the OS file cache, including disk I/O - dirtied: 0 - writes: 0
Note: since Ingest source package name from Trivy SBOM comp... (#427095 - closed) • Tetiana Chupryna • 16.9 • On track has not yet been completed, the sbom_source_packages
table does not contain any entries, so the actual performance will be different once this table contains thousands of rows. Having said that, since the code introduced by this MR is essentially the same as Add PossiblyAffectedOccurrencesFinder class (!128941 - merged) • Adam Cohen • 16.4, the performance should be the same.
Query plans now that sbom_source_packages
table has been populated
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/26021/commands/81919
Click to expand
SELECT "sbom_source_packages"."id" FROM "sbom_source_packages" WHERE "sbom_source_packages"."name" = 'util-linux' AND "sbom_source_packages"."purl_type" = 11 ORDER BY "sbom_source_packages"."id" ASC LIMIT 1
Time: 8.741 ms - planning: 0.885 ms - execution: 7.856 ms - I/O read: 7.632 ms - I/O write: 0.000 ms Shared buffers: - hits: 6 (~48.00 KiB) from the buffer pool - reads: 3 (~24.00 KiB) from the OS file cache, including disk I/O - dirtied: 1 (~8.00 KiB) - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/26021/commands/81920
Click to expand
SELECT "sbom_occurrences"."id" FROM "sbom_occurrences" WHERE "sbom_occurrences"."source_package_id" = 6 ORDER BY "sbom_occurrences"."id" ASC LIMIT 1
Time: 34.081 ms - planning: 2.293 ms - execution: 31.788 ms - I/O read: 31.548 ms - I/O write: 0.000 ms Shared buffers: - hits: 3 (~24.00 KiB) from the buffer pool - reads: 5 (~40.00 KiB) from the OS file cache, including disk I/O - dirtied: 0 - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/26021/commands/81921
Click to expand
SELECT "sbom_occurrences"."id" FROM "sbom_occurrences" WHERE "sbom_occurrences"."source_package_id" = 6 AND "sbom_occurrences"."id" >= 2640813729 ORDER BY "sbom_occurrences"."id" ASC LIMIT 1 OFFSET 100
Time: 114.948 ms - planning: 2.748 ms - execution: 112.200 ms - I/O read: 107.904 ms - I/O write: 0.000 ms Shared buffers: - hits: 53 (~424.00 KiB) from the buffer pool - reads: 21 (~168.00 KiB) from the OS file cache, including disk I/O - dirtied: 6 (~48.00 KiB) - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/26021/commands/81922
Click to expand
SELECT "sbom_occurrences"."id" FROM "sbom_occurrences" WHERE "sbom_occurrences"."source_package_id" = 6 AND "sbom_occurrences"."id" >= 2640813729 ORDER BY "sbom_occurrences"."id" ASC LIMIT 1 OFFSET 100
Time: 2.569 ms - planning: 2.377 ms - execution: 0.192 ms - I/O read: 0.000 ms - I/O write: 0.000 ms Shared buffers: - hits: 74 (~592.00 KiB) from the buffer pool - reads: 0 from the OS file cache, including disk I/O - dirtied: 0 - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/26021/commands/81923
Click to expand
SELECT "sbom_occurrences"."id", "sbom_occurrences"."created_at", "sbom_occurrences"."updated_at", "sbom_occurrences"."component_version_id", "sbom_occurrences"."project_id", "sbom_occurrences"."pipeline_id", "sbom_occurrences"."source_id", "sbom_occurrences"."commit_sha", "sbom_occurrences"."component_id", "sbom_occurrences"."uuid", "sbom_occurrences"."package_manager", "sbom_occurrences"."component_name", "sbom_occurrences"."input_file_path", "sbom_occurrences"."licenses", "sbom_occurrences"."highest_severity", "sbom_occurrences"."vulnerability_count", "sbom_occurrences"."source_package_id", "sbom_occurrences"."archived", "sbom_occurrences"."traversal_ids" FROM "sbom_occurrences" WHERE "sbom_occurrences"."source_package_id" = 6 AND "sbom_occurrences"."id" >= 2640813729 AND "sbom_occurrences"."id" < 3220948096 AND "sbom_occurrences"."component_version_id" IS NOT NULL
Time: 387.241 ms - planning: 3.078 ms - execution: 384.163 ms - I/O read: 382.164 ms - I/O write: 0.000 ms Shared buffers: - hits: 14 (~112.00 KiB) from the buffer pool - reads: 93 (~744.00 KiB) from the OS file cache, including disk I/O - dirtied: 1 (~8.00 KiB) - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/26021/commands/81924
Click to expand
SELECT "ci_pipelines"."id", "ci_pipelines"."ref", "ci_pipelines"."sha", "ci_pipelines"."before_sha", "ci_pipelines"."created_at", "ci_pipelines"."updated_at", "ci_pipelines"."tag", "ci_pipelines"."yaml_errors", "ci_pipelines"."committed_at", "ci_pipelines"."project_id", "ci_pipelines"."status", "ci_pipelines"."started_at", "ci_pipelines"."finished_at", "ci_pipelines"."duration", "ci_pipelines"."user_id", "ci_pipelines"."lock_version", "ci_pipelines"."pipeline_schedule_id", "ci_pipelines"."source", "ci_pipelines"."protected", "ci_pipelines"."config_source", "ci_pipelines"."failure_reason", "ci_pipelines"."iid", "ci_pipelines"."merge_request_id", "ci_pipelines"."source_sha", "ci_pipelines"."target_sha", "ci_pipelines"."external_pull_request_id", "ci_pipelines"."ci_ref_id", "ci_pipelines"."locked", "ci_pipelines"."partition_id", "ci_pipelines"."auto_canceled_by_id" FROM "ci_pipelines" WHERE "ci_pipelines"."id" IN (1160546745, 1164863707, 1163778390, 1165715976, 1165719595, 1165800645, 1165801000, 1165800410, 1165800803, 1165800811, 1165800588, 1165800916, 1165800841, 1165800827 )
Time: 2.851 ms - planning: 2.792 ms - execution: 0.059 ms - I/O read: 0.000 ms - I/O write: 0.000 ms Shared buffers: - hits: 0 from the buffer pool - reads: 0 from the OS file cache, including disk I/O - dirtied: 0 - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/26021/commands/81925
Click to expand
SELECT "sbom_components".* FROM "sbom_components" WHERE "sbom_components"."id" IN (2020272554, 2020272567, 2020272577, 2020272589, 2020272604, 2020272614, 2020272618, 2020272630, 2020272544, 2153538141, 2153906403, 2153538184, 2153906597, 2153538235, 2153538268, 2153538283, 2153538296, 2153538326 )
Time: 60.946 ms - planning: 1.394 ms - execution: 59.552 ms - I/O read: 58.932 ms - I/O write: 0.000 ms Shared buffers: - hits: 46 (~368.00 KiB) from the buffer pool - reads: 29 (~232.00 KiB) from the OS file cache, including disk I/O - dirtied: 14 (~112.00 KiB) - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/26021/commands/81926
Click to expand
SELECT "sbom_sources".* FROM "sbom_sources" WHERE "sbom_sources"."id" IN (86309855, 86311938, 86352907, 86352931, 86353001, 86352908, 86353043, 86353076, 86353095, 86353102, 86353140 )
Time: 36.604 ms - planning: 1.579 ms - execution: 35.025 ms - I/O read: 34.461 ms - I/O write: 0.000 ms Shared buffers: - hits: 22 (~176.00 KiB) from the buffer pool - reads: 14 (~112.00 KiB) from the OS file cache, including disk I/O - dirtied: 7 (~56.00 KiB) - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/26021/commands/81927
Click to expand
SELECT "sbom_component_versions".* FROM "sbom_component_versions" WHERE "sbom_component_versions"."id" IN (2325784353, 2325784366, 2325784376, 2325784388, 2325784403, 2325784413, 2325784417, 2325784429, 2378309424, 2378309446, 2378309471, 2378309486, 2378309497, 2378309504, 2378309513, 3220388355, 2481449429, 2481449553, 2481449632, 2481449785, 2481449847, 2481449867, 2481449908, 2481449960, 3220955759, 3220957138, 3220501598, 2490119982, 2490120029, 2490120126, 2490120189, 2490120215, 2490120265, 2490120302 )
Time: 79.408 ms - planning: 2.121 ms - execution: 77.287 ms - I/O read: 74.225 ms - I/O write: 0.000 ms Shared buffers: - hits: 92 (~736.00 KiB) from the buffer pool - reads: 47 (~376.00 KiB) from the OS file cache, including disk I/O - dirtied: 8 (~64.00 KiB) - writes: 0
-
https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/26021/commands/81928
Click to expand
SELECT "projects"."id", "projects"."name", "projects"."path", "projects"."description", "projects"."created_at", "projects"."updated_at", "projects"."creator_id", "projects"."namespace_id", "projects"."last_activity_at", "projects"."import_url", "projects"."visibility_level", "projects"."archived", "projects"."merge_requests_template", "projects"."star_count", "projects"."merge_requests_rebase_enabled", "projects"."import_type", "projects"."import_source", "projects"."avatar", "projects"."approvals_before_merge", "projects"."reset_approvals_on_push", "projects"."merge_requests_ff_only_enabled", "projects"."issues_template", "projects"."mirror", "projects"."mirror_last_update_at", "projects"."mirror_last_successful_update_at", "projects"."mirror_user_id", "projects"."shared_runners_enabled", "projects"."runners_token", "projects"."build_allow_git_fetch", "projects"."build_timeout", "projects"."mirror_trigger_builds", "projects"."public_builds", "projects"."pending_delete", "projects"."last_repository_check_failed", "projects"."last_repository_check_at", "projects"."only_allow_merge_if_pipeline_succeeds", "projects"."has_external_issue_tracker", "projects"."repository_storage", "projects"."request_access_enabled", "projects"."has_external_wiki", "projects"."repository_read_only", "projects"."lfs_enabled", "projects"."description_html", "projects"."only_allow_merge_if_all_discussions_are_resolved", "projects"."repository_size_limit", "projects"."service_desk_enabled", "projects"."printing_merge_request_link_enabled", "projects"."auto_cancel_pending_pipelines", "projects"."cached_markdown_version", "projects"."last_repository_updated_at", "projects"."ci_config_path", "projects"."disable_overriding_approvers_per_merge_request", "projects"."delete_error", "projects"."storage_version", "projects"."resolve_outdated_diff_discussions", "projects"."remote_mirror_available_overridden", "projects"."only_mirror_protected_branches", "projects"."pull_mirror_available_overridden", "projects"."jobs_cache_index", "projects"."external_authorization_classification_label", "projects"."mirror_overwrites_diverged_branches", "projects"."external_webhook_token", "projects"."pages_https_only", "projects"."packages_enabled", "projects"."merge_requests_author_approval", "projects"."pool_repository_id", "projects"."runners_token_encrypted", "projects"."bfg_object_map", "projects"."detected_repository_languages", "projects"."merge_requests_disable_committers_approval", "projects"."require_password_to_approve", "projects"."max_pages_size", "projects"."max_artifacts_size", "projects"."pull_mirror_branch_prefix", "projects"."remove_source_branch_after_merge", "projects"."marked_for_deletion_at", "projects"."marked_for_deletion_by_user_id", "projects"."suggestion_commit_message", "projects"."autoclose_referenced_issues", "projects"."project_namespace_id", "projects"."hidden", "projects"."organization_id" FROM "projects" WHERE "projects"."id" IN (48478575, 40664079, 48475463, 21810599, 45887002, 47498572, 47498580, 47498578, 47498582, 47498576, 47498574, 47498577, 47498579, 47498581 )
Time: 105.457 ms - planning: 6.754 ms - execution: 98.703 ms - I/O read: 97.163 ms - I/O write: 0.000 ms Shared buffers: - hits: 45 (~360.00 KiB) from the buffer pool - reads: 28 (~224.00 KiB) from the OS file cache, including disk I/O - dirtied: 0 - writes: 0
MR acceptance checklist
This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.
-
I have evaluated the MR acceptance checklist for this MR.
Related to Update PossiblyAffectedOccurrencesFinder to wor... (#428681 - closed) • Adam Cohen • 16.9 • On track