[RUN AS-IF-FOSS] Use parent strategy for associations in factories
What does this MR do?
This MR lets FactoryBot's associations to use the same build strategy for their parent object.
This potentially saves SQL queries when using build(...)
.
spec/models/project_spec.rb
Example Queries saved: 1248
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
Does this MR meet the acceptance criteria?
Conformity
- [-] Changelog entry
- [-] Documentation (if required)
-
Code review guidelines -
Merge request performance guidelines -
Style guides - [-] Database guides
- [-] Separation of EE specific content
Availability and Testing
-
Review and add/update tests for this feature/bug. Consider all test levels. See the Test Planning Process. - [-] Tested in all supported browsers
- [-] Informed Infrastructure department of a default or new setting change, if applicable per definition of done
Security
If this MR contains changes to processing or storing of credentials or tokens, authorization and authentication methods and other items described in the security review guidelines:
- [-] Label as security and @ mention
@gitlab-com/gl-security/appsec
- [-] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods
- [-] Security reports checked/validated by a reviewer from the AppSec team
Edited by Heinrich Lee Yu