Found while implementing [#1893], and deliberately left out of that PR.
[#1893] closed the last database-naming gap between the two blocking collectors: both now write Unresolved: <type> lock, database: <resource database> for a lock whose object they could not name, so a cross-database lock fingerprints once. One difference remains, and it is not about the database.
[#1865] gave the report side's sentinel a trailing reason — Unresolved: key lock, database: Foo (no metadata access), (page reallocated), (database unavailable), (page lookup needs sql server 2019). The DMV side has no equivalent and cannot acquire one: it never attempts the object lookup, so there is no failure to classify. So when both collectors see the same unresolvable lock AND the report side attached a reason, the labels differ by that suffix:
|
label |
blocked_process_report |
Unresolved: key lock, database: Foo (no metadata access) |
dmv_blocking_snapshots |
Unresolved: key lock, database: Foo |
[#1876]'s normalizer deliberately preserves the suffix (pinned by A_Label_Already_In_Report_Form_Is_Returned_Untouched, which includes a (page reallocated) case), so these hash to two DedupKeys — a third-order version of the same defect [#1876] and [#1893] each narrowed.
Why it is narrow
It needs the report side to have attached a reason at all, which happens in two situations:
(no metadata access) — the monitoring login has no user in the contended database. Permanent while the posture lasts, so the split is stable rather than churning: one extra incident, not a stream of them.
(page reallocated) — transient by definition, and the DMV sweep is unlikely to catch the same instant.
The common case — an object that simply could not be resolved, with no reason recorded — already produces byte-identical labels on both sides, which is what [#1893] verified live.
Why it needs a decision rather than a patch
The obvious fix is to drop the reason from the incident identity while keeping it on the row. That is a real design question, not a tweak:
Not a regression. Before [#1876] these rows did not dedup at all.
Found while implementing [#1893], and deliberately left out of that PR.
[#1893] closed the last database-naming gap between the two blocking collectors: both now write
Unresolved: <type> lock, database: <resource database>for a lock whose object they could not name, so a cross-database lock fingerprints once. One difference remains, and it is not about the database.[#1865] gave the report side's sentinel a trailing reason —
Unresolved: key lock, database: Foo (no metadata access),(page reallocated),(database unavailable),(page lookup needs sql server 2019). The DMV side has no equivalent and cannot acquire one: it never attempts the object lookup, so there is no failure to classify. So when both collectors see the same unresolvable lock AND the report side attached a reason, the labels differ by that suffix:blocked_process_reportUnresolved: key lock, database: Foo (no metadata access)dmv_blocking_snapshotsUnresolved: key lock, database: Foo[#1876]'s normalizer deliberately preserves the suffix (pinned by
A_Label_Already_In_Report_Form_Is_Returned_Untouched, which includes a(page reallocated)case), so these hash to twoDedupKeys — a third-order version of the same defect [#1876] and [#1893] each narrowed.Why it is narrow
It needs the report side to have attached a reason at all, which happens in two situations:
(no metadata access)— the monitoring login has no user in the contended database. Permanent while the posture lasts, so the split is stable rather than churning: one extra incident, not a stream of them.(page reallocated)— transient by definition, and the DMV sweep is unlikely to catch the same instant.The common case — an object that simply could not be resolved, with no reason recorded — already produces byte-identical labels on both sides, which is what [#1893] verified live.
Why it needs a decision rather than a patch
The obvious fix is to drop the reason from the incident identity while keeping it on the row. That is a real design question, not a tweak:
IncidentGroupinguses one string for the identity, theContentious Objectdetail field andInvolvedObjects. Splitting identity from display means the grouper carries two values where it carries one today.Not a regression. Before [#1876] these rows did not dedup at all.