Skip to content

Performance: Re-introduce lazy locks#21102

Merged
AndyButland merged 3 commits intomainfrom
v17/feature/re-introduce-lazy-locks
Dec 16, 2025
Merged

Performance: Re-introduce lazy locks#21102
AndyButland merged 3 commits intomainfrom
v17/feature/re-introduce-lazy-locks

Conversation

@lauraneto
Copy link
Contributor

@lauraneto lauraneto commented Dec 9, 2025

Summary

  • Re-enables lazy locking in LockingMechanism by switching ReadLock and WriteLock to use their lazy implementations instead of eager ones

Background

The codebase already had the concept of lazy vs eager locks, but locks were always being acquired eagerly. This caused unnecessary database queries even when the actual data was already cached at the repository level.

The typical pattern:

using ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true);
scope.ReadLock(Constants.Locks.MediaTree);
return _mediaRepository.Get(id);

Even if the media is cached, the eager lock still hits the database. With lazy locks, the lock is only acquired if and when the database is actually accessed.

Benefits

  • Reduces database round-trips when data is served from repository cache
  • Improves performance especially with latency between web server and database
  • Makes better use of existing repository caches instead of requiring additional request-level caching workarounds

Load Test Results

All tests performed after rebasing on PR #21105 (deadlock fix). Each configuration was tested 5 times to ensure consistency.

Test 1: Cache-Hit Stress Test (50 VUs, 1000 iterations, 100% reads)

Tests performance when serving cached data - the ideal scenario for lazy locks to shine.

Database Lazy Locks Eager Locks Improvement
SQL Server 19.93ms avg 28.15ms avg 29% faster
SQLite ~same ~same No significant difference

SQL Server Detail:

  • Lazy: avg 19.93ms, p95 69.28ms
  • Eager: avg 28.15ms, p95 131.51ms
  • Lazy locks skip lock acquisition on cache hits, reducing database round-trips

Test 2: Write-Heavy Stress Test (50 VUs, 200 iterations, mixed workload)

Tests high-concurrency write operations (create content type → GET → create content → GET → publish).

Database Lazy Locks Eager Locks Improvement
SQL Server 1.22s avg 1.36s avg 10% faster
SQLite 623ms avg 731ms avg 15% faster

SQL Server Detail:

  • Lazy: 1.22s avg, 35.4 req/s throughput, 0% failure rate
  • Eager: 1.36s avg, 32.6 req/s throughput, 0.06% failure rate

SQLite Detail:

  • Lazy: 623ms avg, 63.6 req/s throughput
  • Eager: 731ms avg, 55.4 req/s throughput

Key Findings

  1. SQL Server sees consistent improvement - Both read-heavy (29% faster) and write-heavy (10% faster) scenarios benefit from lazy locks under high concurrency.

  2. Performance gap increases under load - Higher VU counts (50 vs 20) showed more pronounced benefits from lazy locks.

  3. SQLite benefits from writes, not reads - SQLite's single-writer lock model means cache-hit scenarios don't benefit as much, but write-heavy workloads still see 15% improvement.

  4. Both configurations are stable - No deadlocks observed with either approach after the PR Content Publishing: Fix deadlocks by acquiring WriteLock at outer scope #21105 fix.

Test plan

…blishing

Acquire a write lock on ContentTree at the start of PublishAsync to prevent
deadlocks. Previously, inner scopes would acquire read locks first (via
repository operations), then attempt to upgrade to write locks, causing
deadlocks when multiple transactions tried this simultaneously.

By acquiring the write lock at the outer scope, we ensure consistent lock
ordering and prevent the deadlock scenario.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@lauraneto lauraneto force-pushed the v17/feature/re-introduce-lazy-locks branch from c638d77 to 631b3db Compare December 10, 2025 17:13
@lauraneto lauraneto changed the base branch from main to v17/bugfix/deadlock-fix-content-publishing December 10, 2025 17:14
Base automatically changed from v17/bugfix/deadlock-fix-content-publishing to main December 10, 2025 19:59
@lauraneto lauraneto marked this pull request as ready for review December 11, 2025 08:49
Copilot AI review requested due to automatic review settings December 11, 2025 08:49
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 re-introduces lazy locking to improve performance by deferring database lock acquisition until data is actually accessed, rather than acquiring locks eagerly at the start of operations. This optimization reduces unnecessary database round-trips when data is served from repository caches, showing significant performance improvements in load testing (29% faster for cache-hit scenarios on SQL Server, 10-15% faster for write-heavy workloads).

Key Changes:

  • Switched ReadLock and WriteLock in LockingMechanism to use lazy implementations instead of eager ones
  • Added missing WriteLock to ContentPublishingService.PublishAsync for thread safety consistency

Reviewed changes

Copilot reviewed 1 out of 1 changed files in this pull request and generated no comments.

File Description
src/Umbraco.Core/Scoping/LockingMechanism.cs Changes ReadLock and WriteLock to use LazyReadLockInner and LazyWriteLockInner instead of EagerReadLockInner and EagerWriteLockInner, enabling deferred lock acquisition
src/Umbraco.Core/Services/ContentPublishingService.cs Adds WriteLock call to PublishAsync method, ensuring consistent locking pattern with other content mutation operations

The changes look good and follow established patterns in the codebase. The added lock in ContentPublishingService is consistent with similar operations in ContentService (e.g., Unpublish, PublishBranch), and the lazy lock implementation properly queues locks for later acquisition. No issues were found during review.

@lauraneto
Copy link
Contributor Author

@AndyButland Adding you as reviewer as I know you have been working on some performance improvements, so hoping you might have a "real" data set that we can test the change against.
When I was running tests, the improvements were only visible when I really increased the concurrency, otherwise they were similar or sometimes even worse with the lazy (keep in mind this was ran against a local database, so very few delays).

@AndyButland
Copy link
Contributor

AndyButland commented Dec 13, 2025

I've done some tests using a setup with Umbraco running locally and connecting to a database in Azure - so very high latency between web application and database. Not a particularly real-world scenario for production, but it only exaggerates the concern so makes it easier to see improvements.

I'm testing using a sample database and a document that contains seven published languages and multiple blocks. For each test, I've restarted the website, refreshed the backoffice content page and saved and published once before measuring.

Using code from main branch

1 2 3 Average (s)
Validate 1.31 0.96 0.86 1.04
Save 5.51 4.54 4.22 4.76
Publish 14.27 13.28 13.38 13.64

Using code from this branch with lazy locks

1 2 3 Average (s) Improvement
Validate 0.35 0.39 0.41 0.38 63.3%
Save 3.4 3.2 2.92 3.17 33.3%
Publish 12.9 12.8 13 12.90 5.4%

Using code with read locks disabled

1 2 3 Average (s) Improvement
Validate 0.39 0.31 0.43 0.38 63.9%
Save 2.97 2.97 2.96 2.97 37.6%
Publish 12.39 12.09 12.25 12.24 10.3%

So overall:

  • Some clear improvements, particularly on the validate and save steps.
  • For publishing there's some improvement, but much less. And as this is still the part that takes the longest, it's not on it's own going to give a big performance boost.

This matches with previous analysis I did, finding the bulk of the time taken in the publish operation to be in ContentRepositoryBase.ReplacePropertyValues, where we are writing rather than reading. The main time taken in this is with the property updates in the database, where after publishing we update existing property data records and insert new ones.

From a one-off test here:

Overall Publish 12.52
Update Property Data (85 records) 5.36 42.8%
Insert Property Data (133 records) 2.43 19.4%
Delete Property Data (48 records) 0.035 0.3%

Given we are already using SQL bulk insert and update batch statements here, it's not obvious how we might further improve this part.

Nonetheless, the update in this PR looks clearly a net benefit to re-introduce.

Copy link
Contributor

@AndyButland AndyButland left a comment

Choose a reason for hiding this comment

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

Following team discussion we've decided to include this for 17.1. Testing has shown a clear performance improvement and we haven't been able to show any evidence for the deadlock concern that was raised as a reason for historically removing them in the past.

@AndyButland AndyButland merged commit 85806fd into main Dec 16, 2025
26 checks passed
@AndyButland AndyButland deleted the v17/feature/re-introduce-lazy-locks branch December 16, 2025 05:53
alexsee pushed a commit to alexsee/umbraco-container that referenced this pull request Jan 18, 2026
Updated
[Umbraco.Cms.Persistence.Sqlite](https://github.com/umbraco/Umbraco-CMS)
from 17.0.2 to 17.1.0.

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

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

## 17.1.0

# What's Changed Since 17.1.0-rc

### 🐛 Bug Fixes
* Media: Fix files not deleted from disk when recycle bin protection is
enabled by @​AndyButland in
umbraco/Umbraco-CMS#21309
* Document Editing: Refactor of Fix property variation change breaking
document save via Infinite Editing (closes #​21195) by @​nielslyngsoe in
umbraco/Umbraco-CMS#21293
* umbraco/Umbraco-CMS#21306 by @​calm329 in
umbraco/Umbraco-CMS#21306

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

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

### 📦 Dependencies
* Dependencies: Fixed dependency conflicts when installing
Microsoft.EntityFrameworkCore.Design (closes #​20421) by @​lauraneto in
umbraco/Umbraco-CMS#20474
* Dependencies: Remove `Microsoft.CodeAnalysis.CSharp` dependency from
Umbraco.Infrastructure by @​lauraneto in
umbraco/Umbraco-CMS#20481
* build(deps): bumps @​umbraco-ui/uui from 1.16.0-rc.0 to 1.16.0 by
@​iOvergaard in umbraco/Umbraco-CMS#20535
* Bump vite from 7.1.9 to 7.1.11 in /src/Umbraco.Web.UI.Client by
@​dependabot[bot] in umbraco/Umbraco-CMS#20580
* Bump vite from 7.1.9 to 7.1.11 in /src/Umbraco.Web.UI.Login by
@​dependabot[bot] in umbraco/Umbraco-CMS#20621
* Bump playwright and @​playwright/test in
/tests/Umbraco.Tests.AcceptanceTest by @​dependabot[bot] in
umbraco/Umbraco-CMS#20579
* Bump the npm_and_yarn group across 2 directories with 1 update by
@​dependabot[bot] in umbraco/Umbraco-CMS#20863
* Dependencies: Updates some dependencies to latest minor or patch
releases by @​AndyButland in
umbraco/Umbraco-CMS#20953
* build(deps): bumps monaco-editor from 0.54.0 to 0.55.1 by @​iOvergaard
in umbraco/Umbraco-CMS#21054

### 🌈 Accessibility Improvements
* Entity Actions: Create button discernible text (fixes #​20205) by
@​OskarKruger in umbraco/Umbraco-CMS#20434
* Entity Actions: More create button discernible text, extension of
#​20434 by @​OskarKruger in
umbraco/Umbraco-CMS#20458
* Header: Adjusted button focus border color contrast by @​MrHutmat in
umbraco/Umbraco-CMS#20562
* Login: Added custom validation for missing password and user/email on
the login form by @​MrHutmat in
umbraco/Umbraco-CMS#20233
* Accessibility: Adding a label attribute for `<uui-button>` in news
dashboard by @​MrHutmat in
umbraco/Umbraco-CMS#20780
* Keyboard navigation: Return to opening element after modal close by
@​MrHutmat in umbraco/Umbraco-CMS#20782

### 🚀 New Features
* Preview: Allows changing the preview environment inside the preview
app, and other UX changes that enhance the experience by @​leekelleher
in umbraco/Umbraco-CMS#20598
* Login: Adds show/hide password toggle by @​MrHutmat in
umbraco/Umbraco-CMS#20611
* Adds Clear Clipboard button & logic by @​warrenbuckley in
umbraco/Umbraco-CMS#20757
* Member types: Implement containers by @​ronaldbarendse in
umbraco/Umbraco-CMS#20706
* Log viewer: Improves search functionality and code quality by
@​iOvergaard in umbraco/Umbraco-CMS#20913
* Log Viewer: Enhances the donut chart to be responsive, link to log
search, and show numbers directly by @​iOvergaard in
umbraco/Umbraco-CMS#20928
* Culture and Hostnames: Add ability to sort hostnames (closes #​20691)
by @​MrHutmat in umbraco/Umbraco-CMS#20826
* Localization: Adds `termOrDefault()` method to accept a fallback value
by @​iOvergaard in umbraco/Umbraco-CMS#20947
* Block Grid: Sort mode by @​leekelleher in
umbraco/Umbraco-CMS#20869
* News Dashboard: Adding functionality to overwrite the cache duration
by @​NillasKA in umbraco/Umbraco-CMS#21064
* Block List: Sort mode by @​leekelleher in
umbraco/Umbraco-CMS#21060
* Extend RTE output in Delivery API for better support for multi-site
URL resolution by @​MiguelGuedelha in
umbraco/Umbraco-CMS#20846
* Content Types: Introduce schema service to support future schema
generation by @​lauraneto in
umbraco/Umbraco-CMS#21031
* Delivery API: Adding allow list for content types by @​NillasKA in
umbraco/Umbraco-CMS#21111
* Emails: Add `Expires` header by @​rickbutterfield in
umbraco/Umbraco-CMS#20285
* Indexing: Make the indexing batch size configurable by @​kjac in
umbraco/Umbraco-CMS#20543
* Media: Add protection to restrict access to media in recycle bin
(closes #​2931) by @​AndyButland in
umbraco/Umbraco-CMS#20378
* Collection: Introduce Collection Item Card extension type by
@​madsrasmussen in umbraco/Umbraco-CMS#20954
* Collection: Introduce Collection Item Ref extension type by
@​madsrasmussen in umbraco/Umbraco-CMS#20994
 ... (truncated)

## 17.1.0-rc

## What's Changed

### 📦 Dependencies
* Dependencies: Fixed dependency conflicts when installing
Microsoft.EntityFrameworkCore.Design (closes #​20421) by @​lauraneto in
umbraco/Umbraco-CMS#20474
* Dependencies: Remove `Microsoft.CodeAnalysis.CSharp` dependency from
Umbraco.Infrastructure by @​lauraneto in
umbraco/Umbraco-CMS#20481
* build(deps): bumps @​umbraco-ui/uui from 1.16.0-rc.0 to 1.16.0 by
@​iOvergaard in umbraco/Umbraco-CMS#20535
* Bump vite from 7.1.9 to 7.1.11 in /src/Umbraco.Web.UI.Client by
@​dependabot[bot] in umbraco/Umbraco-CMS#20580
* Bump vite from 7.1.9 to 7.1.11 in /src/Umbraco.Web.UI.Login by
@​dependabot[bot] in umbraco/Umbraco-CMS#20621
* Bump playwright and @​playwright/test in
/tests/Umbraco.Tests.AcceptanceTest by @​dependabot[bot] in
umbraco/Umbraco-CMS#20579
* Bump the npm_and_yarn group across 2 directories with 1 update by
@​dependabot[bot] in umbraco/Umbraco-CMS#20863
* Dependencies: Updates some dependencies to latest minor or patch
releases by @​AndyButland in
umbraco/Umbraco-CMS#20953
* build(deps): bumps monaco-editor from 0.54.0 to 0.55.1 by @​iOvergaard
in umbraco/Umbraco-CMS#21054

### 🌈 Accessibility Improvements
* Entity Actions: Create button discernible text (fixes #​20205) by
@​OskarKruger in umbraco/Umbraco-CMS#20434
* Entity Actions: More create button discernible text, extension of
#​20434 by @​OskarKruger in
umbraco/Umbraco-CMS#20458
* Header: Adjusted button focus border color contrast by @​MrHutmat in
umbraco/Umbraco-CMS#20562
* Login: Added custom validation for missing password and user/email on
the login form by @​MrHutmat in
umbraco/Umbraco-CMS#20233
* Accessibility: Adding a label attribute for `<uui-button>` in news
dashboard by @​MrHutmat in
umbraco/Umbraco-CMS#20780
* Keyboard navigation: Return to opening element after modal close by
@​MrHutmat in umbraco/Umbraco-CMS#20782

### 🚀 New Features
* Preview: Allows changing the preview environment inside the preview
app, and other UX changes that enhance the experience by @​leekelleher
in umbraco/Umbraco-CMS#20598
* Login: Adds show/hide password toggle by @​MrHutmat in
umbraco/Umbraco-CMS#20611
* Adds Clear Clipboard button & logic by @​warrenbuckley in
umbraco/Umbraco-CMS#20757
* Member types: Implement containers by @​ronaldbarendse in
umbraco/Umbraco-CMS#20706
* Log viewer: Improves search functionality and code quality by
@​iOvergaard in umbraco/Umbraco-CMS#20913
* Log Viewer: Enhances the donut chart to be responsive, link to log
search, and show numbers directly by @​iOvergaard in
umbraco/Umbraco-CMS#20928
* Culture and Hostnames: Add ability to sort hostnames (closes #​20691)
by @​MrHutmat in umbraco/Umbraco-CMS#20826
* Localization: Adds `termOrDefault()` method to accept a fallback value
by @​iOvergaard in umbraco/Umbraco-CMS#20947
* Block Grid: Sort mode by @​leekelleher in
umbraco/Umbraco-CMS#20869
* News Dashboard: Adding functionality to overwrite the cache duration
by @​NillasKA in umbraco/Umbraco-CMS#21064
* Block List: Sort mode by @​leekelleher in
umbraco/Umbraco-CMS#21060
* Extend RTE output in Delivery API for better support for multi-site
URL resolution by @​MiguelGuedelha in
umbraco/Umbraco-CMS#20846
* Content Types: Introduce schema service to support future schema
generation by @​lauraneto in
umbraco/Umbraco-CMS#21031
* Delivery API: Adding allow list for content types by @​NillasKA in
umbraco/Umbraco-CMS#21111
* Emails: Add `Expires` header by @​rickbutterfield in
umbraco/Umbraco-CMS#20285
* Indexing: Make the indexing batch size configurable by @​kjac in
umbraco/Umbraco-CMS#20543
* Media: Add protection to restrict access to media in recycle bin
(closes #​2931) by @​AndyButland in
umbraco/Umbraco-CMS#20378
* Collection: Introduce Collection Item Card extension type by
@​madsrasmussen in umbraco/Umbraco-CMS#20954
* Collection: Introduce Collection Item Ref extension type by
@​madsrasmussen in umbraco/Umbraco-CMS#20994
* Collection: Introduce Card and Ref Collection View kinds by
@​madsrasmussen in umbraco/Umbraco-CMS#21037

### 🚤 Performance
* Performance: Optimize memory footprint of document URL cache (closes
#​21055) by @​AndyButland in
umbraco/Umbraco-CMS#21066
* Distributed Background Jobs: Improve distributed background job
locking behavior and performance by @​nikolajlauridsen in
umbraco/Umbraco-CMS#21100
* Repositories: Optimize repository caches to populate for both int and
GUID keys by @​AndyButland in
umbraco/Umbraco-CMS#21124
* Performance: Re-introduce lazy locks by @​lauraneto in
umbraco/Umbraco-CMS#21102

### 🐛 Bug Fixes
 ... (truncated)

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

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Umbraco.Cms.Persistence.Sqlite&package-manager=nuget&previous-version=17.0.2&new-version=17.1.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

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] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
alexsee added a commit to alexsee/umbraco-container that referenced this pull request Jan 18, 2026
Updated
[Umbraco.Cms.DevelopmentMode.Backoffice](https://github.com/umbraco/Umbraco-CMS)
from 17.0.2 to 17.1.0.

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

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

## 17.1.0

# What's Changed Since 17.1.0-rc

### 🐛 Bug Fixes
* Media: Fix files not deleted from disk when recycle bin protection is
enabled by @​AndyButland in
umbraco/Umbraco-CMS#21309
* Document Editing: Refactor of Fix property variation change breaking
document save via Infinite Editing (closes #​21195) by @​nielslyngsoe in
umbraco/Umbraco-CMS#21293
* umbraco/Umbraco-CMS#21306 by @​calm329 in
umbraco/Umbraco-CMS#21306

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

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

### 📦 Dependencies
* Dependencies: Fixed dependency conflicts when installing
Microsoft.EntityFrameworkCore.Design (closes #​20421) by @​lauraneto in
umbraco/Umbraco-CMS#20474
* Dependencies: Remove `Microsoft.CodeAnalysis.CSharp` dependency from
Umbraco.Infrastructure by @​lauraneto in
umbraco/Umbraco-CMS#20481
* build(deps): bumps @​umbraco-ui/uui from 1.16.0-rc.0 to 1.16.0 by
@​iOvergaard in umbraco/Umbraco-CMS#20535
* Bump vite from 7.1.9 to 7.1.11 in /src/Umbraco.Web.UI.Client by
@​dependabot[bot] in umbraco/Umbraco-CMS#20580
* Bump vite from 7.1.9 to 7.1.11 in /src/Umbraco.Web.UI.Login by
@​dependabot[bot] in umbraco/Umbraco-CMS#20621
* Bump playwright and @​playwright/test in
/tests/Umbraco.Tests.AcceptanceTest by @​dependabot[bot] in
umbraco/Umbraco-CMS#20579
* Bump the npm_and_yarn group across 2 directories with 1 update by
@​dependabot[bot] in umbraco/Umbraco-CMS#20863
* Dependencies: Updates some dependencies to latest minor or patch
releases by @​AndyButland in
umbraco/Umbraco-CMS#20953
* build(deps): bumps monaco-editor from 0.54.0 to 0.55.1 by @​iOvergaard
in umbraco/Umbraco-CMS#21054

### 🌈 Accessibility Improvements
* Entity Actions: Create button discernible text (fixes #​20205) by
@​OskarKruger in umbraco/Umbraco-CMS#20434
* Entity Actions: More create button discernible text, extension of
#​20434 by @​OskarKruger in
umbraco/Umbraco-CMS#20458
* Header: Adjusted button focus border color contrast by @​MrHutmat in
umbraco/Umbraco-CMS#20562
* Login: Added custom validation for missing password and user/email on
the login form by @​MrHutmat in
umbraco/Umbraco-CMS#20233
* Accessibility: Adding a label attribute for `<uui-button>` in news
dashboard by @​MrHutmat in
umbraco/Umbraco-CMS#20780
* Keyboard navigation: Return to opening element after modal close by
@​MrHutmat in umbraco/Umbraco-CMS#20782

### 🚀 New Features
* Preview: Allows changing the preview environment inside the preview
app, and other UX changes that enhance the experience by @​leekelleher
in umbraco/Umbraco-CMS#20598
* Login: Adds show/hide password toggle by @​MrHutmat in
umbraco/Umbraco-CMS#20611
* Adds Clear Clipboard button & logic by @​warrenbuckley in
umbraco/Umbraco-CMS#20757
* Member types: Implement containers by @​ronaldbarendse in
umbraco/Umbraco-CMS#20706
* Log viewer: Improves search functionality and code quality by
@​iOvergaard in umbraco/Umbraco-CMS#20913
* Log Viewer: Enhances the donut chart to be responsive, link to log
search, and show numbers directly by @​iOvergaard in
umbraco/Umbraco-CMS#20928
* Culture and Hostnames: Add ability to sort hostnames (closes #​20691)
by @​MrHutmat in umbraco/Umbraco-CMS#20826
* Localization: Adds `termOrDefault()` method to accept a fallback value
by @​iOvergaard in umbraco/Umbraco-CMS#20947
* Block Grid: Sort mode by @​leekelleher in
umbraco/Umbraco-CMS#20869
* News Dashboard: Adding functionality to overwrite the cache duration
by @​NillasKA in umbraco/Umbraco-CMS#21064
* Block List: Sort mode by @​leekelleher in
umbraco/Umbraco-CMS#21060
* Extend RTE output in Delivery API for better support for multi-site
URL resolution by @​MiguelGuedelha in
umbraco/Umbraco-CMS#20846
* Content Types: Introduce schema service to support future schema
generation by @​lauraneto in
umbraco/Umbraco-CMS#21031
* Delivery API: Adding allow list for content types by @​NillasKA in
umbraco/Umbraco-CMS#21111
* Emails: Add `Expires` header by @​rickbutterfield in
umbraco/Umbraco-CMS#20285
* Indexing: Make the indexing batch size configurable by @​kjac in
umbraco/Umbraco-CMS#20543
* Media: Add protection to restrict access to media in recycle bin
(closes #​2931) by @​AndyButland in
umbraco/Umbraco-CMS#20378
* Collection: Introduce Collection Item Card extension type by
@​madsrasmussen in umbraco/Umbraco-CMS#20954
* Collection: Introduce Collection Item Ref extension type by
@​madsrasmussen in umbraco/Umbraco-CMS#20994
 ... (truncated)

## 17.1.0-rc

## What's Changed

### 📦 Dependencies
* Dependencies: Fixed dependency conflicts when installing
Microsoft.EntityFrameworkCore.Design (closes #​20421) by @​lauraneto in
umbraco/Umbraco-CMS#20474
* Dependencies: Remove `Microsoft.CodeAnalysis.CSharp` dependency from
Umbraco.Infrastructure by @​lauraneto in
umbraco/Umbraco-CMS#20481
* build(deps): bumps @​umbraco-ui/uui from 1.16.0-rc.0 to 1.16.0 by
@​iOvergaard in umbraco/Umbraco-CMS#20535
* Bump vite from 7.1.9 to 7.1.11 in /src/Umbraco.Web.UI.Client by
@​dependabot[bot] in umbraco/Umbraco-CMS#20580
* Bump vite from 7.1.9 to 7.1.11 in /src/Umbraco.Web.UI.Login by
@​dependabot[bot] in umbraco/Umbraco-CMS#20621
* Bump playwright and @​playwright/test in
/tests/Umbraco.Tests.AcceptanceTest by @​dependabot[bot] in
umbraco/Umbraco-CMS#20579
* Bump the npm_and_yarn group across 2 directories with 1 update by
@​dependabot[bot] in umbraco/Umbraco-CMS#20863
* Dependencies: Updates some dependencies to latest minor or patch
releases by @​AndyButland in
umbraco/Umbraco-CMS#20953
* build(deps): bumps monaco-editor from 0.54.0 to 0.55.1 by @​iOvergaard
in umbraco/Umbraco-CMS#21054

### 🌈 Accessibility Improvements
* Entity Actions: Create button discernible text (fixes #​20205) by
@​OskarKruger in umbraco/Umbraco-CMS#20434
* Entity Actions: More create button discernible text, extension of
#​20434 by @​OskarKruger in
umbraco/Umbraco-CMS#20458
* Header: Adjusted button focus border color contrast by @​MrHutmat in
umbraco/Umbraco-CMS#20562
* Login: Added custom validation for missing password and user/email on
the login form by @​MrHutmat in
umbraco/Umbraco-CMS#20233
* Accessibility: Adding a label attribute for `<uui-button>` in news
dashboard by @​MrHutmat in
umbraco/Umbraco-CMS#20780
* Keyboard navigation: Return to opening element after modal close by
@​MrHutmat in umbraco/Umbraco-CMS#20782

### 🚀 New Features
* Preview: Allows changing the preview environment inside the preview
app, and other UX changes that enhance the experience by @​leekelleher
in umbraco/Umbraco-CMS#20598
* Login: Adds show/hide password toggle by @​MrHutmat in
umbraco/Umbraco-CMS#20611
* Adds Clear Clipboard button & logic by @​warrenbuckley in
umbraco/Umbraco-CMS#20757
* Member types: Implement containers by @​ronaldbarendse in
umbraco/Umbraco-CMS#20706
* Log viewer: Improves search functionality and code quality by
@​iOvergaard in umbraco/Umbraco-CMS#20913
* Log Viewer: Enhances the donut chart to be responsive, link to log
search, and show numbers directly by @​iOvergaard in
umbraco/Umbraco-CMS#20928
* Culture and Hostnames: Add ability to sort hostnames (closes #​20691)
by @​MrHutmat in umbraco/Umbraco-CMS#20826
* Localization: Adds `termOrDefault()` method to accept a fallback value
by @​iOvergaard in umbraco/Umbraco-CMS#20947
* Block Grid: Sort mode by @​leekelleher in
umbraco/Umbraco-CMS#20869
* News Dashboard: Adding functionality to overwrite the cache duration
by @​NillasKA in umbraco/Umbraco-CMS#21064
* Block List: Sort mode by @​leekelleher in
umbraco/Umbraco-CMS#21060
* Extend RTE output in Delivery API for better support for multi-site
URL resolution by @​MiguelGuedelha in
umbraco/Umbraco-CMS#20846
* Content Types: Introduce schema service to support future schema
generation by @​lauraneto in
umbraco/Umbraco-CMS#21031
* Delivery API: Adding allow list for content types by @​NillasKA in
umbraco/Umbraco-CMS#21111
* Emails: Add `Expires` header by @​rickbutterfield in
umbraco/Umbraco-CMS#20285
* Indexing: Make the indexing batch size configurable by @​kjac in
umbraco/Umbraco-CMS#20543
* Media: Add protection to restrict access to media in recycle bin
(closes #​2931) by @​AndyButland in
umbraco/Umbraco-CMS#20378
* Collection: Introduce Collection Item Card extension type by
@​madsrasmussen in umbraco/Umbraco-CMS#20954
* Collection: Introduce Collection Item Ref extension type by
@​madsrasmussen in umbraco/Umbraco-CMS#20994
* Collection: Introduce Card and Ref Collection View kinds by
@​madsrasmussen in umbraco/Umbraco-CMS#21037

### 🚤 Performance
* Performance: Optimize memory footprint of document URL cache (closes
#​21055) by @​AndyButland in
umbraco/Umbraco-CMS#21066
* Distributed Background Jobs: Improve distributed background job
locking behavior and performance by @​nikolajlauridsen in
umbraco/Umbraco-CMS#21100
* Repositories: Optimize repository caches to populate for both int and
GUID keys by @​AndyButland in
umbraco/Umbraco-CMS#21124
* Performance: Re-introduce lazy locks by @​lauraneto in
umbraco/Umbraco-CMS#21102

### 🐛 Bug Fixes
 ... (truncated)

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

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Umbraco.Cms.DevelopmentMode.Backoffice&package-manager=nuget&previous-version=17.0.2&new-version=17.1.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

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] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Alexander Seeliger <alexsee@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