[go: up one dir, main page]

Use parent strategy for associations in factories

Problem

After upgrading to FactoryBot 5.1.0 in !17941 (merged) we had to disable the parent strategy from being used via FactoryBot.use_parent_strategy = false (see https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#build-strategies-1).

It seems (see CI failures in !40274 (merged)) we cannot enable the parent strategy easily. Enabling this feature might safe us some SQL queries (see https://gitlab.com/gitlab-org/plan/-/issues/145), however.

Solution

Let FactoryBot's associations to use the same build strategy for their parent object by removing the above mentioned configuration FactoryBot.use_parent_strategy = false.

Fix all failing specs.

Example

When with parent strategy used running spec/models/project_spec.rb safes us 1248 SQL queries:

Before

Total time: 01:51.476 of 04:32.996 (40.83%)
Total events: 76360

Top 5 slowest suites (by time):

Project (./spec/models/project_spec.rb:5) – 01:51.476 (76360 / 1015) of 04:32.996 (40.83%)



Finished in 4 minutes 40 seconds (files took 2.49 seconds to load)
1015 examples, 0 failures

[TEST PROF INFO] Factories usage

 Total: 2528
 Total top-level: 1587
 Total time: 176.6419s
 Total uniq factories: 67

   total   top-level     total time      time per call      top-level time               name

     760         724      139.4697s            0.1835s           132.4266s            project
     670          92       30.1227s            0.0450s             4.1564s          namespace
     474         266       22.9360s            0.0484s            12.4376s               user
     131         127        4.0226s            0.0307s             3.8843s              group
      56           0        0.8467s            0.0151s             0.0000s    ci_job_artifact
      43          42        1.1256s            0.0262s             1.0862s        ci_pipeline
      29          28        1.8591s            0.0641s             1.8290s           ci_build
      27          27        0.2849s            0.0106s             0.2849s        ci_variable
      27          27        3.3212s            0.1230s             3.3212s      merge_request
      16          16        0.1223s            0.0076s             0.1223s         lfs_object
      16          16        0.5053s            0.0316s             0.5053s     note_on_commit
      15          15        3.1873s            0.2125s             3.1873s     project_member
      14          10        1.2857s            0.0918s             1.0461s            cluster
      13          13        0.3592s            0.0276s             0.3592s          ci_runner
      12          12        0.0854s            0.0071s             0.0854s lfs_objects_project
      12          12        0.4965s            0.0414s             0.4965s              issue
      11           0        0.2767s            0.0252s             0.0000s       package_file
      11          10        0.3746s            0.0341s             0.1429s        environment
      10           0        0.1617s            0.0162s             0.0000s conan_package_file
      10           0        0.0536s            0.0054s             0.0000s conan_file_metadatum
       9           9        0.1130s            0.0126s             0.1130s  ci_empty_pipeline
       9           3        1.8141s            0.2016s             0.7068s              label
       9           9        0.0985s            0.0109s             0.0985s project_auto_devops
       8           8        0.0449s            0.0056s             0.0449s             upload
       8           8        0.4664s            0.0583s             0.4664s project_export_job
       7           7        0.1490s            0.0213s             0.1490s       deploy_token
       6           6        1.1545s            0.1924s             1.1545s  jira_import_state
       6           6        0.1285s            0.0214s             0.1285s   protected_branch
       6           6        0.1466s            0.0244s             0.1466s prometheus_service
       5           5        0.1456s            0.0291s             0.1456s            service
       5           5        0.0353s            0.0071s             0.0353s       import_state
       5           5        0.0837s            0.0167s             0.0837s        group_badge
       5           5        0.3230s            0.0646s             0.3230s          chat_name
       4           0        0.1350s            0.0338s             0.0000s issue_tracker_data
       4           4        0.0356s            0.0089s             0.0356s project_repository
       4           4        0.0143s            0.0036s             0.0143s              shard
       4           4        0.3025s            0.0756s             0.3025s cluster_platform_kubernetes
       4           4        0.2648s            0.0662s             0.2648s ci_instance_variable
       4           4        0.0353s            0.0088s             0.0353s deploy_keys_project
       4           4        1.4899s            0.3725s             1.4899s       project_hook
       4           4        0.2093s            0.0523s             0.2093s      project_badge
       3           3        1.1529s            0.3843s             1.1529s    redmine_project
       3           0        0.7231s            0.2410s             0.0000s    redmine_service
       3           3        0.0196s            0.0065s             0.0196s service_desk_setting
       3           3        0.3990s            0.1330s             0.3990s         deploy_key
       3           3        0.1648s            0.0549s             0.1648s        npm_package
       2           2        0.5879s            0.2939s             0.5879s      maven_package
       2           0        0.4602s            0.2301s             0.0000s    maven_metadatum
       2           0        0.4430s            0.2215s             0.0000s            package
       2           2        0.0549s            0.0274s             0.0549s        npm_package
       2           2        0.5066s            0.2533s             0.5066s      conan_package
       2           0        0.3285s            0.1643s             0.0000s    conan_metadatum
       2           0        0.3145s            0.1573s             0.0000s      conan_package
       2           2        0.0864s            0.0432s             0.0864s              event
       2           2        0.4551s            0.2276s             0.4551s prometheus_project
       2           2        0.0449s            0.0224s             0.0449s      protected_tag
       2           2        0.2570s            0.1285s             0.2570s project_empty_repo
       2           2        0.0257s            0.0128s             0.0257s        system_hook
       2           2        0.3627s            0.1813s             0.3627s      slack_service
       2           2        0.4686s            0.2343s             0.4686s    pool_repository
       2           2        0.0640s            0.0320s             0.0640s     alerts_service
       1           1        0.0065s            0.0065s             0.0065s            license
       1           1        0.0698s            0.0698s             0.0698s container_expiration_policy
       1           1        0.0127s            0.0127s             0.0127s container_repository
       1           1        0.0637s            0.0637s             0.0637s      lfs_file_lock
       1           1        0.0780s            0.0780s             0.0780s custom_issue_tracker_service
       1           1        0.4425s            0.4425s             0.4425s         deployment

After

Total time: 01:35.251 of 03:56.954 (40.2%)
Total events: 75112

Top 5 slowest suites (by time):

Project (./spec/models/project_spec.rb:5) – 01:35.251 (75112 / 1015) of 03:56.954 (40.2%)



Finished in 4 minutes 3.7 seconds (files took 40.23 seconds to load)
1015 examples, 0 failures

[TEST PROF INFO] Factories usage

 Total: 2444
 Total top-level: 1509
 Total time: 153.3869s
 Total uniq factories: 67

   total   top-level     total time      time per call      top-level time               name

     757         724      123.1303s            0.1627s           116.6218s            project
     592          17       25.5532s            0.0432s             0.9548s          namespace
     474         266       18.2324s            0.0385s             9.9789s               user
     131         127        3.8661s            0.0295s             3.7637s              group
      56           0        0.6584s            0.0118s             0.0000s    ci_job_artifact
      43          42        1.1878s            0.0276s             1.1602s        ci_pipeline
      29          28        1.6175s            0.0558s             1.5906s           ci_build
      27          27        0.2021s            0.0075s             0.2021s        ci_variable
      27          27        2.6921s            0.0997s             2.6921s      merge_request
      16          16        0.1191s            0.0074s             0.1191s         lfs_object
      16          16        0.5110s            0.0319s             0.5110s     note_on_commit
      15          15        3.4957s            0.2330s             3.4957s     project_member
      14          10        0.8507s            0.0608s             0.6969s            cluster
      13          13        0.3013s            0.0232s             0.3013s          ci_runner
      12          12        0.0876s            0.0073s             0.0876s lfs_objects_project
      12          12        0.6393s            0.0533s             0.6393s              issue
      11           0        0.2766s            0.0251s             0.0000s       package_file
      11          10        0.5303s            0.0482s             0.1257s        environment
      10           0        0.1929s            0.0193s             0.0000s conan_package_file
      10           0        0.0637s            0.0064s             0.0000s conan_file_metadatum
       9           9        0.1176s            0.0131s             0.1176s  ci_empty_pipeline
       9           9        0.0941s            0.0105s             0.0941s project_auto_devops
       8           8        0.0338s            0.0042s             0.0338s             upload
       8           8        0.8272s            0.1034s             0.8272s project_export_job
       7           7        0.1437s            0.0205s             0.1437s       deploy_token
       6           6        1.1097s            0.1850s             1.1097s  jira_import_state
       6           0        1.0651s            0.1775s             0.0000s              label
       6           6        0.1146s            0.0191s             0.1146s   protected_branch
       6           6        0.2975s            0.0496s             0.2975s prometheus_service
       5           5        0.0761s            0.0152s             0.0761s            service
       5           5        0.0300s            0.0060s             0.0300s       import_state
       5           5        0.0747s            0.0149s             0.0747s        group_badge
       5           5        0.2916s            0.0583s             0.2916s          chat_name
       4           0        0.1802s            0.0451s             0.0000s issue_tracker_data
       4           4        0.0371s            0.0093s             0.0371s project_repository
       4           4        0.0137s            0.0034s             0.0137s              shard
       4           4        0.2928s            0.0732s             0.2928s cluster_platform_kubernetes
       4           4        0.0819s            0.0205s             0.0819s ci_instance_variable
       4           4        0.0271s            0.0068s             0.0271s deploy_keys_project
       4           4        0.6592s            0.1648s             0.6592s       project_hook
       4           4        0.0715s            0.0179s             0.0715s      project_badge
       3           3        1.5483s            0.5161s             1.5483s    redmine_project
       3           0        0.9638s            0.3213s             0.0000s    redmine_service
       3           3        0.0172s            0.0057s             0.0172s service_desk_setting
       3           3        0.2352s            0.0784s             0.2352s         deploy_key
       3           3        0.0531s            0.0177s             0.0531s        npm_package
       2           2        0.5448s            0.2724s             0.5448s      maven_package
       2           0        0.3117s            0.1559s             0.0000s    maven_metadatum
       2           0        0.2937s            0.1468s             0.0000s            package
       2           2        0.0651s            0.0325s             0.0651s        npm_package
       2           2        0.6669s            0.3335s             0.6669s      conan_package
       2           0        0.4578s            0.2289s             0.0000s    conan_metadatum
       2           0        0.4441s            0.2221s             0.0000s      conan_package
       2           2        0.1058s            0.0529s             0.1058s              event
       2           2        0.3469s            0.1735s             0.3469s prometheus_project
       2           2        0.0374s            0.0187s             0.0374s      protected_tag
       2           2        0.4056s            0.2028s             0.4056s project_empty_repo
       2           2        0.0341s            0.0170s             0.0341s        system_hook
       2           2        0.6578s            0.3289s             0.6578s      slack_service
       2           2        0.5578s            0.2789s             0.5578s    pool_repository
       2           2        0.0565s            0.0283s             0.0565s     alerts_service
       1           1        0.0062s            0.0062s             0.0062s            license
       1           1        0.0986s            0.0986s             0.0986s container_expiration_policy
       1           1        0.0101s            0.0101s             0.0101s container_repository
       1           1        0.0488s            0.0488s             0.0488s      lfs_file_lock
       1           1        0.0722s            0.0722s             0.0722s custom_issue_tracker_service
       1           1        0.4835s            0.4835s             0.4835s         deployment

List of commits to be cherry-picked

List of commits from !40274 (merged) with fixes to each spec affected by these changes. They should be split into individual MRs.

Edited by Eugenia Grieff