Skip to content

Performance: Fix thread safety and optimize cache updates in PublishStatusService after content changes#21415

Merged
AndyButland merged 3 commits intomainfrom
v17/bugfix/thread-safety-and-optimization-in-publish-status-service
Jan 21, 2026
Merged

Performance: Fix thread safety and optimize cache updates in PublishStatusService after content changes#21415
AndyButland merged 3 commits intomainfrom
v17/bugfix/thread-safety-and-optimization-in-publish-status-service

Conversation

@AndyButland
Copy link
Contributor

@AndyButland AndyButland commented Jan 15, 2026

Description

In analysis of database operations in a save and publish operation we found more than one call to retrieve the published cultures of a document. Whilst initially the thought was to cache this, I've instead addressed this in the content cache refresher, modifying the behaviour such that it only refreshes the published cultures for a document in the context of an update that affects published cultures. We don't need to do this for example for save or sort operations, only publish and unpublish.

In looking at this I also saw we have a potential concurrent issue with the use of an IDictionary for the cached published cultures. This is demonstrated via an integration test and fixed by using ConcurrentDictionary.

Change Summary

  • Optimized ContentCacheRefresher.HandlePublishedAsync to only update publish status when there are actual publish/unpublish changes (and not on Save operations).
  • Fixed thread safety issue in PublishStatusService by using ConcurrentDictionary instead of Dictionary for the internal _publishedCultures cache.
  • Added thread safety integration tests for PublishStatusService.

Cache Update Optimization

ContentCacheRefresher was calling AddOrUpdateStatusAsync/AddOrUpdateStatusWithDescendantsAsync on every content change, including Save operations. These methods query the database unnecessarily since Save operations don't change publish status.

Added HasPublishStatusUpdates check that only triggers updates when PublishedCultures or UnpublishedCultures are populated in the payload - which only happens during Publish/Unpublish operations, not Save.

Thread Safety Fix

The PublishStatusService maintains an in-memory dictionary of published cultures per document. As a singleton service accessed by multiple concurrent HTTP requests, using a non-thread-safe Dictionary<Guid, ISet<string>> could cause:

  • InvalidOperationException (collection modified during enumeration)
  • Data corruption from concurrent writes
  • Race conditions

Changed to ConcurrentDictionary<Guid, ISet<string>> and updated Remove to use TryRemove.

Testing

The thread safety issue is verified with the provided integration test (this would fail without the changes in this PR PublishStatusService.

For manual testing you can verify with breakpoints that AddOrUpdateStatusAsync/AddOrUpdateStatusWithDescendantsAsync are only called in publish or unpublish operations.

Copilot AI review requested due to automatic review settings January 15, 2026 14:08
Copy link
Contributor

Copilot AI left a 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 addresses thread safety issues in the PublishStatusService and optimizes cache refresh operations to avoid unnecessary database queries.

Changes:

  • Replaced Dictionary<Guid, ISet<string>> with ConcurrentDictionary<Guid, ISet<string>> in PublishStatusService to fix thread safety issues in a singleton service
  • Optimized ContentCacheRefresher.HandlePublishedAsync to only update publish status when actual publish/unpublish operations occur (not on Save operations)
  • Added comprehensive thread safety integration tests covering concurrent reads, writes, and initialization

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

File Description
PublishStatusService.cs Changed internal cache from Dictionary to ConcurrentDictionary and updated Remove method to use TryRemove
ContentCacheRefresher.cs Added HasPublishStatusUpdates check to skip unnecessary cache updates on Save operations
PublishStatusServiceTests.ThreadSafety.cs New test file with thread safety tests for concurrent operations
Umbraco.Tests.Integration.csproj Added project reference for the new thread safety test file
Comments suppressed due to low confidence (2)

src/Umbraco.Core/Services/PublishStatus/PublishStatusService.cs:76

  • The ISet<string> values in the ConcurrentDictionary are not thread-safe. While the dictionary operations are now thread-safe, concurrent access to the same ISet<string> instance (e.g., one thread reading via Contains() while another thread is replacing the set via _publishedCultures[documentKey] = publishedCultures in line 123 or 146) could cause issues. Consider using a thread-safe collection for the values, or document that updates happen in a controlled manner (e.g., within database scopes).
        if (_publishedCultures.TryGetValue(documentKey, out ISet<string>? publishedCultures))
        {
            // If "*" is provided as the culture, we consider this as "published in any culture". This aligns
            // with behaviour in Umbraco 13.
            return culture == Constants.System.InvariantCulture || publishedCultures.Contains(culture, StringComparer.InvariantCultureIgnoreCase);
        }

src/Umbraco.Core/Services/PublishStatus/PublishStatusService.cs:88

  • The ISet<string>.Count property access is not thread-safe when the set could be replaced concurrently. While less likely to cause crashes than enumeration, this could read inconsistent state if the set is being replaced by another thread. This is related to the same underlying issue where the ISet<string> values are not thread-safe.
        if (_publishedCultures.TryGetValue(documentKey, out ISet<string>? publishedCultures))
        {
            return publishedCultures.Count > 0;
        }

await sut.InitializeAsync(CancellationToken.None);

const int numberOfOperations = 1000;
var documentKeys = Enumerable.Range(0, 100).Select(_ => Guid.NewGuid()).ToArray();
Copy link

Copilot AI Jan 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The thread safety tests use random GUIDs that don't correspond to actual documents in the database. This means AddOrUpdateStatusAsync will query for non-existent documents and cache empty sets. Consider using actual document keys from the test setup (e.g., Textpage.Key, Subpage.Key) to test realistic scenarios where documents exist and have publish status data.

Copilot uses AI. Check for mistakes.
@AndyButland AndyButland changed the title PublishStatusService: Fix thread safety and optimize cache updates Performance: Fix thread safety and optimize cache updates in PublishStatusService after content changes Jan 15, 2026
Copy link
Member

@Zeegaan Zeegaan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally looks good, just had a small suggestion, but this is fine without it 😁

@AndyButland AndyButland enabled auto-merge (squash) January 21, 2026 06:06
@AndyButland AndyButland merged commit c8f8978 into main Jan 21, 2026
25 of 26 checks passed
@AndyButland AndyButland deleted the v17/bugfix/thread-safety-and-optimization-in-publish-status-service branch January 21, 2026 06:41
@AndyButland AndyButland mentioned this pull request Jan 21, 2026
1 task
alexsee pushed a commit to alexsee/umbraco-container that referenced this pull request Feb 23, 2026
Updated [Umbraco.Cms](https://github.com/umbraco/Umbraco-CMS) from
17.1.0 to 17.2.0.

<details>
<summary>Release notes</summary>

_Sourced from [Umbraco.Cms's
releases](https://github.com/umbraco/Umbraco-CMS/releases)._

## 17.2.0

## What's Changed Since 17.2.0-rc2

### 📦 Dependencies
* build(deps): bumps @​umbraco-ui/uui to 1.17.0 by @​iOvergaard in
umbraco/Umbraco-CMS#21765

**Full Changelog**:
umbraco/Umbraco-CMS@release-17.2.0-rc2...release-17.2.0

## What's Changed Since 17.2.0-rc

### 🐛 Bug Fixes
* Block Workspace: rename root-tab to 'generic' by @​nielslyngsoe in
umbraco/Umbraco-CMS#21699
* Block Workspace: Tabs navigation, Cherry-pick from #​21672 by
@​nielslyngsoe in umbraco/Umbraco-CMS#21693

**Full Changelog**:
umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2

## What's Changed Since the Last Release (17.1.0)

### 🙌 Notable Changes
* User group: add description to user group (closes #​14986) by
@​NguyenThuyLan in umbraco/Umbraco-CMS#21057
* Content Types: Root properties by @​nielslyngsoe in
umbraco/Umbraco-CMS#21500

### 📦 Dependencies
* Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @​dependabot[bot]
in umbraco/Umbraco-CMS#21208
* Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the
npm_and_yarn group across 1 directory by @​dependabot[bot] in
umbraco/Umbraco-CMS#21270
* Bump the npm_and_yarn group across 2 directories with 1 update by
@​dependabot[bot] in umbraco/Umbraco-CMS#21403
* Dependencies: Bumps login dependencies to latest by @​iOvergaard in
umbraco/Umbraco-CMS#21539
* Tiptap RTE: Upgraded to latest v3.x by @​leekelleher in
umbraco/Umbraco-CMS#21493
* Dependencies: Bumps @​umbraco-ui/uui to 1.17.0-rc.4 by @​iOvergaard in
umbraco/Umbraco-CMS#21538
* build(deps): bumps @​umbraco-ui/uui to 1.17.0-rc.5 by @​iOvergaard in
umbraco/Umbraco-CMS#21569
* Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable
transitive dependencies (closes #​21122) by @​AndyButland in
umbraco/Umbraco-CMS#21285
* Dependencies: Bump to latest minor/patch versions by @​AndyButland in
umbraco/Umbraco-CMS#21540

### 🚀 New Features
* Markdown Conversion: Remove hard dependency on deprecated library and
replace with `IMarkdownToHtmlConverter` abstraction (closes #​21238 and
#​19500) by @​AndyButland in
umbraco/Umbraco-CMS#21242
* UI: Refactor breadcrumb URLs to use Path Constants by @​iOvergaard in
umbraco/Umbraco-CMS#21179
* Tree Navigation: Add visual indicators for items with restricted
access by @​iOvergaard in
umbraco/Umbraco-CMS#21365
* Recycle Bin: Adds `emptyRecycleBin` collection action kind for
Documents and Media by @​leekelleher in
umbraco/Umbraco-CMS#21482
* Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by
@​leekelleher in umbraco/Umbraco-CMS#21494
* Rollback: Add toggle for diff display (closes #​18518) by
@​AndyButland in umbraco/Umbraco-CMS#21426
* Dictionary: Add configurable value search functionality by
@​Nis-Knowit in umbraco/Umbraco-CMS#21200

### 🚤 Performance
* Performance: Embeds the API of selected extra conditions by
@​nielslyngsoe in umbraco/Umbraco-CMS#21188
* Performance: Bundle Js Libs by @​nielslyngsoe in
umbraco/Umbraco-CMS#21187
* Performance: Embed Store API in Manifests to lower number of network
request by @​madsrasmussen in
umbraco/Umbraco-CMS#21191
* Performance: Avoid database lookup in `UserIdKeyResolver` for
super-user by @​AndyButland in
umbraco/Umbraco-CMS#21281
* Performance: Only flush ID/Key map in `ContentCacheRefresher` on
content deletion by @​AndyButland in
umbraco/Umbraco-CMS#21283
* Performance: Optimize refresh of hybrid cache for a document by
retrieving draft and published in single query by @​AndyButland in
umbraco/Umbraco-CMS#21407
* Backoffice Performance: Inline entry point modules to reduce JS chunk
count by @​madsrasmussen in
umbraco/Umbraco-CMS#21380
* HybridCache: Optimize content type change cache rebuild to resolve SQL
timeouts by @​AndyButland in
umbraco/Umbraco-CMS#21207
 ... (truncated)

## 17.2.0-rc2

## What's Changed Since 17.2.0-rc

### 🐛 Bug Fixes
* Block Workspace: rename root-tab to 'generic' by @​nielslyngsoe in
umbraco/Umbraco-CMS#21699
* Block Workspace: Tabs navigation, Cherry-pick from #​21672 by
@​nielslyngsoe in umbraco/Umbraco-CMS#21693

**Full Changelog**:
umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2

## What's Changed Since the Last Release (17.1.0)

### 🙌 Notable Changes
* User group: add description to user group (closes #​14986) by
@​NguyenThuyLan in umbraco/Umbraco-CMS#21057
* Content Types: Root properties by @​nielslyngsoe in
umbraco/Umbraco-CMS#21500

### 📦 Dependencies
* Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @​dependabot[bot]
in umbraco/Umbraco-CMS#21208
* Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the
npm_and_yarn group across 1 directory by @​dependabot[bot] in
umbraco/Umbraco-CMS#21270
* Bump the npm_and_yarn group across 2 directories with 1 update by
@​dependabot[bot] in umbraco/Umbraco-CMS#21403
* Dependencies: Bumps login dependencies to latest by @​iOvergaard in
umbraco/Umbraco-CMS#21539
* Tiptap RTE: Upgraded to latest v3.x by @​leekelleher in
umbraco/Umbraco-CMS#21493
* Dependencies: Bumps @​umbraco-ui/uui to 1.17.0-rc.4 by @​iOvergaard in
umbraco/Umbraco-CMS#21538
* build(deps): bumps @​umbraco-ui/uui to 1.17.0-rc.5 by @​iOvergaard in
umbraco/Umbraco-CMS#21569
* Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable
transitive dependencies (closes #​21122) by @​AndyButland in
umbraco/Umbraco-CMS#21285
* Dependencies: Bump to latest minor/patch versions by @​AndyButland in
umbraco/Umbraco-CMS#21540

### 🚀 New Features
* Markdown Conversion: Remove hard dependency on deprecated library and
replace with `IMarkdownToHtmlConverter` abstraction (closes #​21238 and
#​19500) by @​AndyButland in
umbraco/Umbraco-CMS#21242
* UI: Refactor breadcrumb URLs to use Path Constants by @​iOvergaard in
umbraco/Umbraco-CMS#21179
* Tree Navigation: Add visual indicators for items with restricted
access by @​iOvergaard in
umbraco/Umbraco-CMS#21365
* Recycle Bin: Adds `emptyRecycleBin` collection action kind for
Documents and Media by @​leekelleher in
umbraco/Umbraco-CMS#21482
* Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by
@​leekelleher in umbraco/Umbraco-CMS#21494
* Rollback: Add toggle for diff display (closes #​18518) by
@​AndyButland in umbraco/Umbraco-CMS#21426
* Dictionary: Add configurable value search functionality by
@​Nis-Knowit in umbraco/Umbraco-CMS#21200

### 🚤 Performance
* Performance: Embeds the API of selected extra conditions by
@​nielslyngsoe in umbraco/Umbraco-CMS#21188
* Performance: Bundle Js Libs by @​nielslyngsoe in
umbraco/Umbraco-CMS#21187
* Performance: Embed Store API in Manifests to lower number of network
request by @​madsrasmussen in
umbraco/Umbraco-CMS#21191
* Performance: Avoid database lookup in `UserIdKeyResolver` for
super-user by @​AndyButland in
umbraco/Umbraco-CMS#21281
* Performance: Only flush ID/Key map in `ContentCacheRefresher` on
content deletion by @​AndyButland in
umbraco/Umbraco-CMS#21283
* Performance: Optimize refresh of hybrid cache for a document by
retrieving draft and published in single query by @​AndyButland in
umbraco/Umbraco-CMS#21407
* Backoffice Performance: Inline entry point modules to reduce JS chunk
count by @​madsrasmussen in
umbraco/Umbraco-CMS#21380
* HybridCache: Optimize content type change cache rebuild to resolve SQL
timeouts by @​AndyButland in
umbraco/Umbraco-CMS#21207
* Backoffice Performance: Use import maps to save requests by
@​nielslyngsoe in umbraco/Umbraco-CMS#21363
* Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent
duplicate initialization (closes #​21337) by @​AndyButland in
umbraco/Umbraco-CMS#21379
* Performance: Fix thread safety and optimize cache updates in
`PublishStatusService` after content changes by @​AndyButland in
umbraco/Umbraco-CMS#21415
* Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering
by @​leekelleher in umbraco/Umbraco-CMS#21070
* Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups
(closes #​21383) by @​AndyButland in
umbraco/Umbraco-CMS#21396
* Performance: Optimize property retrieval and authorization checks in
collection views (closes #​21367) by @​AndyButland in
umbraco/Umbraco-CMS#21470

 ... (truncated)

## 17.2.0-rc

## What's Changed

### 🙌 Notable Changes
* User group: add description to user group (closes #​14986) by
@​NguyenThuyLan in umbraco/Umbraco-CMS#21057
* Content Types: Root properties by @​nielslyngsoe in
umbraco/Umbraco-CMS#21500

### 📦 Dependencies
* Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @​dependabot[bot]
in umbraco/Umbraco-CMS#21208
* Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the
npm_and_yarn group across 1 directory by @​dependabot[bot] in
umbraco/Umbraco-CMS#21270
* Bump the npm_and_yarn group across 2 directories with 1 update by
@​dependabot[bot] in umbraco/Umbraco-CMS#21403
* Dependencies: Bumps login dependencies to latest by @​iOvergaard in
umbraco/Umbraco-CMS#21539
* Tiptap RTE: Upgraded to latest v3.x by @​leekelleher in
umbraco/Umbraco-CMS#21493
* Dependencies: Bumps @​umbraco-ui/uui to 1.17.0-rc.4 by @​iOvergaard in
umbraco/Umbraco-CMS#21538
* build(deps): bumps @​umbraco-ui/uui to 1.17.0-rc.5 by @​iOvergaard in
umbraco/Umbraco-CMS#21569
* Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable
transitive dependencies (closes #​21122) by @​AndyButland in
umbraco/Umbraco-CMS#21285
* Dependencies: Bump to latest minor/patch versions by @​AndyButland in
umbraco/Umbraco-CMS#21540

### 🚀 New Features
* Markdown Conversion: Remove hard dependency on deprecated library and
replace with `IMarkdownToHtmlConverter` abstraction (closes #​21238 and
#​19500) by @​AndyButland in
umbraco/Umbraco-CMS#21242
* UI: Refactor breadcrumb URLs to use Path Constants by @​iOvergaard in
umbraco/Umbraco-CMS#21179
* Tree Navigation: Add visual indicators for items with restricted
access by @​iOvergaard in
umbraco/Umbraco-CMS#21365
* Recycle Bin: Adds `emptyRecycleBin` collection action kind for
Documents and Media by @​leekelleher in
umbraco/Umbraco-CMS#21482
* Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by
@​leekelleher in umbraco/Umbraco-CMS#21494
* Rollback: Add toggle for diff display (closes #​18518) by
@​AndyButland in umbraco/Umbraco-CMS#21426
* Dictionary: Add configurable value search functionality by
@​Nis-Knowit in umbraco/Umbraco-CMS#21200

### 🚤 Performance
* Performance: Embeds the API of selected extra conditions by
@​nielslyngsoe in umbraco/Umbraco-CMS#21188
* Performance: Bundle Js Libs by @​nielslyngsoe in
umbraco/Umbraco-CMS#21187
* Performance: Embed Store API in Manifests to lower number of network
request by @​madsrasmussen in
umbraco/Umbraco-CMS#21191
* Performance: Avoid database lookup in `UserIdKeyResolver` for
super-user by @​AndyButland in
umbraco/Umbraco-CMS#21281
* Performance: Only flush ID/Key map in `ContentCacheRefresher` on
content deletion by @​AndyButland in
umbraco/Umbraco-CMS#21283
* Performance: Optimize refresh of hybrid cache for a document by
retrieving draft and published in single query by @​AndyButland in
umbraco/Umbraco-CMS#21407
* Backoffice Performance: Inline entry point modules to reduce JS chunk
count by @​madsrasmussen in
umbraco/Umbraco-CMS#21380
* HybridCache: Optimize content type change cache rebuild to resolve SQL
timeouts by @​AndyButland in
umbraco/Umbraco-CMS#21207
* Backoffice Performance: Use import maps to save requests by
@​nielslyngsoe in umbraco/Umbraco-CMS#21363
* Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent
duplicate initialization (closes #​21337) by @​AndyButland in
umbraco/Umbraco-CMS#21379
* Performance: Fix thread safety and optimize cache updates in
`PublishStatusService` after content changes by @​AndyButland in
umbraco/Umbraco-CMS#21415
* Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering
by @​leekelleher in umbraco/Umbraco-CMS#21070
* Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups
(closes #​21383) by @​AndyButland in
umbraco/Umbraco-CMS#21396
* Performance: Optimize property retrieval and authorization checks in
collection views (closes #​21367) by @​AndyButland in
umbraco/Umbraco-CMS#21470

### 🧪 Testing
* E2E: QA Replaced unreliable Thread.Sleep(500) with a counter/gate
pattern that ensures both transactions are initialized before releasing
them to compete for locks by @​andr317c in
umbraco/Umbraco-CMS#21165
* E2E QA: Updated integration test that was missing directory setup by
@​andr317c in umbraco/Umbraco-CMS#21167
* E2E: QA Added acceptance tests for removing a not-found content picker
by @​nhudinh0309 in umbraco/Umbraco-CMS#21177
* E2E: QA Fixed failing tests for the current user profile by
@​nhudinh0309 in umbraco/Umbraco-CMS#21214
* Upgrade MSW from 1.3.5 to 2.12.4 by @​madsrasmussen in
umbraco/Umbraco-CMS#21096
* E2E: QA Added acceptance tests for rendering content with invariant
blocks by @​nhudinh0309 in
umbraco/Umbraco-CMS#21180
* E2E: QA Added acceptance tests for content delivery API by
@​nhudinh0309 in umbraco/Umbraco-CMS#21095
 ... (truncated)

Commits viewable in [compare
view](umbraco/Umbraco-CMS@release-17.1.0...release-17.2.0).
</details>

Updated
[Umbraco.Cms.Persistence.Sqlite](https://github.com/umbraco/Umbraco-CMS)
from 17.1.0 to 17.2.0.

<details>
<summary>Release notes</summary>

_Sourced from [Umbraco.Cms.Persistence.Sqlite's
releases](https://github.com/umbraco/Umbraco-CMS/releases)._

## 17.2.0

## What's Changed Since 17.2.0-rc2

### 📦 Dependencies
* build(deps): bumps @​umbraco-ui/uui to 1.17.0 by @​iOvergaard in
umbraco/Umbraco-CMS#21765

**Full Changelog**:
umbraco/Umbraco-CMS@release-17.2.0-rc2...release-17.2.0

## What's Changed Since 17.2.0-rc

### 🐛 Bug Fixes
* Block Workspace: rename root-tab to 'generic' by @​nielslyngsoe in
umbraco/Umbraco-CMS#21699
* Block Workspace: Tabs navigation, Cherry-pick from #​21672 by
@​nielslyngsoe in umbraco/Umbraco-CMS#21693

**Full Changelog**:
umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2

## What's Changed Since the Last Release (17.1.0)

### 🙌 Notable Changes
* User group: add description to user group (closes #​14986) by
@​NguyenThuyLan in umbraco/Umbraco-CMS#21057
* Content Types: Root properties by @​nielslyngsoe in
umbraco/Umbraco-CMS#21500

### 📦 Dependencies
* Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @​dependabot[bot]
in umbraco/Umbraco-CMS#21208
* Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the
npm_and_yarn group across 1 directory by @​dependabot[bot] in
umbraco/Umbraco-CMS#21270
* Bump the npm_and_yarn group across 2 directories with 1 update by
@​dependabot[bot] in umbraco/Umbraco-CMS#21403
* Dependencies: Bumps login dependencies to latest by @​iOvergaard in
umbraco/Umbraco-CMS#21539
* Tiptap RTE: Upgraded to latest v3.x by @​leekelleher in
umbraco/Umbraco-CMS#21493
* Dependencies: Bumps @​umbraco-ui/uui to 1.17.0-rc.4 by @​iOvergaard in
umbraco/Umbraco-CMS#21538
* build(deps): bumps @​umbraco-ui/uui to 1.17.0-rc.5 by @​iOvergaard in
umbraco/Umbraco-CMS#21569
* Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable
transitive dependencies (closes #​21122) by @​AndyButland in
umbraco/Umbraco-CMS#21285
* Dependencies: Bump to latest minor/patch versions by @​AndyButland in
umbraco/Umbraco-CMS#21540

### 🚀 New Features
* Markdown Conversion: Remove hard dependency on deprecated library and
replace with `IMarkdownToHtmlConverter` abstraction (closes #​21238 and
#​19500) by @​AndyButland in
umbraco/Umbraco-CMS#21242
* UI: Refactor breadcrumb URLs to use Path Constants by @​iOvergaard in
umbraco/Umbraco-CMS#21179
* Tree Navigation: Add visual indicators for items with restricted
access by @​iOvergaard in
umbraco/Umbraco-CMS#21365
* Recycle Bin: Adds `emptyRecycleBin` collection action kind for
Documents and Media by @​leekelleher in
umbraco/Umbraco-CMS#21482
* Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by
@​leekelleher in umbraco/Umbraco-CMS#21494
* Rollback: Add toggle for diff display (closes #​18518) by
@​AndyButland in umbraco/Umbraco-CMS#21426
* Dictionary: Add configurable value search functionality by
@​Nis-Knowit in umbraco/Umbraco-CMS#21200

### 🚤 Performance
* Performance: Embeds the API of selected extra conditions by
@​nielslyngsoe in umbraco/Umbraco-CMS#21188
* Performance: Bundle Js Libs by @​nielslyngsoe in
umbraco/Umbraco-CMS#21187
* Performance: Embed Store API in Manifests to lower number of network
request by @​madsrasmussen in
umbraco/Umbraco-CMS#21191
* Performance: Avoid database lookup in `UserIdKeyResolver` for
super-user by @​AndyButland in
umbraco/Umbraco-CMS#21281
* Performance: Only flush ID/Key map in `ContentCacheRefresher` on
content deletion by @​AndyButland in
umbraco/Umbraco-CMS#21283
* Performance: Optimize refresh of hybrid cache for a document by
retrieving draft and published in single query by @​AndyButland in
umbraco/Umbraco-CMS#21407
* Backoffice Performance: Inline entry point modules to reduce JS chunk
count by @​madsrasmussen in
umbraco/Umbraco-CMS#21380
* HybridCache: Optimize content type change cache rebuild to resolve SQL
timeouts by @​AndyButland in
umbraco/Umbraco-CMS#21207
 ... (truncated)

## 17.2.0-rc2

## What's Changed Since 17.2.0-rc

### 🐛 Bug Fixes
* Block Workspace: rename root-tab to 'generic' by @​nielslyngsoe in
umbraco/Umbraco-CMS#21699
* Block Workspace: Tabs navigation, Cherry-pick from #​21672 by
@​nielslyngsoe in umbraco/Umbraco-CMS#21693

**Full Changelog**:
umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2

## What's Changed Since the Last Release (17.1.0)

### 🙌 Notable Changes
* User group: add description to user group (closes #​14986) by
@​NguyenThuyLan in umbraco/Umbraco-CMS#21057
* Content Types: Root properties by @​nielslyngsoe in
umbraco/Umbraco-CMS#21500

### 📦 Dependencies
* Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @​dependabot[bot]
in umbraco/Umbraco-CMS#21208
* Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the
npm_and_yarn group across 1 directory by @​dependabot[bot] in
umbraco/Umbraco-CMS#21270
* Bump the npm_and_yarn group across 2 directories with 1 update by
@​dependabot[bot] in umbraco/Umbraco-CMS#21403
* Dependencies: Bumps login dependencies to latest by @​iOvergaard in
umbraco/Umbraco-CMS#21539
* Tiptap RTE: Upgraded to latest v3.x by @​leekelleher in
umbraco/Umbraco-CMS#21493
* Dependencies: Bumps @​umbraco-ui/uui to 1.17.0-rc.4 by @​iOvergaard in
umbraco/Umbraco-CMS#21538
* build(deps): bumps @​umbraco-ui/uui to 1.17.0-rc.5 by @​iOvergaard in
umbraco/Umbraco-CMS#21569
* Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable
transitive dependencies (closes #​21122) by @​AndyButland in
umbraco/Umbraco-CMS#21285
* Dependencies: Bump to latest minor/patch versions by @​AndyButland in
umbraco/Umbraco-CMS#21540

### 🚀 New Features
* Markdown Conversion: Remove hard dependency on deprecated library and
replace with `IMarkdownToHtmlConverter` abstraction (closes #​21238 and
#​19500) by @​AndyButland in
umbraco/Umbraco-CMS#21242
* UI: Refactor breadcrumb URLs to use Path Constants by @​iOvergaard in
umbraco/Umbraco-CMS#21179
* Tree Navigation: Add visual indicators for items with restricted
access by @​iOvergaard in
umbraco/Umbraco-CMS#21365
* Recycle Bin: Adds `emptyRecycleBin` collection action kind for
Documents and Media by @​leekelleher in
umbraco/Umbraco-CMS#21482
* Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by
@​leekelleher in umbraco/Umbraco-CMS#21494
* Rollback: Add toggle for diff display (closes #​18518) by
@​AndyButland in umbraco/Umbraco-CMS#21426
* Dictionary: Add configurable value search functionality by
@​Nis-Knowit in umbraco/Umbraco-CMS#21200

### 🚤 Performance
* Performance: Embeds the API of selected extra conditions by
@​nielslyngsoe in umbraco/Umbraco-CMS#21188
* Performance: Bundle Js Libs by @​nielslyngsoe in
umbraco/Umbraco-CMS#21187
* Performance: Embed Store API in Manifests to lower number of network
request by @​madsrasmussen in
umbraco/Umbraco-CMS#21191
* Performance: Avoid database lookup in `UserIdKeyResolver` for
super-user by @​AndyButland in
umbraco/Umbraco-CMS#21281
* Performance: Only flush ID/Key map in `ContentCacheRefresher` on
content deletion by @​AndyButland in
umbraco/Umbraco-CMS#21283
* Performance: Optimize refresh of hybrid cache for a document by
retrieving draft and published in single query by @​AndyButland in
umbraco/Umbraco-CMS#21407
* Backoffice Performance: Inline entry point modules to reduce JS chunk
count by @​madsrasmussen in
umbraco/Umbraco-CMS#21380
* HybridCache: Optimize content type change cache rebuild to resolve SQL
timeouts by @​AndyButland in
umbraco/Umbraco-CMS#21207
* Backoffice Performance: Use import maps to save requests by
@​nielslyngsoe in umbraco/Umbraco-CMS#21363
* Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent
duplicate initialization (closes #​21337) by @​AndyButland in
umbraco/Umbraco-CMS#21379
* Performance: Fix thread safety and optimize cache updates in
`PublishStatusService` after content changes by @​AndyButland in
umbraco/Umbraco-CMS#21415
* Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering
by @​leekelleher in umbraco/Umbraco-CMS#21070
* Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups
(closes #​21383) by @​AndyButland in
umbraco/Umbraco-CMS#21396
* Performance: Optimize property retrieval and authorization checks in
collection views (closes #​21367) by @​AndyButland in
umbraco/Umbraco-CMS#21470

 ... (truncated)

## 17.2.0-rc

## What's Changed

### 🙌 Notable Changes
* User group: add description to user group (closes #​14986) by
@​NguyenThuyLan in umbraco/Umbraco-CMS#21057
* Content Types: Root properties by @​nielslyngsoe in
umbraco/Umbraco-CMS#21500

### 📦 Dependencies
* Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @​dependabot[bot]
in umbraco/Umbraco-CMS#21208
* Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the
npm_and_yarn group across 1 directory by @​dependabot[bot] in
umbraco/Umbraco-CMS#21270
* Bump the npm_and_yarn group across 2 directories with 1 update by
@​dependabot[bot] in umbraco/Umbraco-CMS#21403
* Dependencies: Bumps login dependencies to latest by @​iOvergaard in
umbraco/Umbraco-CMS#21539
* Tiptap RTE: Upgraded to latest v3.x by @​leekelleher in
umbraco/Umbraco-CMS#21493
* Dependencies: Bumps @​umbraco-ui/uui to 1.17.0-rc.4 by @​iOvergaard in
umbraco/Umbraco-CMS#21538
* build(deps): bumps @​umbraco-ui/uui to 1.17.0-rc.5 by @​iOvergaard in
umbraco/Umbraco-CMS#21569
* Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable
transitive dependencies (closes #​21122) by @​AndyButland in
umbraco/Umbraco-CMS#21285
* Dependencies: Bump to latest minor/patch versions by @​AndyButland in
umbraco/Umbraco-CMS#21540

### 🚀 New Features
* Markdown Conversion: Remove hard dependency on deprecated library and
replace with `IMarkdownToHtmlConverter` abstraction (closes #​21238 and
#​19500) by @​AndyButland in
umbraco/Umbraco-CMS#21242
* UI: Refactor breadcrumb URLs to use Path Constants by @​iOvergaard in
umbraco/Umbraco-CMS#21179
* Tree Navigation: Add visual indicators for items with restricted
access by @​iOvergaard in
umbraco/Umbraco-CMS#21365
* Recycle Bin: Adds `emptyRecycleBin` collection action kind for
Documents and Media by @​leekelleher in
umbraco/Umbraco-CMS#21482
* Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by
@​leekelleher in umbraco/Umbraco-CMS#21494
* Rollback: Add toggle for diff display (closes #​18518) by
@​AndyButland in umbraco/Umbraco-CMS#21426
* Dictionary: Add configurable value search functionality by
@​Nis-Knowit in umbraco/Umbraco-CMS#21200

### 🚤 Performance
* Performance: Embeds the API of selected extra conditions by
@​nielslyngsoe in umbraco/Umbraco-CMS#21188
* Performance: Bundle Js Libs by @​nielslyngsoe in
umbraco/Umbraco-CMS#21187
* Performance: Embed Store API in Manifests to lower number of network
request by @​madsrasmussen in
umbraco/Umbraco-CMS#21191
* Performance: Avoid database lookup in `UserIdKeyResolver` for
super-user by @​AndyButland in
umbraco/Umbraco-CMS#21281
* Performance: Only flush ID/Key map in `ContentCacheRefresher` on
content deletion by @​AndyButland in
umbraco/Umbraco-CMS#21283
* Performance: Optimize refresh of hybrid cache for a document by
retrieving draft and published in single query by @​AndyButland in
umbraco/Umbraco-CMS#21407
* Backoffice Performance: Inline entry point modules to reduce JS chunk
count by @​madsrasmussen in
umbraco/Umbraco-CMS#21380
* HybridCache: Optimize content type change cache rebuild to resolve SQL
timeouts by @​AndyButland in
umbraco/Umbraco-CMS#21207
* Backoffice Performance: Use import maps to save requests by
@​nielslyngsoe in umbraco/Umbraco-CMS#21363
* Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent
duplicate initialization (closes #​21337) by @​AndyButland in
umbraco/Umbraco-CMS#21379
* Performance: Fix thread safety and optimize cache updates in
`PublishStatusService` after content changes by @​AndyButland in
umbraco/Umbraco-CMS#21415
* Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering
by @​leekelleher in umbraco/Umbraco-CMS#21070
* Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups
(closes #​21383) by @​AndyButland in
umbraco/Umbraco-CMS#21396
* Performance: Optimize property retrieval and authorization checks in
collection views (closes #​21367) by @​AndyButland in
umbraco/Umbraco-CMS#21470

### 🧪 Testing
* E2E: QA Replaced unreliable Thread.Sleep(500) with a counter/gate
pattern that ensures both transactions are initialized before releasing
them to compete for locks by @​andr317c in
umbraco/Umbraco-CMS#21165
* E2E QA: Updated integration test that was missing directory setup by
@​andr317c in umbraco/Umbraco-CMS#21167
* E2E: QA Added acceptance tests for removing a not-found content picker
by @​nhudinh0309 in umbraco/Umbraco-CMS#21177
* E2E: QA Fixed failing tests for the current user profile by
@​nhudinh0309 in umbraco/Umbraco-CMS#21214
* Upgrade MSW from 1.3.5 to 2.12.4 by @​madsrasmussen in
umbraco/Umbraco-CMS#21096
* E2E: QA Added acceptance tests for rendering content with invariant
blocks by @​nhudinh0309 in
umbraco/Umbraco-CMS#21180
* E2E: QA Added acceptance tests for content delivery API by
@​nhudinh0309 in umbraco/Umbraco-CMS#21095
 ... (truncated)

Commits viewable in [compare
view](umbraco/Umbraco-CMS@release-17.1.0...release-17.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 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] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants