Skip to content

3.9.0

Latest

Choose a tag to compare

@sfmskywalker sfmskywalker released this 04 Oct 03:43
89d4eb9

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_7 no longer re-adds AggregateFaultCount. 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 DateTimeOffset values are handled correctly.
  • Key-value store and bookmark-queue enqueue work on migrated databases (#263, #264, via #266). The new runtime migration 20008 creates KeyValues and adds BookmarkQueueItems.SerializedOptions where they're missing. Prefix lookups (StartsWith) work.

All stores

  • TryMarkInterruptedAsync refuses Finished rows in Dapper, Elasticsearch and MongoDB, whatever allowFinishedCancelled is set to. This matches core #8421. (#225, via #226)
  • Atomic TryDeleteAsync for 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.
  • ISqlDialect has a new member with a default implementation. Update(table, fields, getParamName) builds a standard UPDATE by default, so third-party dialects keep compiling and already-built assemblies keep loading. (#235, via #236) New QuoteIdentifier and BooleanLiteral hooks also have defaults; only PostgreSqlDialect overrides them. (#258)

MongoDB migration (#248)

  • Records with an empty-string TenantId are treated as null. 3.9 previews stored TenantId: "" for default-tenant roles and users, and that can affect single-tenant installs too. Migrate those rows to null, 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 log E11000 at startup.
  • Bulk saves aren't all-or-nothing. MongoDB writes SaveMany batches 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 Id instead of ID. This also fixes instance search on case-sensitive SQL Server collations. (#258)
  • Migration 20008 runs on your next migrate. Its Down() is a no-op, and KeyValuePairs is not touched. (#266)
  • Default-tenant Dapper queries treat NULL and '' TenantId the 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.