Address open review feedback from PR #8263 (TRX streaming store) - #8285

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup
May 18, 2026
Merged

Address open review feedback from PR #8263 (TRX streaming store)#8285
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow-up to #8263 addressing the open review threads on the merged PR.

Changes

  • TrxTestResultExtractor doc comment — the serializer per-record cap is 64 MiB (TrxTestResultSerializer.MaxRecordLengthBytes), not 16 MiB as the comment stated. Updated so the rationale for MaxCapturedFieldChars cites the correct number. (Copilot review threads x2)
  • TrxResultStreamingStore.WriteRecordWithRetryAsync nullable consistency — the two bare ExceptionDispatchInfo.Capture(lastError).Throw() rethrows now use the null-forgiving operator, matching the final Capture(lastError!).Throw() at the end of the method. (Copilot review thread)
  • TRX streaming-store writer no longer blocks a threadpool thread — switched from ITask.Run to ITask.RunLongRunning so the BlockingCollection<T>.TryTake poll loop (which blocks for up to _flushIntervalMs while idle) runs on its own dedicated background thread instead of starving the threadpool. (Youssef Fahmy (@Youssef1313) review thread)

cc Youssef Fahmy (@Youssef1313)

- Fix doc comment in TrxTestResultExtractor: the serializer per-record cap
is 64 MiB, not 16 MiB.
- Apply the null-forgiving operator consistently on the bare `lastError`
rethrows in `TrxResultStreamingStore.WriteRecordWithRetryAsync` so the
nullable-flow analysis stays satisfied across all rethrow paths.
- Switch the TRX streaming-store writer task from `Task.Run` to
`ITask.RunLongRunning` so the `BlockingCollection<T>.TryTake` poll
loop no longer blocks a shared threadpool thread.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 11:17

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Follow-up to PR #8263 that tightens documentation/nullable consistency in the TRX streaming store, and attempts to move the streaming-writer loop off the shared threadpool to reduce contention during idle waits.

Changes:

  • Corrected TrxTestResultExtractor comment to reflect the serializer’s 64 MiB per-record cap.
  • Made ExceptionDispatchInfo.Capture(lastError) rethrows nullable-consistent via lastError!.
  • Switched the streaming-store writer startup from ITask.Run to ITask.RunLongRunning.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxTestResultExtractor.csUpdates rationale comment to reference the correct serializer record-size cap (64 MiB).
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxResultStreamingStore.csStarts the writer via RunLongRunning and aligns nullable usage in retry rethrow paths.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

✅ 21/21 dimensions clean — no findings.

All three changes are correct:

  • RunLongRunning: The API exists on ITask/SystemTask and correctly spawns a dedicated background thread, keeping the blocking BlockingCollection.TryTake off the shared threadpool. Rationale in the comment is accurate.
  • lastError!: Both null-forgiving operators are safe. The catch sites are only reachable after at least one loop iteration that unconditionally assigns lastError; null is impossible there.
  • Comment 16 MiB64 MiB: Matches the actual MaxRecordLengthBytes = 64 * 1024 * 1024 constant in TrxTestResultSerializer.cs; the MaxCapturedFieldChars = 1 MiB truncation cap is still well below 64 MiB.

Generated by Expert Code Review (on open) for issue #8285 · ● 8.6M

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 16, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 6fbd731. The TRX streaming writer loop is now await-free/synchronous while running on the long-running background thread, so the BlockingCollection.TryTake polling and retry/flush/log waits stay off the shared threadpool. Targeted build and TRX report tests pass.

CopilotAI review requested due to automatic review settings May 16, 2026 14:26

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 17, 2026 19:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 17, 2026 19:32

CopilotAI commented May 17, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 0222b80. The TRX streaming store now uses best-effort synchronous error logging instead of blocking on LogErrorAsync, and the write-failure message now says "after up to" the retry count. Targeted build/tests and final validation pass.

CopilotAI review requested due to automatic review settings May 18, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Wrap writer-thread log calls in try/catch so a faulting logger (e.g. FileLogger semaphore/I/O timeouts) cannot escape WriteLoopAsync and crash the dedicated long-running thread via SystemTask.RunLongRunning.
Adds TryLogDebug / TryLogWarning helpers mirroring TryLogError, and routes:
- WriteLoopAsync shutdown LogDebug
- TryDelete error LogDebug
- LogDrop debug log
- CompleteAsync timeout LogWarningAsync (converted to sync TryLogWarning since CompleteAsync no longer needs to await it)
Addresses Copilot review feedback on PR #8285.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit 1eea36b into mainMay 18, 2026
75 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/trx-followup branch May 18, 2026 17:36
Sign up for freeto 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.

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Address open review feedback from PR #8263 (TRX streaming store) - #8285

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup
May 18, 2026
Merged

Address open review feedback from PR #8263 (TRX streaming store)#8285
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow-up to #8263 addressing the open review threads on the merged PR.

Changes

  • TrxTestResultExtractor doc comment — the serializer per-record cap is 64 MiB (TrxTestResultSerializer.MaxRecordLengthBytes), not 16 MiB as the comment stated. Updated so the rationale for MaxCapturedFieldChars cites the correct number. (Copilot review threads x2)
  • TrxResultStreamingStore.WriteRecordWithRetryAsync nullable consistency — the two bare ExceptionDispatchInfo.Capture(lastError).Throw() rethrows now use the null-forgiving operator, matching the final Capture(lastError!).Throw() at the end of the method. (Copilot review thread)
  • TRX streaming-store writer no longer blocks a threadpool thread — switched from ITask.Run to ITask.RunLongRunning so the BlockingCollection<T>.TryTake poll loop (which blocks for up to _flushIntervalMs while idle) runs on its own dedicated background thread instead of starving the threadpool. (Youssef Fahmy (@Youssef1313) review thread)

cc Youssef Fahmy (@Youssef1313)

- Fix doc comment in TrxTestResultExtractor: the serializer per-record cap
is 64 MiB, not 16 MiB.
- Apply the null-forgiving operator consistently on the bare `lastError`
rethrows in `TrxResultStreamingStore.WriteRecordWithRetryAsync` so the
nullable-flow analysis stays satisfied across all rethrow paths.
- Switch the TRX streaming-store writer task from `Task.Run` to
`ITask.RunLongRunning` so the `BlockingCollection<T>.TryTake` poll
loop no longer blocks a shared threadpool thread.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 11:17

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Follow-up to PR #8263 that tightens documentation/nullable consistency in the TRX streaming store, and attempts to move the streaming-writer loop off the shared threadpool to reduce contention during idle waits.

Changes:

  • Corrected TrxTestResultExtractor comment to reflect the serializer’s 64 MiB per-record cap.
  • Made ExceptionDispatchInfo.Capture(lastError) rethrows nullable-consistent via lastError!.
  • Switched the streaming-store writer startup from ITask.Run to ITask.RunLongRunning.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxTestResultExtractor.csUpdates rationale comment to reference the correct serializer record-size cap (64 MiB).
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxResultStreamingStore.csStarts the writer via RunLongRunning and aligns nullable usage in retry rethrow paths.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

✅ 21/21 dimensions clean — no findings.

All three changes are correct:

  • RunLongRunning: The API exists on ITask/SystemTask and correctly spawns a dedicated background thread, keeping the blocking BlockingCollection.TryTake off the shared threadpool. Rationale in the comment is accurate.
  • lastError!: Both null-forgiving operators are safe. The catch sites are only reachable after at least one loop iteration that unconditionally assigns lastError; null is impossible there.
  • Comment 16 MiB64 MiB: Matches the actual MaxRecordLengthBytes = 64 * 1024 * 1024 constant in TrxTestResultSerializer.cs; the MaxCapturedFieldChars = 1 MiB truncation cap is still well below 64 MiB.

Generated by Expert Code Review (on open) for issue #8285 · ● 8.6M

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 16, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 6fbd731. The TRX streaming writer loop is now await-free/synchronous while running on the long-running background thread, so the BlockingCollection.TryTake polling and retry/flush/log waits stay off the shared threadpool. Targeted build and TRX report tests pass.

CopilotAI review requested due to automatic review settings May 16, 2026 14:26

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 17, 2026 19:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 17, 2026 19:32

CopilotAI commented May 17, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 0222b80. The TRX streaming store now uses best-effort synchronous error logging instead of blocking on LogErrorAsync, and the write-failure message now says "after up to" the retry count. Targeted build/tests and final validation pass.

CopilotAI review requested due to automatic review settings May 18, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Wrap writer-thread log calls in try/catch so a faulting logger (e.g. FileLogger semaphore/I/O timeouts) cannot escape WriteLoopAsync and crash the dedicated long-running thread via SystemTask.RunLongRunning.
Adds TryLogDebug / TryLogWarning helpers mirroring TryLogError, and routes:
- WriteLoopAsync shutdown LogDebug
- TryDelete error LogDebug
- LogDrop debug log
- CompleteAsync timeout LogWarningAsync (converted to sync TryLogWarning since CompleteAsync no longer needs to await it)
Addresses Copilot review feedback on PR #8285.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit 1eea36b into mainMay 18, 2026
75 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/trx-followup branch May 18, 2026 17:36
Sign up for freeto 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.

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Address open review feedback from PR #8263 (TRX streaming store) - #8285

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup
May 18, 2026
Merged

Address open review feedback from PR #8263 (TRX streaming store)#8285
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow-up to #8263 addressing the open review threads on the merged PR.

Changes

  • TrxTestResultExtractor doc comment — the serializer per-record cap is 64 MiB (TrxTestResultSerializer.MaxRecordLengthBytes), not 16 MiB as the comment stated. Updated so the rationale for MaxCapturedFieldChars cites the correct number. (Copilot review threads x2)
  • TrxResultStreamingStore.WriteRecordWithRetryAsync nullable consistency — the two bare ExceptionDispatchInfo.Capture(lastError).Throw() rethrows now use the null-forgiving operator, matching the final Capture(lastError!).Throw() at the end of the method. (Copilot review thread)
  • TRX streaming-store writer no longer blocks a threadpool thread — switched from ITask.Run to ITask.RunLongRunning so the BlockingCollection<T>.TryTake poll loop (which blocks for up to _flushIntervalMs while idle) runs on its own dedicated background thread instead of starving the threadpool. (Youssef Fahmy (@Youssef1313) review thread)

cc Youssef Fahmy (@Youssef1313)

- Fix doc comment in TrxTestResultExtractor: the serializer per-record cap
is 64 MiB, not 16 MiB.
- Apply the null-forgiving operator consistently on the bare `lastError`
rethrows in `TrxResultStreamingStore.WriteRecordWithRetryAsync` so the
nullable-flow analysis stays satisfied across all rethrow paths.
- Switch the TRX streaming-store writer task from `Task.Run` to
`ITask.RunLongRunning` so the `BlockingCollection<T>.TryTake` poll
loop no longer blocks a shared threadpool thread.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 11:17

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Follow-up to PR #8263 that tightens documentation/nullable consistency in the TRX streaming store, and attempts to move the streaming-writer loop off the shared threadpool to reduce contention during idle waits.

Changes:

  • Corrected TrxTestResultExtractor comment to reflect the serializer’s 64 MiB per-record cap.
  • Made ExceptionDispatchInfo.Capture(lastError) rethrows nullable-consistent via lastError!.
  • Switched the streaming-store writer startup from ITask.Run to ITask.RunLongRunning.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxTestResultExtractor.csUpdates rationale comment to reference the correct serializer record-size cap (64 MiB).
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxResultStreamingStore.csStarts the writer via RunLongRunning and aligns nullable usage in retry rethrow paths.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

✅ 21/21 dimensions clean — no findings.

All three changes are correct:

  • RunLongRunning: The API exists on ITask/SystemTask and correctly spawns a dedicated background thread, keeping the blocking BlockingCollection.TryTake off the shared threadpool. Rationale in the comment is accurate.
  • lastError!: Both null-forgiving operators are safe. The catch sites are only reachable after at least one loop iteration that unconditionally assigns lastError; null is impossible there.
  • Comment 16 MiB64 MiB: Matches the actual MaxRecordLengthBytes = 64 * 1024 * 1024 constant in TrxTestResultSerializer.cs; the MaxCapturedFieldChars = 1 MiB truncation cap is still well below 64 MiB.

Generated by Expert Code Review (on open) for issue #8285 · ● 8.6M

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 16, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 6fbd731. The TRX streaming writer loop is now await-free/synchronous while running on the long-running background thread, so the BlockingCollection.TryTake polling and retry/flush/log waits stay off the shared threadpool. Targeted build and TRX report tests pass.

CopilotAI review requested due to automatic review settings May 16, 2026 14:26

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 17, 2026 19:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 17, 2026 19:32

CopilotAI commented May 17, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 0222b80. The TRX streaming store now uses best-effort synchronous error logging instead of blocking on LogErrorAsync, and the write-failure message now says "after up to" the retry count. Targeted build/tests and final validation pass.

CopilotAI review requested due to automatic review settings May 18, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Wrap writer-thread log calls in try/catch so a faulting logger (e.g. FileLogger semaphore/I/O timeouts) cannot escape WriteLoopAsync and crash the dedicated long-running thread via SystemTask.RunLongRunning.
Adds TryLogDebug / TryLogWarning helpers mirroring TryLogError, and routes:
- WriteLoopAsync shutdown LogDebug
- TryDelete error LogDebug
- LogDrop debug log
- CompleteAsync timeout LogWarningAsync (converted to sync TryLogWarning since CompleteAsync no longer needs to await it)
Addresses Copilot review feedback on PR #8285.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit 1eea36b into mainMay 18, 2026
75 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/trx-followup branch May 18, 2026 17:36
Sign up for freeto 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.

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Address open review feedback from PR #8263 (TRX streaming store) - #8285

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup
May 18, 2026
Merged

Address open review feedback from PR #8263 (TRX streaming store)#8285
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow-up to #8263 addressing the open review threads on the merged PR.

Changes

  • TrxTestResultExtractor doc comment — the serializer per-record cap is 64 MiB (TrxTestResultSerializer.MaxRecordLengthBytes), not 16 MiB as the comment stated. Updated so the rationale for MaxCapturedFieldChars cites the correct number. (Copilot review threads x2)
  • TrxResultStreamingStore.WriteRecordWithRetryAsync nullable consistency — the two bare ExceptionDispatchInfo.Capture(lastError).Throw() rethrows now use the null-forgiving operator, matching the final Capture(lastError!).Throw() at the end of the method. (Copilot review thread)
  • TRX streaming-store writer no longer blocks a threadpool thread — switched from ITask.Run to ITask.RunLongRunning so the BlockingCollection<T>.TryTake poll loop (which blocks for up to _flushIntervalMs while idle) runs on its own dedicated background thread instead of starving the threadpool. (Youssef Fahmy (@Youssef1313) review thread)

cc Youssef Fahmy (@Youssef1313)

- Fix doc comment in TrxTestResultExtractor: the serializer per-record cap
is 64 MiB, not 16 MiB.
- Apply the null-forgiving operator consistently on the bare `lastError`
rethrows in `TrxResultStreamingStore.WriteRecordWithRetryAsync` so the
nullable-flow analysis stays satisfied across all rethrow paths.
- Switch the TRX streaming-store writer task from `Task.Run` to
`ITask.RunLongRunning` so the `BlockingCollection<T>.TryTake` poll
loop no longer blocks a shared threadpool thread.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 11:17

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Follow-up to PR #8263 that tightens documentation/nullable consistency in the TRX streaming store, and attempts to move the streaming-writer loop off the shared threadpool to reduce contention during idle waits.

Changes:

  • Corrected TrxTestResultExtractor comment to reflect the serializer’s 64 MiB per-record cap.
  • Made ExceptionDispatchInfo.Capture(lastError) rethrows nullable-consistent via lastError!.
  • Switched the streaming-store writer startup from ITask.Run to ITask.RunLongRunning.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxTestResultExtractor.csUpdates rationale comment to reference the correct serializer record-size cap (64 MiB).
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxResultStreamingStore.csStarts the writer via RunLongRunning and aligns nullable usage in retry rethrow paths.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

✅ 21/21 dimensions clean — no findings.

All three changes are correct:

  • RunLongRunning: The API exists on ITask/SystemTask and correctly spawns a dedicated background thread, keeping the blocking BlockingCollection.TryTake off the shared threadpool. Rationale in the comment is accurate.
  • lastError!: Both null-forgiving operators are safe. The catch sites are only reachable after at least one loop iteration that unconditionally assigns lastError; null is impossible there.
  • Comment 16 MiB64 MiB: Matches the actual MaxRecordLengthBytes = 64 * 1024 * 1024 constant in TrxTestResultSerializer.cs; the MaxCapturedFieldChars = 1 MiB truncation cap is still well below 64 MiB.

Generated by Expert Code Review (on open) for issue #8285 · ● 8.6M

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 16, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 6fbd731. The TRX streaming writer loop is now await-free/synchronous while running on the long-running background thread, so the BlockingCollection.TryTake polling and retry/flush/log waits stay off the shared threadpool. Targeted build and TRX report tests pass.

CopilotAI review requested due to automatic review settings May 16, 2026 14:26

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 17, 2026 19:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 17, 2026 19:32

CopilotAI commented May 17, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 0222b80. The TRX streaming store now uses best-effort synchronous error logging instead of blocking on LogErrorAsync, and the write-failure message now says "after up to" the retry count. Targeted build/tests and final validation pass.

CopilotAI review requested due to automatic review settings May 18, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Wrap writer-thread log calls in try/catch so a faulting logger (e.g. FileLogger semaphore/I/O timeouts) cannot escape WriteLoopAsync and crash the dedicated long-running thread via SystemTask.RunLongRunning.
Adds TryLogDebug / TryLogWarning helpers mirroring TryLogError, and routes:
- WriteLoopAsync shutdown LogDebug
- TryDelete error LogDebug
- LogDrop debug log
- CompleteAsync timeout LogWarningAsync (converted to sync TryLogWarning since CompleteAsync no longer needs to await it)
Addresses Copilot review feedback on PR #8285.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit 1eea36b into mainMay 18, 2026
75 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/trx-followup branch May 18, 2026 17:36
Sign up for freeto 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.

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Address open review feedback from PR #8263 (TRX streaming store) - #8285

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup
May 18, 2026
Merged

Address open review feedback from PR #8263 (TRX streaming store)#8285
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow-up to #8263 addressing the open review threads on the merged PR.

Changes

  • TrxTestResultExtractor doc comment — the serializer per-record cap is 64 MiB (TrxTestResultSerializer.MaxRecordLengthBytes), not 16 MiB as the comment stated. Updated so the rationale for MaxCapturedFieldChars cites the correct number. (Copilot review threads x2)
  • TrxResultStreamingStore.WriteRecordWithRetryAsync nullable consistency — the two bare ExceptionDispatchInfo.Capture(lastError).Throw() rethrows now use the null-forgiving operator, matching the final Capture(lastError!).Throw() at the end of the method. (Copilot review thread)
  • TRX streaming-store writer no longer blocks a threadpool thread — switched from ITask.Run to ITask.RunLongRunning so the BlockingCollection<T>.TryTake poll loop (which blocks for up to _flushIntervalMs while idle) runs on its own dedicated background thread instead of starving the threadpool. (Youssef Fahmy (@Youssef1313) review thread)

cc Youssef Fahmy (@Youssef1313)

- Fix doc comment in TrxTestResultExtractor: the serializer per-record cap
is 64 MiB, not 16 MiB.
- Apply the null-forgiving operator consistently on the bare `lastError`
rethrows in `TrxResultStreamingStore.WriteRecordWithRetryAsync` so the
nullable-flow analysis stays satisfied across all rethrow paths.
- Switch the TRX streaming-store writer task from `Task.Run` to
`ITask.RunLongRunning` so the `BlockingCollection<T>.TryTake` poll
loop no longer blocks a shared threadpool thread.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 11:17

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Follow-up to PR #8263 that tightens documentation/nullable consistency in the TRX streaming store, and attempts to move the streaming-writer loop off the shared threadpool to reduce contention during idle waits.

Changes:

  • Corrected TrxTestResultExtractor comment to reflect the serializer’s 64 MiB per-record cap.
  • Made ExceptionDispatchInfo.Capture(lastError) rethrows nullable-consistent via lastError!.
  • Switched the streaming-store writer startup from ITask.Run to ITask.RunLongRunning.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxTestResultExtractor.csUpdates rationale comment to reference the correct serializer record-size cap (64 MiB).
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxResultStreamingStore.csStarts the writer via RunLongRunning and aligns nullable usage in retry rethrow paths.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

✅ 21/21 dimensions clean — no findings.

All three changes are correct:

  • RunLongRunning: The API exists on ITask/SystemTask and correctly spawns a dedicated background thread, keeping the blocking BlockingCollection.TryTake off the shared threadpool. Rationale in the comment is accurate.
  • lastError!: Both null-forgiving operators are safe. The catch sites are only reachable after at least one loop iteration that unconditionally assigns lastError; null is impossible there.
  • Comment 16 MiB64 MiB: Matches the actual MaxRecordLengthBytes = 64 * 1024 * 1024 constant in TrxTestResultSerializer.cs; the MaxCapturedFieldChars = 1 MiB truncation cap is still well below 64 MiB.

Generated by Expert Code Review (on open) for issue #8285 · ● 8.6M

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 16, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 6fbd731. The TRX streaming writer loop is now await-free/synchronous while running on the long-running background thread, so the BlockingCollection.TryTake polling and retry/flush/log waits stay off the shared threadpool. Targeted build and TRX report tests pass.

CopilotAI review requested due to automatic review settings May 16, 2026 14:26

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 17, 2026 19:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 17, 2026 19:32

CopilotAI commented May 17, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 0222b80. The TRX streaming store now uses best-effort synchronous error logging instead of blocking on LogErrorAsync, and the write-failure message now says "after up to" the retry count. Targeted build/tests and final validation pass.

CopilotAI review requested due to automatic review settings May 18, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Wrap writer-thread log calls in try/catch so a faulting logger (e.g. FileLogger semaphore/I/O timeouts) cannot escape WriteLoopAsync and crash the dedicated long-running thread via SystemTask.RunLongRunning.
Adds TryLogDebug / TryLogWarning helpers mirroring TryLogError, and routes:
- WriteLoopAsync shutdown LogDebug
- TryDelete error LogDebug
- LogDrop debug log
- CompleteAsync timeout LogWarningAsync (converted to sync TryLogWarning since CompleteAsync no longer needs to await it)
Addresses Copilot review feedback on PR #8285.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit 1eea36b into mainMay 18, 2026
75 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/trx-followup branch May 18, 2026 17:36
Sign up for freeto 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.

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Address open review feedback from PR #8263 (TRX streaming store) - #8285

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup
May 18, 2026
Merged

Address open review feedback from PR #8263 (TRX streaming store)#8285
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow-up to #8263 addressing the open review threads on the merged PR.

Changes

  • TrxTestResultExtractor doc comment — the serializer per-record cap is 64 MiB (TrxTestResultSerializer.MaxRecordLengthBytes), not 16 MiB as the comment stated. Updated so the rationale for MaxCapturedFieldChars cites the correct number. (Copilot review threads x2)
  • TrxResultStreamingStore.WriteRecordWithRetryAsync nullable consistency — the two bare ExceptionDispatchInfo.Capture(lastError).Throw() rethrows now use the null-forgiving operator, matching the final Capture(lastError!).Throw() at the end of the method. (Copilot review thread)
  • TRX streaming-store writer no longer blocks a threadpool thread — switched from ITask.Run to ITask.RunLongRunning so the BlockingCollection<T>.TryTake poll loop (which blocks for up to _flushIntervalMs while idle) runs on its own dedicated background thread instead of starving the threadpool. (Youssef Fahmy (@Youssef1313) review thread)

cc Youssef Fahmy (@Youssef1313)

- Fix doc comment in TrxTestResultExtractor: the serializer per-record cap
is 64 MiB, not 16 MiB.
- Apply the null-forgiving operator consistently on the bare `lastError`
rethrows in `TrxResultStreamingStore.WriteRecordWithRetryAsync` so the
nullable-flow analysis stays satisfied across all rethrow paths.
- Switch the TRX streaming-store writer task from `Task.Run` to
`ITask.RunLongRunning` so the `BlockingCollection<T>.TryTake` poll
loop no longer blocks a shared threadpool thread.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 11:17

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Follow-up to PR #8263 that tightens documentation/nullable consistency in the TRX streaming store, and attempts to move the streaming-writer loop off the shared threadpool to reduce contention during idle waits.

Changes:

  • Corrected TrxTestResultExtractor comment to reflect the serializer’s 64 MiB per-record cap.
  • Made ExceptionDispatchInfo.Capture(lastError) rethrows nullable-consistent via lastError!.
  • Switched the streaming-store writer startup from ITask.Run to ITask.RunLongRunning.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxTestResultExtractor.csUpdates rationale comment to reference the correct serializer record-size cap (64 MiB).
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxResultStreamingStore.csStarts the writer via RunLongRunning and aligns nullable usage in retry rethrow paths.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

✅ 21/21 dimensions clean — no findings.

All three changes are correct:

  • RunLongRunning: The API exists on ITask/SystemTask and correctly spawns a dedicated background thread, keeping the blocking BlockingCollection.TryTake off the shared threadpool. Rationale in the comment is accurate.
  • lastError!: Both null-forgiving operators are safe. The catch sites are only reachable after at least one loop iteration that unconditionally assigns lastError; null is impossible there.
  • Comment 16 MiB64 MiB: Matches the actual MaxRecordLengthBytes = 64 * 1024 * 1024 constant in TrxTestResultSerializer.cs; the MaxCapturedFieldChars = 1 MiB truncation cap is still well below 64 MiB.

Generated by Expert Code Review (on open) for issue #8285 · ● 8.6M

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 16, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 6fbd731. The TRX streaming writer loop is now await-free/synchronous while running on the long-running background thread, so the BlockingCollection.TryTake polling and retry/flush/log waits stay off the shared threadpool. Targeted build and TRX report tests pass.

CopilotAI review requested due to automatic review settings May 16, 2026 14:26

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 17, 2026 19:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 17, 2026 19:32

CopilotAI commented May 17, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 0222b80. The TRX streaming store now uses best-effort synchronous error logging instead of blocking on LogErrorAsync, and the write-failure message now says "after up to" the retry count. Targeted build/tests and final validation pass.

CopilotAI review requested due to automatic review settings May 18, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Wrap writer-thread log calls in try/catch so a faulting logger (e.g. FileLogger semaphore/I/O timeouts) cannot escape WriteLoopAsync and crash the dedicated long-running thread via SystemTask.RunLongRunning.
Adds TryLogDebug / TryLogWarning helpers mirroring TryLogError, and routes:
- WriteLoopAsync shutdown LogDebug
- TryDelete error LogDebug
- LogDrop debug log
- CompleteAsync timeout LogWarningAsync (converted to sync TryLogWarning since CompleteAsync no longer needs to await it)
Addresses Copilot review feedback on PR #8285.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit 1eea36b into mainMay 18, 2026
75 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/trx-followup branch May 18, 2026 17:36
Sign up for freeto 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.

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Address open review feedback from PR #8263 (TRX streaming store) - #8285

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup
May 18, 2026
Merged

Address open review feedback from PR #8263 (TRX streaming store)#8285
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow-up to #8263 addressing the open review threads on the merged PR.

Changes

  • TrxTestResultExtractor doc comment — the serializer per-record cap is 64 MiB (TrxTestResultSerializer.MaxRecordLengthBytes), not 16 MiB as the comment stated. Updated so the rationale for MaxCapturedFieldChars cites the correct number. (Copilot review threads x2)
  • TrxResultStreamingStore.WriteRecordWithRetryAsync nullable consistency — the two bare ExceptionDispatchInfo.Capture(lastError).Throw() rethrows now use the null-forgiving operator, matching the final Capture(lastError!).Throw() at the end of the method. (Copilot review thread)
  • TRX streaming-store writer no longer blocks a threadpool thread — switched from ITask.Run to ITask.RunLongRunning so the BlockingCollection<T>.TryTake poll loop (which blocks for up to _flushIntervalMs while idle) runs on its own dedicated background thread instead of starving the threadpool. (Youssef Fahmy (@Youssef1313) review thread)

cc Youssef Fahmy (@Youssef1313)

- Fix doc comment in TrxTestResultExtractor: the serializer per-record cap
is 64 MiB, not 16 MiB.
- Apply the null-forgiving operator consistently on the bare `lastError`
rethrows in `TrxResultStreamingStore.WriteRecordWithRetryAsync` so the
nullable-flow analysis stays satisfied across all rethrow paths.
- Switch the TRX streaming-store writer task from `Task.Run` to
`ITask.RunLongRunning` so the `BlockingCollection<T>.TryTake` poll
loop no longer blocks a shared threadpool thread.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 11:17

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Follow-up to PR #8263 that tightens documentation/nullable consistency in the TRX streaming store, and attempts to move the streaming-writer loop off the shared threadpool to reduce contention during idle waits.

Changes:

  • Corrected TrxTestResultExtractor comment to reflect the serializer’s 64 MiB per-record cap.
  • Made ExceptionDispatchInfo.Capture(lastError) rethrows nullable-consistent via lastError!.
  • Switched the streaming-store writer startup from ITask.Run to ITask.RunLongRunning.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxTestResultExtractor.csUpdates rationale comment to reference the correct serializer record-size cap (64 MiB).
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxResultStreamingStore.csStarts the writer via RunLongRunning and aligns nullable usage in retry rethrow paths.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

✅ 21/21 dimensions clean — no findings.

All three changes are correct:

  • RunLongRunning: The API exists on ITask/SystemTask and correctly spawns a dedicated background thread, keeping the blocking BlockingCollection.TryTake off the shared threadpool. Rationale in the comment is accurate.
  • lastError!: Both null-forgiving operators are safe. The catch sites are only reachable after at least one loop iteration that unconditionally assigns lastError; null is impossible there.
  • Comment 16 MiB64 MiB: Matches the actual MaxRecordLengthBytes = 64 * 1024 * 1024 constant in TrxTestResultSerializer.cs; the MaxCapturedFieldChars = 1 MiB truncation cap is still well below 64 MiB.

Generated by Expert Code Review (on open) for issue #8285 · ● 8.6M

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 16, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 6fbd731. The TRX streaming writer loop is now await-free/synchronous while running on the long-running background thread, so the BlockingCollection.TryTake polling and retry/flush/log waits stay off the shared threadpool. Targeted build and TRX report tests pass.

CopilotAI review requested due to automatic review settings May 16, 2026 14:26

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 17, 2026 19:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 17, 2026 19:32

CopilotAI commented May 17, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 0222b80. The TRX streaming store now uses best-effort synchronous error logging instead of blocking on LogErrorAsync, and the write-failure message now says "after up to" the retry count. Targeted build/tests and final validation pass.

CopilotAI review requested due to automatic review settings May 18, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Wrap writer-thread log calls in try/catch so a faulting logger (e.g. FileLogger semaphore/I/O timeouts) cannot escape WriteLoopAsync and crash the dedicated long-running thread via SystemTask.RunLongRunning.
Adds TryLogDebug / TryLogWarning helpers mirroring TryLogError, and routes:
- WriteLoopAsync shutdown LogDebug
- TryDelete error LogDebug
- LogDrop debug log
- CompleteAsync timeout LogWarningAsync (converted to sync TryLogWarning since CompleteAsync no longer needs to await it)
Addresses Copilot review feedback on PR #8285.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit 1eea36b into mainMay 18, 2026
75 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/trx-followup branch May 18, 2026 17:36
Sign up for freeto 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.

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Address open review feedback from PR #8263 (TRX streaming store) - #8285

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup
May 18, 2026
Merged

Address open review feedback from PR #8263 (TRX streaming store)#8285
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
dev/amauryleve/trx-followup

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Follow-up to #8263 addressing the open review threads on the merged PR.

Changes

  • TrxTestResultExtractor doc comment — the serializer per-record cap is 64 MiB (TrxTestResultSerializer.MaxRecordLengthBytes), not 16 MiB as the comment stated. Updated so the rationale for MaxCapturedFieldChars cites the correct number. (Copilot review threads x2)
  • TrxResultStreamingStore.WriteRecordWithRetryAsync nullable consistency — the two bare ExceptionDispatchInfo.Capture(lastError).Throw() rethrows now use the null-forgiving operator, matching the final Capture(lastError!).Throw() at the end of the method. (Copilot review thread)
  • TRX streaming-store writer no longer blocks a threadpool thread — switched from ITask.Run to ITask.RunLongRunning so the BlockingCollection<T>.TryTake poll loop (which blocks for up to _flushIntervalMs while idle) runs on its own dedicated background thread instead of starving the threadpool. (Youssef Fahmy (@Youssef1313) review thread)

cc Youssef Fahmy (@Youssef1313)

- Fix doc comment in TrxTestResultExtractor: the serializer per-record cap
is 64 MiB, not 16 MiB.
- Apply the null-forgiving operator consistently on the bare `lastError`
rethrows in `TrxResultStreamingStore.WriteRecordWithRetryAsync` so the
nullable-flow analysis stays satisfied across all rethrow paths.
- Switch the TRX streaming-store writer task from `Task.Run` to
`ITask.RunLongRunning` so the `BlockingCollection<T>.TryTake` poll
loop no longer blocks a shared threadpool thread.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 11:17

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Follow-up to PR #8263 that tightens documentation/nullable consistency in the TRX streaming store, and attempts to move the streaming-writer loop off the shared threadpool to reduce contention during idle waits.

Changes:

  • Corrected TrxTestResultExtractor comment to reflect the serializer’s 64 MiB per-record cap.
  • Made ExceptionDispatchInfo.Capture(lastError) rethrows nullable-consistent via lastError!.
  • Switched the streaming-store writer startup from ITask.Run to ITask.RunLongRunning.
Show a summary per file
FileDescription
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxTestResultExtractor.csUpdates rationale comment to reference the correct serializer record-size cap (64 MiB).
src/Platform/Microsoft.Testing.Extensions.TrxReport/Streaming/TrxResultStreamingStore.csStarts the writer via RunLongRunning and aligns nullable usage in retry rethrow paths.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

✅ 21/21 dimensions clean — no findings.

All three changes are correct:

  • RunLongRunning: The API exists on ITask/SystemTask and correctly spawns a dedicated background thread, keeping the blocking BlockingCollection.TryTake off the shared threadpool. Rationale in the comment is accurate.
  • lastError!: Both null-forgiving operators are safe. The catch sites are only reachable after at least one loop iteration that unconditionally assigns lastError; null is impossible there.
  • Comment 16 MiB64 MiB: Matches the actual MaxRecordLengthBytes = 64 * 1024 * 1024 constant in TrxTestResultSerializer.cs; the MaxCapturedFieldChars = 1 MiB truncation cap is still well below 64 MiB.

Generated by Expert Code Review (on open) for issue #8285 · ● 8.6M

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 16, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 6fbd731. The TRX streaming writer loop is now await-free/synchronous while running on the long-running background thread, so the BlockingCollection.TryTake polling and retry/flush/log waits stay off the shared threadpool. Targeted build and TRX report tests pass.

CopilotAI review requested due to automatic review settings May 16, 2026 14:26

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 2

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 17, 2026 19:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 17, 2026 19:32

CopilotAI commented May 17, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 0222b80. The TRX streaming store now uses best-effort synchronous error logging instead of blocking on LogErrorAsync, and the write-failure message now says "after up to" the retry count. Targeted build/tests and final validation pass.

CopilotAI review requested due to automatic review settings May 18, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

Wrap writer-thread log calls in try/catch so a faulting logger (e.g. FileLogger semaphore/I/O timeouts) cannot escape WriteLoopAsync and crash the dedicated long-running thread via SystemTask.RunLongRunning.
Adds TryLogDebug / TryLogWarning helpers mirroring TryLogError, and routes:
- WriteLoopAsync shutdown LogDebug
- TryDelete error LogDebug
- LogDrop debug log
- CompleteAsync timeout LogWarningAsync (converted to sync TryLogWarning since CompleteAsync no longer needs to await it)
Addresses Copilot review feedback on PR #8285.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink
Amaury Levé (Evangelink) merged commit 1eea36b into mainMay 18, 2026
75 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/trx-followup branch May 18, 2026 17:36
Sign up for freeto 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.

4 participants

@Evangelink@Youssef1313