-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Optimize document and media seeding by looking up from database in batches #19890
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Optimize document and media seeding by looking up from database in batches #19890
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR optimizes document and media seeding by replacing single database requests with batch processing to improve Umbraco's boot time performance. The optimization reduces SQL calls from many individual requests to fewer, larger batches of 100 items.
- Implements batch processing for cache seeding with 100-item groups
- Adds HybridCache extension methods for existence checking and value retrieval
- Introduces bulk database methods for fetching multiple content/media sources
Reviewed Changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| HybridCacheExtensions.cs | New extension methods providing ExistsAsync and TryGetValueAsync functionality for batch operations |
| HybridCacheExtensionsTests.cs | Comprehensive test coverage for the new extension methods |
| DocumentCacheService.cs | Refactored seeding logic to use batch processing and existence checking |
| MediaCacheService.cs | Applied similar batch optimization as document cache service |
| IDatabaseCacheRepository.cs | Added interface methods for bulk content/media retrieval |
| DatabaseCacheRepository.cs | Implemented bulk database operations for efficient batch queries |
| DocumentHybridCacheMockTests.cs | Updated tests to reflect new batch processing behavior |
| DocumentBreadthFirstKeyProviderTests.cs | Minor formatting change adding blank line |
src/Umbraco.PublishedCache.HybridCache/Persistence/DatabaseCacheRepository.cs
Outdated
Show resolved
Hide resolved
src/Umbraco.PublishedCache.HybridCache/Extensions/HybridCacheExtensions.cs
Show resolved
Hide resolved
Zeegaan
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good 🚀
|
@AndyButland Seems like a great improvement! Did you pick 100 just as a "random number" or why was that number picked? I'm wondering if it could be beneficial to be able to change this number or if it could be calculated based on the seed size in any way. We have some sites where we will have to seed over 20k nodes and (guessing) that it might be faster if we loaded them in batches of 1000 or something. Did you play with different batch sizes? |
|
Good point @enkelmedia , We already had a similar concept with the |
|
Yes, good idea to have some flexibility here. I've proposed moving this to configuration in #19894 |
Updated [Umbraco.Cms](https://github.com/umbraco/Umbraco-CMS) from 16.1.1 to 16.2.0. <details> <summary>Release notes</summary> _Sourced from [Umbraco.Cms's releases](https://github.com/umbraco/Umbraco-CMS/releases)._ ## 16.2.0 <!-- Release notes generated using configuration in .github/release.yml at release-16.2.0 --> ## What's Changed ### 🙌 Notable Changes * UFM: JavaScript-like Expressions by @leekelleher in umbraco/Umbraco-CMS#19685 * Make logging more friendly for docker by @Migaroez in umbraco/Umbraco-CMS#19818 * Adds abstraction around boot time checks for database availability by @AndyButland in umbraco/Umbraco-CMS#19848 * Optimize document and media seeding by looking up from database in batches by @AndyButland in umbraco/Umbraco-CMS#19890 * Added configuration option UseStrictDomainMatching, which allows control over whether content is routed without a matching domain by @AndyButland in umbraco/Umbraco-CMS#19815 ### 📦 Dependencies * Bump linkifyjs from 4.3.1 to 4.3.2 in /src/Umbraco.Web.UI.Login by @dependabot[bot] in umbraco/Umbraco-CMS#19819 * Tiptap RTE: Upgraded to latest v2.x by @leekelleher in umbraco/Umbraco-CMS#19869 * build(deps): bump @umbraco-ui/uui to 1.15.0 by @iOvergaard in umbraco/Umbraco-CMS#19981 ### 🚀 New Features * V16: Siblings endpoints by @nikolajlauridsen in umbraco/Umbraco-CMS#19657 * UFM: Adds `markedExtension` extension-type by @leekelleher in umbraco/Umbraco-CMS#19684 * UFM: Make Block Settings data available by @leekelleher in umbraco/Umbraco-CMS#19686 * Adds background worker to check timeout state by @iOvergaard in umbraco/Umbraco-CMS#19702 * V16: Build Backoffice externals with Vite by @iOvergaard in umbraco/Umbraco-CMS#19716 * Tiptap RTE: Custom CSS Variables for min/max height/width by @leekelleher in umbraco/Umbraco-CMS#19841 * Provides an abstraction for creating the JavaScriptEncoder used in SystemTextConfigurationEditorJsonSerializer by @AndyButland in umbraco/Umbraco-CMS#19849 * Tiptap RTE: Refactor Table menus to use `menu` extension-type by @leekelleher in umbraco/Umbraco-CMS#19789 ### 🐛 Bug Fixes * Amend accessibility modifiers on file upload property editor components to support extension by @PeterKvayt in umbraco/Umbraco-CMS#19643 * Docs: Tree example by @madsrasmussen in umbraco/Umbraco-CMS#19624 * Hide Document/Media Collection Workspace View until the item is created by @madsrasmussen in umbraco/Umbraco-CMS#19644 * Title returns "Server Error" in non-debug mode by @PeterKvayt in umbraco/Umbraco-CMS#19665 * Fix issue with preview in delivery API for MNTP property editor by @AndyButland in umbraco/Umbraco-CMS#19668 * Adds support for custom granular permissions when aggregating across user groups by @AndyButland in umbraco/Umbraco-CMS#19660 * Fixes issues with creation of documents from blueprints that have populated file upload properties by @AndyButland in umbraco/Umbraco-CMS#19655 * Clear member cache by older user name when member user name is updated (16) by @AndyButland in umbraco/Umbraco-CMS#19690 * V16 QA Removed unused API acceptance tests by @nhudinh0309 in umbraco/Umbraco-CMS#19679 * V16 QA Added acceptance tests for granular document permission by @nhudinh0309 in umbraco/Umbraco-CMS#19546 * V16 QA Reverted npx command by @nhudinh0309 in umbraco/Umbraco-CMS#19699 * Fixes Block Catalogue Modal Filter by @leekelleher in umbraco/Umbraco-CMS#19700 * Fix issue forceHideContentEditorInOverlay not available in RTE by @NguyenThuyLan in umbraco/Umbraco-CMS#19698 * V16: Property editor file upload does not validate file types by @iOvergaard in umbraco/Umbraco-CMS#19714 * Fix failing integration tests in SQL Server by @lauraneto in umbraco/Umbraco-CMS#19725 * Populate name for content and media on URL picker if title is left empty by @AndyButland in umbraco/Umbraco-CMS#19677 * Forward merge #19720 to V16 by @kjac in umbraco/Umbraco-CMS#19735 * Include /.well-known/jwks in the paths covered by OpenIddict by @kjac in umbraco/Umbraco-CMS#19749 * Add flag to exclude trashed media by @rammi987 in umbraco/Umbraco-CMS#19746 * V16 Added acceptance tests for the regression issue #16985 by @nhudinh0309 in umbraco/Umbraco-CMS#19712 * V16 Added acceptance tests for the regression issue #19529 by @nhudinh0309 in umbraco/Umbraco-CMS#19713 * V16 QA Added acceptance tests for creating a document using blueprint by @nhudinh0309 in umbraco/Umbraco-CMS#19708 * Allow saving blueprints with validation errors by @lauraneto in umbraco/Umbraco-CMS#19748 * Make internal & private classes sealed where possible, to avoid code for virtual dispatch by @Henr1k80 in umbraco/Umbraco-CMS#19719 * add missing translation for DA by @rammi987 in umbraco/Umbraco-CMS#19740 * Add a backing field for EditorUIAlias and track changes when its set. by @KevinJump in umbraco/Umbraco-CMS#19733 * Template with Block List field with Inline Editing Mode causes Collection List View to shrink by @NguyenThuyLan in umbraco/Umbraco-CMS#19754 ... (truncated) ## 16.2.0-rc2 <!-- Release notes generated using configuration in .github/release.yml at release-16.2.0-rc2 --> ## What's Changed ### 📦 Dependencies * build(deps): bump @umbraco-ui/uui to 1.15.0 by @iOvergaard in umbraco/Umbraco-CMS#19981 ### 🐛 Bug Fixes * fix: pins the UmbracoExtension `@hey-api/*` versions to that of the Backoffice client by @iOvergaard in umbraco/Umbraco-CMS#20016 ### ✍️ Documentation * Chore: JSDocs for RTE CSS Props by @leekelleher in umbraco/Umbraco-CMS#20008 **Full Changelog**: umbraco/Umbraco-CMS@release-16.2.0-rc...release-16.2.0-rc2 ## 16.2.0-rc <!-- Release notes generated using configuration in .github/release.yml at release-16.2.0-rc --> ## What's Changed ### 🙌 Notable Changes * UFM: JavaScript-like Expressions by @leekelleher in umbraco/Umbraco-CMS#19685 * Make logging more friendly for docker by @Migaroez in umbraco/Umbraco-CMS#19818 * Adds abstraction around boot time checks for database availability by @AndyButland in umbraco/Umbraco-CMS#19848 * Optimize document and media seeding by looking up from database in batches by @AndyButland in umbraco/Umbraco-CMS#19890 * Added configuration option UseStrictDomainMatching, which allows control over whether content is routed without a matching domain by @AndyButland in umbraco/Umbraco-CMS#19815 ### 📦 Dependencies * Bump linkifyjs from 4.3.1 to 4.3.2 in /src/Umbraco.Web.UI.Login by @dependabot[bot] in umbraco/Umbraco-CMS#19819 * Tiptap RTE: Upgraded to latest v2.x by @leekelleher in umbraco/Umbraco-CMS#19869 * build(deps): bump @umbraco-ui/uui from 1.14.2 to 1.15.0-rc.0 by @iOvergaard in umbraco/Umbraco-CMS#19870 ### 🚀 New Features * V16: Siblings endpoints by @nikolajlauridsen in umbraco/Umbraco-CMS#19657 * UFM: Adds `markedExtension` extension-type by @leekelleher in umbraco/Umbraco-CMS#19684 * UFM: Make Block Settings data available by @leekelleher in umbraco/Umbraco-CMS#19686 * Adds background worker to check timeout state by @iOvergaard in umbraco/Umbraco-CMS#19702 * V16: Build Backoffice externals with Vite by @iOvergaard in umbraco/Umbraco-CMS#19716 * Tiptap RTE: Custom CSS Variables for min/max height/width by @leekelleher in umbraco/Umbraco-CMS#19841 * Provides an abstraction for creating the JavaScriptEncoder used in SystemTextConfigurationEditorJsonSerializer by @AndyButland in umbraco/Umbraco-CMS#19849 * Tiptap RTE: Refactor Table menus to use `menu` extension-type by @leekelleher in umbraco/Umbraco-CMS#19789 ### 🐛 Bug Fixes * Amend accessibility modifiers on file upload property editor components to support extension by @PeterKvayt in umbraco/Umbraco-CMS#19643 * Docs: Tree example by @madsrasmussen in umbraco/Umbraco-CMS#19624 * Hide Document/Media Collection Workspace View until the item is created by @madsrasmussen in umbraco/Umbraco-CMS#19644 * Title returns "Server Error" in non-debug mode by @PeterKvayt in umbraco/Umbraco-CMS#19665 * Fix issue with preview in delivery API for MNTP property editor by @AndyButland in umbraco/Umbraco-CMS#19668 * Adds support for custom granular permissions when aggregating across user groups by @AndyButland in umbraco/Umbraco-CMS#19660 * Fixes issues with creation of documents from blueprints that have populated file upload properties by @AndyButland in umbraco/Umbraco-CMS#19655 * Clear member cache by older user name when member user name is updated (16) by @AndyButland in umbraco/Umbraco-CMS#19690 * V16 QA Removed unused API acceptance tests by @nhudinh0309 in umbraco/Umbraco-CMS#19679 * V16 QA Added acceptance tests for granular document permission by @nhudinh0309 in umbraco/Umbraco-CMS#19546 * V16 QA Reverted npx command by @nhudinh0309 in umbraco/Umbraco-CMS#19699 * Fixes Block Catalogue Modal Filter by @leekelleher in umbraco/Umbraco-CMS#19700 * Fix issue forceHideContentEditorInOverlay not available in RTE by @NguyenThuyLan in umbraco/Umbraco-CMS#19698 * V16: Property editor file upload does not validate file types by @iOvergaard in umbraco/Umbraco-CMS#19714 * Fix failing integration tests in SQL Server by @lauraneto in umbraco/Umbraco-CMS#19725 * Populate name for content and media on URL picker if title is left empty by @AndyButland in umbraco/Umbraco-CMS#19677 * Forward merge #19720 to V16 by @kjac in umbraco/Umbraco-CMS#19735 * Include /.well-known/jwks in the paths covered by OpenIddict by @kjac in umbraco/Umbraco-CMS#19749 * Add flag to exclude trashed media by @rammi987 in umbraco/Umbraco-CMS#19746 * V16 Added acceptance tests for the regression issue #16985 by @nhudinh0309 in umbraco/Umbraco-CMS#19712 * V16 Added acceptance tests for the regression issue #19529 by @nhudinh0309 in umbraco/Umbraco-CMS#19713 * V16 QA Added acceptance tests for creating a document using blueprint by @nhudinh0309 in umbraco/Umbraco-CMS#19708 * Allow saving blueprints with validation errors by @lauraneto in umbraco/Umbraco-CMS#19748 * Make internal & private classes sealed where possible, to avoid code for virtual dispatch by @Henr1k80 in umbraco/Umbraco-CMS#19719 * add missing translation for DA by @rammi987 in umbraco/Umbraco-CMS#19740 * Add a backing field for EditorUIAlias and track changes when its set. by @KevinJump in umbraco/Umbraco-CMS#19733 * Template with Block List field with Inline Editing Mode causes Collection List View to shrink by @NguyenThuyLan in umbraco/Umbraco-CMS#19754 ... (truncated) Commits viewable in [compare view](umbraco/Umbraco-CMS@release-16.1.1...release-16.2.0). </details> Updated [Umbraco.Cms.Persistence.Sqlite](https://github.com/umbraco/Umbraco-CMS) from 16.1.1 to 16.2.0. <details> <summary>Release notes</summary> _Sourced from [Umbraco.Cms.Persistence.Sqlite's releases](https://github.com/umbraco/Umbraco-CMS/releases)._ ## 16.2.0 <!-- Release notes generated using configuration in .github/release.yml at release-16.2.0 --> ## What's Changed ### 🙌 Notable Changes * UFM: JavaScript-like Expressions by @leekelleher in umbraco/Umbraco-CMS#19685 * Make logging more friendly for docker by @Migaroez in umbraco/Umbraco-CMS#19818 * Adds abstraction around boot time checks for database availability by @AndyButland in umbraco/Umbraco-CMS#19848 * Optimize document and media seeding by looking up from database in batches by @AndyButland in umbraco/Umbraco-CMS#19890 * Added configuration option UseStrictDomainMatching, which allows control over whether content is routed without a matching domain by @AndyButland in umbraco/Umbraco-CMS#19815 ### 📦 Dependencies * Bump linkifyjs from 4.3.1 to 4.3.2 in /src/Umbraco.Web.UI.Login by @dependabot[bot] in umbraco/Umbraco-CMS#19819 * Tiptap RTE: Upgraded to latest v2.x by @leekelleher in umbraco/Umbraco-CMS#19869 * build(deps): bump @umbraco-ui/uui to 1.15.0 by @iOvergaard in umbraco/Umbraco-CMS#19981 ### 🚀 New Features * V16: Siblings endpoints by @nikolajlauridsen in umbraco/Umbraco-CMS#19657 * UFM: Adds `markedExtension` extension-type by @leekelleher in umbraco/Umbraco-CMS#19684 * UFM: Make Block Settings data available by @leekelleher in umbraco/Umbraco-CMS#19686 * Adds background worker to check timeout state by @iOvergaard in umbraco/Umbraco-CMS#19702 * V16: Build Backoffice externals with Vite by @iOvergaard in umbraco/Umbraco-CMS#19716 * Tiptap RTE: Custom CSS Variables for min/max height/width by @leekelleher in umbraco/Umbraco-CMS#19841 * Provides an abstraction for creating the JavaScriptEncoder used in SystemTextConfigurationEditorJsonSerializer by @AndyButland in umbraco/Umbraco-CMS#19849 * Tiptap RTE: Refactor Table menus to use `menu` extension-type by @leekelleher in umbraco/Umbraco-CMS#19789 ### 🐛 Bug Fixes * Amend accessibility modifiers on file upload property editor components to support extension by @PeterKvayt in umbraco/Umbraco-CMS#19643 * Docs: Tree example by @madsrasmussen in umbraco/Umbraco-CMS#19624 * Hide Document/Media Collection Workspace View until the item is created by @madsrasmussen in umbraco/Umbraco-CMS#19644 * Title returns "Server Error" in non-debug mode by @PeterKvayt in umbraco/Umbraco-CMS#19665 * Fix issue with preview in delivery API for MNTP property editor by @AndyButland in umbraco/Umbraco-CMS#19668 * Adds support for custom granular permissions when aggregating across user groups by @AndyButland in umbraco/Umbraco-CMS#19660 * Fixes issues with creation of documents from blueprints that have populated file upload properties by @AndyButland in umbraco/Umbraco-CMS#19655 * Clear member cache by older user name when member user name is updated (16) by @AndyButland in umbraco/Umbraco-CMS#19690 * V16 QA Removed unused API acceptance tests by @nhudinh0309 in umbraco/Umbraco-CMS#19679 * V16 QA Added acceptance tests for granular document permission by @nhudinh0309 in umbraco/Umbraco-CMS#19546 * V16 QA Reverted npx command by @nhudinh0309 in umbraco/Umbraco-CMS#19699 * Fixes Block Catalogue Modal Filter by @leekelleher in umbraco/Umbraco-CMS#19700 * Fix issue forceHideContentEditorInOverlay not available in RTE by @NguyenThuyLan in umbraco/Umbraco-CMS#19698 * V16: Property editor file upload does not validate file types by @iOvergaard in umbraco/Umbraco-CMS#19714 * Fix failing integration tests in SQL Server by @lauraneto in umbraco/Umbraco-CMS#19725 * Populate name for content and media on URL picker if title is left empty by @AndyButland in umbraco/Umbraco-CMS#19677 * Forward merge #19720 to V16 by @kjac in umbraco/Umbraco-CMS#19735 * Include /.well-known/jwks in the paths covered by OpenIddict by @kjac in umbraco/Umbraco-CMS#19749 * Add flag to exclude trashed media by @rammi987 in umbraco/Umbraco-CMS#19746 * V16 Added acceptance tests for the regression issue #16985 by @nhudinh0309 in umbraco/Umbraco-CMS#19712 * V16 Added acceptance tests for the regression issue #19529 by @nhudinh0309 in umbraco/Umbraco-CMS#19713 * V16 QA Added acceptance tests for creating a document using blueprint by @nhudinh0309 in umbraco/Umbraco-CMS#19708 * Allow saving blueprints with validation errors by @lauraneto in umbraco/Umbraco-CMS#19748 * Make internal & private classes sealed where possible, to avoid code for virtual dispatch by @Henr1k80 in umbraco/Umbraco-CMS#19719 * add missing translation for DA by @rammi987 in umbraco/Umbraco-CMS#19740 * Add a backing field for EditorUIAlias and track changes when its set. by @KevinJump in umbraco/Umbraco-CMS#19733 * Template with Block List field with Inline Editing Mode causes Collection List View to shrink by @NguyenThuyLan in umbraco/Umbraco-CMS#19754 ... (truncated) ## 16.2.0-rc2 <!-- Release notes generated using configuration in .github/release.yml at release-16.2.0-rc2 --> ## What's Changed ### 📦 Dependencies * build(deps): bump @umbraco-ui/uui to 1.15.0 by @iOvergaard in umbraco/Umbraco-CMS#19981 ### 🐛 Bug Fixes * fix: pins the UmbracoExtension `@hey-api/*` versions to that of the Backoffice client by @iOvergaard in umbraco/Umbraco-CMS#20016 ### ✍️ Documentation * Chore: JSDocs for RTE CSS Props by @leekelleher in umbraco/Umbraco-CMS#20008 **Full Changelog**: umbraco/Umbraco-CMS@release-16.2.0-rc...release-16.2.0-rc2 ## 16.2.0-rc <!-- Release notes generated using configuration in .github/release.yml at release-16.2.0-rc --> ## What's Changed ### 🙌 Notable Changes * UFM: JavaScript-like Expressions by @leekelleher in umbraco/Umbraco-CMS#19685 * Make logging more friendly for docker by @Migaroez in umbraco/Umbraco-CMS#19818 * Adds abstraction around boot time checks for database availability by @AndyButland in umbraco/Umbraco-CMS#19848 * Optimize document and media seeding by looking up from database in batches by @AndyButland in umbraco/Umbraco-CMS#19890 * Added configuration option UseStrictDomainMatching, which allows control over whether content is routed without a matching domain by @AndyButland in umbraco/Umbraco-CMS#19815 ### 📦 Dependencies * Bump linkifyjs from 4.3.1 to 4.3.2 in /src/Umbraco.Web.UI.Login by @dependabot[bot] in umbraco/Umbraco-CMS#19819 * Tiptap RTE: Upgraded to latest v2.x by @leekelleher in umbraco/Umbraco-CMS#19869 * build(deps): bump @umbraco-ui/uui from 1.14.2 to 1.15.0-rc.0 by @iOvergaard in umbraco/Umbraco-CMS#19870 ### 🚀 New Features * V16: Siblings endpoints by @nikolajlauridsen in umbraco/Umbraco-CMS#19657 * UFM: Adds `markedExtension` extension-type by @leekelleher in umbraco/Umbraco-CMS#19684 * UFM: Make Block Settings data available by @leekelleher in umbraco/Umbraco-CMS#19686 * Adds background worker to check timeout state by @iOvergaard in umbraco/Umbraco-CMS#19702 * V16: Build Backoffice externals with Vite by @iOvergaard in umbraco/Umbraco-CMS#19716 * Tiptap RTE: Custom CSS Variables for min/max height/width by @leekelleher in umbraco/Umbraco-CMS#19841 * Provides an abstraction for creating the JavaScriptEncoder used in SystemTextConfigurationEditorJsonSerializer by @AndyButland in umbraco/Umbraco-CMS#19849 * Tiptap RTE: Refactor Table menus to use `menu` extension-type by @leekelleher in umbraco/Umbraco-CMS#19789 ### 🐛 Bug Fixes * Amend accessibility modifiers on file upload property editor components to support extension by @PeterKvayt in umbraco/Umbraco-CMS#19643 * Docs: Tree example by @madsrasmussen in umbraco/Umbraco-CMS#19624 * Hide Document/Media Collection Workspace View until the item is created by @madsrasmussen in umbraco/Umbraco-CMS#19644 * Title returns "Server Error" in non-debug mode by @PeterKvayt in umbraco/Umbraco-CMS#19665 * Fix issue with preview in delivery API for MNTP property editor by @AndyButland in umbraco/Umbraco-CMS#19668 * Adds support for custom granular permissions when aggregating across user groups by @AndyButland in umbraco/Umbraco-CMS#19660 * Fixes issues with creation of documents from blueprints that have populated file upload properties by @AndyButland in umbraco/Umbraco-CMS#19655 * Clear member cache by older user name when member user name is updated (16) by @AndyButland in umbraco/Umbraco-CMS#19690 * V16 QA Removed unused API acceptance tests by @nhudinh0309 in umbraco/Umbraco-CMS#19679 * V16 QA Added acceptance tests for granular document permission by @nhudinh0309 in umbraco/Umbraco-CMS#19546 * V16 QA Reverted npx command by @nhudinh0309 in umbraco/Umbraco-CMS#19699 * Fixes Block Catalogue Modal Filter by @leekelleher in umbraco/Umbraco-CMS#19700 * Fix issue forceHideContentEditorInOverlay not available in RTE by @NguyenThuyLan in umbraco/Umbraco-CMS#19698 * V16: Property editor file upload does not validate file types by @iOvergaard in umbraco/Umbraco-CMS#19714 * Fix failing integration tests in SQL Server by @lauraneto in umbraco/Umbraco-CMS#19725 * Populate name for content and media on URL picker if title is left empty by @AndyButland in umbraco/Umbraco-CMS#19677 * Forward merge #19720 to V16 by @kjac in umbraco/Umbraco-CMS#19735 * Include /.well-known/jwks in the paths covered by OpenIddict by @kjac in umbraco/Umbraco-CMS#19749 * Add flag to exclude trashed media by @rammi987 in umbraco/Umbraco-CMS#19746 * V16 Added acceptance tests for the regression issue #16985 by @nhudinh0309 in umbraco/Umbraco-CMS#19712 * V16 Added acceptance tests for the regression issue #19529 by @nhudinh0309 in umbraco/Umbraco-CMS#19713 * V16 QA Added acceptance tests for creating a document using blueprint by @nhudinh0309 in umbraco/Umbraco-CMS#19708 * Allow saving blueprints with validation errors by @lauraneto in umbraco/Umbraco-CMS#19748 * Make internal & private classes sealed where possible, to avoid code for virtual dispatch by @Henr1k80 in umbraco/Umbraco-CMS#19719 * add missing translation for DA by @rammi987 in umbraco/Umbraco-CMS#19740 * Add a backing field for EditorUIAlias and track changes when its set. by @KevinJump in umbraco/Umbraco-CMS#19733 * Template with Block List field with Inline Editing Mode causes Collection List View to shrink by @NguyenThuyLan in umbraco/Umbraco-CMS#19754 ... (truncated) Commits viewable in [compare view](umbraco/Umbraco-CMS@release-16.1.1...release-16.2.0). </details> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Prerequisites
Relates to discussion in #18892 around boot time.
Description
When Umbraco boots it will seed the hybrid cache based on configured settings. It currently does this via the hybrid cache's
GetOrCreatemethod, which means that on start up, when the memory cache is empty, each seeded item makes a database request to get a single value back. This can add up to a lot of SQL calls if a large number of items are seeded.This PR optimizes this to handle the seeding in batches of 100. For each batch it'll check for each if they are available in the cache. For all not found it'll make one database request to get all the documents or media to cache, and then cache them one at a time. In doing so this we change to fewer, larger database calls from many small ones.
Support for "Exists" in Hybrid Cache
Note that the hybrid cache API doesn't support an "Exists" check currently, but based on the discussion here it looks to be possible to create one. I've used this code to add an
ExistsAsyncextension method. I've done this a little differently though. The shared code worked by setting flags on theHybridCacheEntryOptionsto disable writing of the cache, which had this downside:Which isn't what we want for seeding. By seeding we are saying we do want these values in memory, so in the L1 cache. As such I've modified the code such that, if we don't find a value, we'll write a "null" but then immediately remove it again. That seems right for our needs where we aren't expecting to cache null values for documents and media.
Performance
To test this adds benefit I've created an Umbraco setup with increasing number of content nodes selected for seeding, and look to get positive results:
Testing
Once Umbraco has started up with seeding, verify pages load without SQL requests using MiniProfiler.