Compare: 3.8.4...3.9.0
Elsa Extensions 3.9.0 — Release Notes
Minor release, shipped as an aligned 3.9.0 train with Elsa 3.9.0 and Elsa Studio 3.9.0. These packages are built against core 3.9.0 and Studio 3.9.0. Upgrade all three together, because mixing versions can fail at AddElsa() with TypeLoadException.
This release is mostly about MongoDB tenant isolation and Dapper migrations, including Dapper on PostgreSQL.
🌟 Highlights
- MongoDB respects tenants everywhere. Saves, upserts, definition summaries, labels, triggers, the bookmark queue and interrupt marking are all tenant-scoped. (#228, #239, #240, #242, #244)
- Dapper migrations work on fresh databases, including PostgreSQL. Existing Dapper databases heal on their next migrate. (#250, #255, #263, #264)
🐛 Fixes
MongoDB
- A save from one tenant can't take over another tenant's row (#242, via #248). A cross-tenant save that reuses another tenant's document Id or key now fails with a duplicate key error (
E11000). It used to replace the row silently. Same-tenant updates and the populator's*re-save are unchanged. - Definition summaries, labels, triggers and the bookmark queue no longer leak across tenants (#239, #240, #244, via #246).
- Interrupt marking and ordered instance summaries are tenant-scoped (#228, via #230).
Dapper
- Fresh databases migrate cleanly.
V3_7no longer re-addsAggregateFaultCount. Dapper databases on 3.7.0–3.8.4 that are stuck at migration 20006, without the Identity tables, recover on the next migrate. (#250, via #251) - Dapper on PostgreSQL works (#255, via #258). Fresh installs create their tables, which had been broken since 3.6 or earlier. Identifiers are quoted and boolean and
DateTimeOffsetvalues are handled correctly. - Key-value store and bookmark-queue enqueue work on migrated databases (#263, #264, via #266). The new runtime migration
20008createsKeyValuesand addsBookmarkQueueItems.SerializedOptionswhere they're missing. Prefix lookups (StartsWith) work.
All stores
TryMarkInterruptedAsyncrefuses Finished rows in Dapper, Elasticsearch and MongoDB, whateverallowFinishedCancelledis set to. This matches core #8421. (#225, via #226)- Atomic
TryDeleteAsyncfor Dapper and MongoDB, so a legacy 3.8 administrative pause is adopted safely on multi-node setups (core #8529). (#260, via #266) - Secrets bulk delete actually deletes every version of the selected secrets and returns the right count. (#253, via #256)
⚠️ Upgrade notes and breaking changes
- Upgrade with core 3.9.0 and Studio 3.9.0.
ISqlDialecthas a new member with a default implementation.Update(table, fields, getParamName)builds a standardUPDATEby default, so third-party dialects keep compiling and already-built assemblies keep loading. (#235, via #236) NewQuoteIdentifierandBooleanLiteralhooks also have defaults; onlyPostgreSqlDialectoverrides them. (#258)
MongoDB migration (#248)
- Records with an empty-string
TenantIdare treated asnull. 3.9 previews storedTenantId: ""for default-tenant roles and users, and that can affect single-tenant installs too. Migrate those rows tonull, or they won't heal on re-save. - Multitenant 3.8 MongoDB installs: fix the ownership of code-defined definition rows. In 3.8, those rows ended up owned by whichever tenant wrote them last. Migrate them to
TenantId: "*", or delete them and let the populator recreate them. Otherwise other tenants logE11000at startup. - Bulk saves aren't all-or-nothing. MongoDB writes
SaveManybatches in order. If a batch hits another tenant's Id, the earlier items are written, that item fails, and later items are skipped. No existing row changes owner. - Import and role create return 500 on a duplicate key. Mapping that to 409 is a follow-up.
Dapper migration
- PostgreSQL installs on 3.6–3.8 stuck at migration 10002: run
DELETE FROM "VersionInfo" WHERE "Version" = 10001;, then migrate up. Those databases can't hold workflow data, so this is the only repair needed. (#258) - Hand-made lowercase, unquoted PostgreSQL schemas are not supported. Use the schema the migrations create. Those schemas never worked with the Dapper PostgreSQL store. (#258)
- Instance search now uses the column
Idinstead ofID. This also fixes instance search on case-sensitive SQL Server collations. (#258) - Migration
20008runs on your next migrate. ItsDown()is a no-op, andKeyValuePairsis not touched. (#266) - Default-tenant Dapper queries treat
NULLand''TenantIdthe same for key-value lookups, so leftover 3.8 pause rows are adopted. (#266)
🚧 Known limitations
- With MongoDB or Dapper, session revocation is held in memory on each node. Signing out on one node doesn't revoke the session on the others, and a restart clears it. See the core 3.9.0 notes for the full list.
🙏 Credits
- Everyone who reported issues and tested the 3.9 previews.