Skip to content

Release prep for v3.0.0 (version bump, upgrades rename, changelog)#1126

Merged
erikdarlingdata merged 5 commits into
devfrom
release/3.0.0
Jun 16, 2026
Merged

Release prep for v3.0.0 (version bump, upgrades rename, changelog)#1126
erikdarlingdata merged 5 commits into
devfrom
release/3.0.0

Conversation

@erikdarlingdata

Copy link
Copy Markdown
Owner

Release prep for v3.0.0 (last release v2.11.0; dev is 288 commits ahead of main). Called 3.0.0 rather than 2.12.0 to reflect the scale — a codebase-wide hardening pass, a major UI-responsiveness overhaul, object/index-level collection, and the Recommendations/Apply-Fix engine — even though there are no breaking changes (existing installs upgrade in place).

What's in this PR

Validation

  • Installer unit tests: 61/61.
  • Installer integration tests against live SQL2022 (the CI-excluded IdempotencyTests / VersionDetectionTests / AdversarialTests, which use a throwaway PerformanceMonitor_Test DB): 19/19 at the 3.0.0 assembly — covers install idempotency, version detection, and adversarial upgrade paths (upgrade-failure-doesn't-drop-DB, cancellation-mid-upgrade, partial-install recovery, restricted-permissions), and confirms the renamed 2.11.0-to-3.0.0 folder is applied at 3.0.0.

Still needed before the release tag (NOT in this PR)

  • Manual upgrade test: a real v2.11.0 install → v3.0.0 (install the 2.11.0 schema with data, run the 3.0.0 installer, confirm the four upgrade scripts apply and the version stamps to 3.0.0). The 19 integration tests validate the engine but not this specific version-to-version path with pre-existing data — the mandatory #772 gate.
  • Review the [3.0.0] CHANGELOG wording.
  • After this merges to dev: the dev → main release PR (CI check-version-bump will now pass), then publish the GitHub release (not just a tag push) so SignPath signing + Velopack packaging fire.

🤖 Generated with Claude Code

erikdarlingdata and others added 5 commits June 15, 2026 20:58
- Bump Version/AssemblyVersion/FileVersion/InformationalVersion to 3.0.0 in
  Dashboard, Lite, Installer, and Installer.Core. The Installer/Installer.Core
  AssemblyVersion bump is load-bearing: ScriptProvider.FilterUpgrades only
  applies an upgrade folder whose ToVersion <= the installer's own assembly
  version, so without it the 2.11.0-to-3.0.0 folder would be silently skipped.
- Rename upgrades/2.11.0-to-2.12.0 -> upgrades/2.11.0-to-3.0.0.
- Write the [3.0.0] CHANGELOG section: an Important note plus the gaps the
  release audit flagged (code-review hardening sweep #1093-#1108, the
  off-UI-thread perf overhaul #1116/#1121, object/index-level collection #1103,
  the Recommendations/Apply-Fix engine, #1085, #1092/#1122, #1096, #754, #749,
  #768), and fix the stale "2.11.0 -> 2.12.0" upgrade-script reference.

Validation: Installer unit tests 61/61; Installer integration tests 19/19
against live SQL2022 (idempotency, version detection, adversarial upgrade
paths) at the 3.0.0 assembly version.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…FinOps object/index analysis)

Lite collector table/count 24->25 with the new index_object_stats row;
Dashboard collector count 32->33; FinOps description gains the per-object
table/index size/growth/usage/locking analysis (#1103).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…arseable events

The second-phase parsers (collect.process_blocked_process_xml -> sp_HumanEventsBlockViewer,
collect.process_deadlock_xml -> sp_BlitzLock) only marked a captured event processed when
the parse produced >= 1 row. Events that legitimately parse to zero rows -- a self-block or
non-lock wait (e.g. a memory-grant RESOURCE_SEMAPHORE wait that tripped blocked_process_threshold,
reported as a session blocking itself), or an unparseable deadlock graph -- were never marked,
so every cycle re-ran the CPU-intensive parser over the same dead events and re-logged a
perpetual NO_RESULTS; the staging table never drained.

Both processors now mark events processed after any clean parse run and log SUCCESS. The
XACT_STATE()/CATCH paths still roll back and retry genuine failures. The blocked-process
processor's half-open parse window (event_time < @end_date) also dropped single-timestamp
batches (MIN = MAX, the common case when a monitor loop emits all reports at one instant);
the upper bound is padded +1s to match the deadlock processor, which already did this.

Validated: sql2017's real 11-event self-block backlog drains (SUCCESS, no re-loop); sql2025's
733 real chains + 81k parsed deadlocks confirm the parse path is unchanged. Regression test
tools/test_blocked_process_processor.sql (real self-block + two-session samples at a single
timestamp) passes all assertions.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…" edition

SERVERPROPERTY('Edition') returns the legacy "SQL Azure" string on Azure SQL
Database, which showed verbatim in the FinOps Server Inventory Edition column.
Both the Server Inventory live query (LocalDataService.FinOps.ServerProperties)
and the server_properties collector (RemoteCollectorService.ServerProperties)
now map engine edition 5 to "Azure SQL Database (<service tier>)" using
DATABASEPROPERTYEX(DB_NAME(),'Edition') -- e.g. "Azure SQL Database (General
Purpose)". On-prem editions are unchanged; the recommendation engine only
string-matches "Enterprise", which neither value contains, so logic is unaffected.

Verified live against an Azure SQL DB GP-serverless test instance: the Server
Inventory Edition column now reads "Azure SQL Database (General Purpose)".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror the Lite edition fix (b144697) across the Dashboard and the SQL-side
collectors so "SQL Azure" is never shown or stored for an Azure SQL DB anywhere:
- Dashboard FinOps Server Inventory live query (DatabaseService.FinOps.Inventory)
- install/53_collect_server_properties.sql (stored server_properties.edition)
- install/42_scheduled_master_collector.sql (server inventory edition)

All map engine edition 5 to "Azure SQL Database (<service tier>)" via
DATABASEPROPERTYEX(DB_NAME(),'Edition'); on-prem editions take the unchanged ELSE
branch. The licensing-recommendation queries (Lite + Dashboard) are left raw and
identical -- they only do a Contains("Enterprise") check and never display the
edition for Azure.

Verified: Dashboard CASE returns "Azure SQL Database (General Purpose)" against a
live Azure SQL DB; both install scripts deploy clean (0 errors) to SQL2019 and
the Dashboard builds with 0 warnings/errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@erikdarlingdata erikdarlingdata merged commit 95a3bde into dev Jun 16, 2026
6 checks passed
@erikdarlingdata erikdarlingdata deleted the release/3.0.0 branch June 16, 2026 14:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant