Enforce 64KB event payload size limit on EventPipe - #50600

Merged
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event
Apr 5, 2021
Merged

Enforce 64KB event payload size limit on EventPipe #50600
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event

Conversation

@sywhang

Copy link
Copy Markdown
Contributor

ETW has a maximum of 64KB event payload size limit that is not enforced on EventPipe. This causes issues like #50515 to occur where an event that's greater than 100KB can cause the flushing thread's event block to be too small to fit a single event payload, which crashes the application.

ep_return_false_if_nok (ep_event_is_enabled (ep_event));

// Check that the payload size is less than 64 KB (max size for ETW events)
ep_return_false_if_nok (ep_event_payload_get_size (payload) <= 64 * 1024);

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.

ETW might limit its payloads to 64KB, but does EventPipe need to? EventSource doesn't explicitly prevent you from having payloads this large, e.g., your test.

@sywhangsywhangApr 1, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It doesn't. But ETW will drop the event if it's greater than 64KB and I'd like to enforce the same behavior here since:

  1. We need some kind of limit regardless. Currently >100KB payloads crash the app. We could enforce a 100KB limit instead of 64KB.
  2. But if we do enforce 100KB limit, that leads to a discrepancy between ETW/EventPipe behavior which we then need to go and figure out how customers can find out whether big events are getting dropped on ETW but not on EventPipe and document why such behavior differences exist.
  3. Another approach is to enforce 1MB payload (which we currently do - just not explicitly but because we just fail to allocate buffers greater than that) and increase the max flushing block size to 1MB but that's a pretty inefficient use of space for sessions listening on much smaller-sized payloads (i.e. counters).

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.

Fair point. Let me mull this over, but I think 64KB is fine. Should we remove the DebugBreak in the EP_UNLIKELY macro expansion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'd actually like to keep that. It lets us catch exceptions like this rather than silently failing and us never noticing the failures.

Comment threadsrc/tests/tracing/eventpipe/bigevent/bigevent.cs

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few comments inline, looks good otherwise : )

Comment threadsrc/native/eventpipe/ep-file.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c
@sywhang

Copy link
Copy Markdown
ContributorAuthor

I'm merging this since CI failure is due to #50753.

@sywhang
sywhang merged commit bdd7ca0 into dotnet:mainApr 5, 2021
@sywhang
sywhang deleted the dev/suwhang/big-event branch April 5, 2021 23:27
thaystg added a commit to thaystg/runtime that referenced this pull request Apr 6, 2021
…shim_mono
# By Aaron Robinson (10) and others
# Via GitHub
* upstream/main: (108 commits)
[mbr] Add Apple sample (dotnet#50740)
make EstablishProxyTunnelAsync throw on failure status code from proxy (dotnet#50763)
Improve RGB Min Max evaluation performance by using 2 or 3 comparison… (dotnet#50622)
[mono] More domain cleanups (dotnet#50479)
Fix Crossgen2 of PlatformDefaultMemberFunction methods and calls. (dotnet#50754)
Disable EventSource generator in design-time builds (dotnet#50741)
Fix X509 test failures on Android (dotnet#50301)
Do not confuse fgDispBasicBlocks in fgMorphBlocks (dotnet#50703)
Enforce 64KB event payload size limit on EventPipe (dotnet#50600)
Reorganize CoreCLR native build to reduce CMake reconfigures when the build system is untouched (dotnet#49906)
[mbr] Turn on hot reload for iOS, tvOS and MacCatalyst (dotnet#50458)
improve connection scavenge logic by doing zero-byte read (dotnet#50545)
Resolve call mdtokens when making tier 1 inline observations (dotnet#50675)
Annotate APIs in System.Private.Xml (dotnet#49682)
Support compiling against OpenSSL 3 headers
Change Configuration.Json to use a regular Dictionary. (dotnet#50611)
Remove unused BigNumFromBinary P/Invoke (dotnet#50670)
Make Ninja the default CMake generator on Windows for the repo (dotnet#49715)
[AppleAppBuilder] Entitlements to run tests on catalyst using the JIT (dotnet#50637)
[mono] Fix delegate invokes to dynamic methods in mixed mode. (dotnet#50547)
...
# Conflicts:
#	src/mono/dlls/mscordbi/CMakeLists.txt
@ghostghost locked as resolved and limited conversation to collaborators May 6, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@sywhang@noahfalk@josalem@iSazonov@karelz
, '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

Enforce 64KB event payload size limit on EventPipe - #50600

Merged
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event
Apr 5, 2021
Merged

Enforce 64KB event payload size limit on EventPipe #50600
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event

Conversation

@sywhang

Copy link
Copy Markdown
Contributor

ETW has a maximum of 64KB event payload size limit that is not enforced on EventPipe. This causes issues like #50515 to occur where an event that's greater than 100KB can cause the flushing thread's event block to be too small to fit a single event payload, which crashes the application.

ep_return_false_if_nok (ep_event_is_enabled (ep_event));

// Check that the payload size is less than 64 KB (max size for ETW events)
ep_return_false_if_nok (ep_event_payload_get_size (payload) <= 64 * 1024);

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.

ETW might limit its payloads to 64KB, but does EventPipe need to? EventSource doesn't explicitly prevent you from having payloads this large, e.g., your test.

@sywhangsywhangApr 1, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It doesn't. But ETW will drop the event if it's greater than 64KB and I'd like to enforce the same behavior here since:

  1. We need some kind of limit regardless. Currently >100KB payloads crash the app. We could enforce a 100KB limit instead of 64KB.
  2. But if we do enforce 100KB limit, that leads to a discrepancy between ETW/EventPipe behavior which we then need to go and figure out how customers can find out whether big events are getting dropped on ETW but not on EventPipe and document why such behavior differences exist.
  3. Another approach is to enforce 1MB payload (which we currently do - just not explicitly but because we just fail to allocate buffers greater than that) and increase the max flushing block size to 1MB but that's a pretty inefficient use of space for sessions listening on much smaller-sized payloads (i.e. counters).

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.

Fair point. Let me mull this over, but I think 64KB is fine. Should we remove the DebugBreak in the EP_UNLIKELY macro expansion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'd actually like to keep that. It lets us catch exceptions like this rather than silently failing and us never noticing the failures.

Comment threadsrc/tests/tracing/eventpipe/bigevent/bigevent.cs

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few comments inline, looks good otherwise : )

Comment threadsrc/native/eventpipe/ep-file.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c
@sywhang

Copy link
Copy Markdown
ContributorAuthor

I'm merging this since CI failure is due to #50753.

@sywhang
sywhang merged commit bdd7ca0 into dotnet:mainApr 5, 2021
@sywhang
sywhang deleted the dev/suwhang/big-event branch April 5, 2021 23:27
thaystg added a commit to thaystg/runtime that referenced this pull request Apr 6, 2021
…shim_mono
# By Aaron Robinson (10) and others
# Via GitHub
* upstream/main: (108 commits)
[mbr] Add Apple sample (dotnet#50740)
make EstablishProxyTunnelAsync throw on failure status code from proxy (dotnet#50763)
Improve RGB Min Max evaluation performance by using 2 or 3 comparison… (dotnet#50622)
[mono] More domain cleanups (dotnet#50479)
Fix Crossgen2 of PlatformDefaultMemberFunction methods and calls. (dotnet#50754)
Disable EventSource generator in design-time builds (dotnet#50741)
Fix X509 test failures on Android (dotnet#50301)
Do not confuse fgDispBasicBlocks in fgMorphBlocks (dotnet#50703)
Enforce 64KB event payload size limit on EventPipe (dotnet#50600)
Reorganize CoreCLR native build to reduce CMake reconfigures when the build system is untouched (dotnet#49906)
[mbr] Turn on hot reload for iOS, tvOS and MacCatalyst (dotnet#50458)
improve connection scavenge logic by doing zero-byte read (dotnet#50545)
Resolve call mdtokens when making tier 1 inline observations (dotnet#50675)
Annotate APIs in System.Private.Xml (dotnet#49682)
Support compiling against OpenSSL 3 headers
Change Configuration.Json to use a regular Dictionary. (dotnet#50611)
Remove unused BigNumFromBinary P/Invoke (dotnet#50670)
Make Ninja the default CMake generator on Windows for the repo (dotnet#49715)
[AppleAppBuilder] Entitlements to run tests on catalyst using the JIT (dotnet#50637)
[mono] Fix delegate invokes to dynamic methods in mixed mode. (dotnet#50547)
...
# Conflicts:
#	src/mono/dlls/mscordbi/CMakeLists.txt
@ghostghost locked as resolved and limited conversation to collaborators May 6, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@sywhang@noahfalk@josalem@iSazonov@karelz
, '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

Enforce 64KB event payload size limit on EventPipe - #50600

Merged
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event
Apr 5, 2021
Merged

Enforce 64KB event payload size limit on EventPipe #50600
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event

Conversation

@sywhang

Copy link
Copy Markdown
Contributor

ETW has a maximum of 64KB event payload size limit that is not enforced on EventPipe. This causes issues like #50515 to occur where an event that's greater than 100KB can cause the flushing thread's event block to be too small to fit a single event payload, which crashes the application.

ep_return_false_if_nok (ep_event_is_enabled (ep_event));

// Check that the payload size is less than 64 KB (max size for ETW events)
ep_return_false_if_nok (ep_event_payload_get_size (payload) <= 64 * 1024);

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.

ETW might limit its payloads to 64KB, but does EventPipe need to? EventSource doesn't explicitly prevent you from having payloads this large, e.g., your test.

@sywhangsywhangApr 1, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It doesn't. But ETW will drop the event if it's greater than 64KB and I'd like to enforce the same behavior here since:

  1. We need some kind of limit regardless. Currently >100KB payloads crash the app. We could enforce a 100KB limit instead of 64KB.
  2. But if we do enforce 100KB limit, that leads to a discrepancy between ETW/EventPipe behavior which we then need to go and figure out how customers can find out whether big events are getting dropped on ETW but not on EventPipe and document why such behavior differences exist.
  3. Another approach is to enforce 1MB payload (which we currently do - just not explicitly but because we just fail to allocate buffers greater than that) and increase the max flushing block size to 1MB but that's a pretty inefficient use of space for sessions listening on much smaller-sized payloads (i.e. counters).

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.

Fair point. Let me mull this over, but I think 64KB is fine. Should we remove the DebugBreak in the EP_UNLIKELY macro expansion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'd actually like to keep that. It lets us catch exceptions like this rather than silently failing and us never noticing the failures.

Comment threadsrc/tests/tracing/eventpipe/bigevent/bigevent.cs

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few comments inline, looks good otherwise : )

Comment threadsrc/native/eventpipe/ep-file.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c
@sywhang

Copy link
Copy Markdown
ContributorAuthor

I'm merging this since CI failure is due to #50753.

@sywhang
sywhang merged commit bdd7ca0 into dotnet:mainApr 5, 2021
@sywhang
sywhang deleted the dev/suwhang/big-event branch April 5, 2021 23:27
thaystg added a commit to thaystg/runtime that referenced this pull request Apr 6, 2021
…shim_mono
# By Aaron Robinson (10) and others
# Via GitHub
* upstream/main: (108 commits)
[mbr] Add Apple sample (dotnet#50740)
make EstablishProxyTunnelAsync throw on failure status code from proxy (dotnet#50763)
Improve RGB Min Max evaluation performance by using 2 or 3 comparison… (dotnet#50622)
[mono] More domain cleanups (dotnet#50479)
Fix Crossgen2 of PlatformDefaultMemberFunction methods and calls. (dotnet#50754)
Disable EventSource generator in design-time builds (dotnet#50741)
Fix X509 test failures on Android (dotnet#50301)
Do not confuse fgDispBasicBlocks in fgMorphBlocks (dotnet#50703)
Enforce 64KB event payload size limit on EventPipe (dotnet#50600)
Reorganize CoreCLR native build to reduce CMake reconfigures when the build system is untouched (dotnet#49906)
[mbr] Turn on hot reload for iOS, tvOS and MacCatalyst (dotnet#50458)
improve connection scavenge logic by doing zero-byte read (dotnet#50545)
Resolve call mdtokens when making tier 1 inline observations (dotnet#50675)
Annotate APIs in System.Private.Xml (dotnet#49682)
Support compiling against OpenSSL 3 headers
Change Configuration.Json to use a regular Dictionary. (dotnet#50611)
Remove unused BigNumFromBinary P/Invoke (dotnet#50670)
Make Ninja the default CMake generator on Windows for the repo (dotnet#49715)
[AppleAppBuilder] Entitlements to run tests on catalyst using the JIT (dotnet#50637)
[mono] Fix delegate invokes to dynamic methods in mixed mode. (dotnet#50547)
...
# Conflicts:
#	src/mono/dlls/mscordbi/CMakeLists.txt
@ghostghost locked as resolved and limited conversation to collaborators May 6, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@sywhang@noahfalk@josalem@iSazonov@karelz
, '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

Enforce 64KB event payload size limit on EventPipe - #50600

Merged
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event
Apr 5, 2021
Merged

Enforce 64KB event payload size limit on EventPipe #50600
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event

Conversation

@sywhang

Copy link
Copy Markdown
Contributor

ETW has a maximum of 64KB event payload size limit that is not enforced on EventPipe. This causes issues like #50515 to occur where an event that's greater than 100KB can cause the flushing thread's event block to be too small to fit a single event payload, which crashes the application.

ep_return_false_if_nok (ep_event_is_enabled (ep_event));

// Check that the payload size is less than 64 KB (max size for ETW events)
ep_return_false_if_nok (ep_event_payload_get_size (payload) <= 64 * 1024);

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.

ETW might limit its payloads to 64KB, but does EventPipe need to? EventSource doesn't explicitly prevent you from having payloads this large, e.g., your test.

@sywhangsywhangApr 1, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It doesn't. But ETW will drop the event if it's greater than 64KB and I'd like to enforce the same behavior here since:

  1. We need some kind of limit regardless. Currently >100KB payloads crash the app. We could enforce a 100KB limit instead of 64KB.
  2. But if we do enforce 100KB limit, that leads to a discrepancy between ETW/EventPipe behavior which we then need to go and figure out how customers can find out whether big events are getting dropped on ETW but not on EventPipe and document why such behavior differences exist.
  3. Another approach is to enforce 1MB payload (which we currently do - just not explicitly but because we just fail to allocate buffers greater than that) and increase the max flushing block size to 1MB but that's a pretty inefficient use of space for sessions listening on much smaller-sized payloads (i.e. counters).

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.

Fair point. Let me mull this over, but I think 64KB is fine. Should we remove the DebugBreak in the EP_UNLIKELY macro expansion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'd actually like to keep that. It lets us catch exceptions like this rather than silently failing and us never noticing the failures.

Comment threadsrc/tests/tracing/eventpipe/bigevent/bigevent.cs

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few comments inline, looks good otherwise : )

Comment threadsrc/native/eventpipe/ep-file.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c
@sywhang

Copy link
Copy Markdown
ContributorAuthor

I'm merging this since CI failure is due to #50753.

@sywhang
sywhang merged commit bdd7ca0 into dotnet:mainApr 5, 2021
@sywhang
sywhang deleted the dev/suwhang/big-event branch April 5, 2021 23:27
thaystg added a commit to thaystg/runtime that referenced this pull request Apr 6, 2021
…shim_mono
# By Aaron Robinson (10) and others
# Via GitHub
* upstream/main: (108 commits)
[mbr] Add Apple sample (dotnet#50740)
make EstablishProxyTunnelAsync throw on failure status code from proxy (dotnet#50763)
Improve RGB Min Max evaluation performance by using 2 or 3 comparison… (dotnet#50622)
[mono] More domain cleanups (dotnet#50479)
Fix Crossgen2 of PlatformDefaultMemberFunction methods and calls. (dotnet#50754)
Disable EventSource generator in design-time builds (dotnet#50741)
Fix X509 test failures on Android (dotnet#50301)
Do not confuse fgDispBasicBlocks in fgMorphBlocks (dotnet#50703)
Enforce 64KB event payload size limit on EventPipe (dotnet#50600)
Reorganize CoreCLR native build to reduce CMake reconfigures when the build system is untouched (dotnet#49906)
[mbr] Turn on hot reload for iOS, tvOS and MacCatalyst (dotnet#50458)
improve connection scavenge logic by doing zero-byte read (dotnet#50545)
Resolve call mdtokens when making tier 1 inline observations (dotnet#50675)
Annotate APIs in System.Private.Xml (dotnet#49682)
Support compiling against OpenSSL 3 headers
Change Configuration.Json to use a regular Dictionary. (dotnet#50611)
Remove unused BigNumFromBinary P/Invoke (dotnet#50670)
Make Ninja the default CMake generator on Windows for the repo (dotnet#49715)
[AppleAppBuilder] Entitlements to run tests on catalyst using the JIT (dotnet#50637)
[mono] Fix delegate invokes to dynamic methods in mixed mode. (dotnet#50547)
...
# Conflicts:
#	src/mono/dlls/mscordbi/CMakeLists.txt
@ghostghost locked as resolved and limited conversation to collaborators May 6, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@sywhang@noahfalk@josalem@iSazonov@karelz
, '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

Enforce 64KB event payload size limit on EventPipe - #50600

Merged
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event
Apr 5, 2021
Merged

Enforce 64KB event payload size limit on EventPipe #50600
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event

Conversation

@sywhang

Copy link
Copy Markdown
Contributor

ETW has a maximum of 64KB event payload size limit that is not enforced on EventPipe. This causes issues like #50515 to occur where an event that's greater than 100KB can cause the flushing thread's event block to be too small to fit a single event payload, which crashes the application.

ep_return_false_if_nok (ep_event_is_enabled (ep_event));

// Check that the payload size is less than 64 KB (max size for ETW events)
ep_return_false_if_nok (ep_event_payload_get_size (payload) <= 64 * 1024);

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.

ETW might limit its payloads to 64KB, but does EventPipe need to? EventSource doesn't explicitly prevent you from having payloads this large, e.g., your test.

@sywhangsywhangApr 1, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It doesn't. But ETW will drop the event if it's greater than 64KB and I'd like to enforce the same behavior here since:

  1. We need some kind of limit regardless. Currently >100KB payloads crash the app. We could enforce a 100KB limit instead of 64KB.
  2. But if we do enforce 100KB limit, that leads to a discrepancy between ETW/EventPipe behavior which we then need to go and figure out how customers can find out whether big events are getting dropped on ETW but not on EventPipe and document why such behavior differences exist.
  3. Another approach is to enforce 1MB payload (which we currently do - just not explicitly but because we just fail to allocate buffers greater than that) and increase the max flushing block size to 1MB but that's a pretty inefficient use of space for sessions listening on much smaller-sized payloads (i.e. counters).

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.

Fair point. Let me mull this over, but I think 64KB is fine. Should we remove the DebugBreak in the EP_UNLIKELY macro expansion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'd actually like to keep that. It lets us catch exceptions like this rather than silently failing and us never noticing the failures.

Comment threadsrc/tests/tracing/eventpipe/bigevent/bigevent.cs

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few comments inline, looks good otherwise : )

Comment threadsrc/native/eventpipe/ep-file.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c
@sywhang

Copy link
Copy Markdown
ContributorAuthor

I'm merging this since CI failure is due to #50753.

@sywhang
sywhang merged commit bdd7ca0 into dotnet:mainApr 5, 2021
@sywhang
sywhang deleted the dev/suwhang/big-event branch April 5, 2021 23:27
thaystg added a commit to thaystg/runtime that referenced this pull request Apr 6, 2021
…shim_mono
# By Aaron Robinson (10) and others
# Via GitHub
* upstream/main: (108 commits)
[mbr] Add Apple sample (dotnet#50740)
make EstablishProxyTunnelAsync throw on failure status code from proxy (dotnet#50763)
Improve RGB Min Max evaluation performance by using 2 or 3 comparison… (dotnet#50622)
[mono] More domain cleanups (dotnet#50479)
Fix Crossgen2 of PlatformDefaultMemberFunction methods and calls. (dotnet#50754)
Disable EventSource generator in design-time builds (dotnet#50741)
Fix X509 test failures on Android (dotnet#50301)
Do not confuse fgDispBasicBlocks in fgMorphBlocks (dotnet#50703)
Enforce 64KB event payload size limit on EventPipe (dotnet#50600)
Reorganize CoreCLR native build to reduce CMake reconfigures when the build system is untouched (dotnet#49906)
[mbr] Turn on hot reload for iOS, tvOS and MacCatalyst (dotnet#50458)
improve connection scavenge logic by doing zero-byte read (dotnet#50545)
Resolve call mdtokens when making tier 1 inline observations (dotnet#50675)
Annotate APIs in System.Private.Xml (dotnet#49682)
Support compiling against OpenSSL 3 headers
Change Configuration.Json to use a regular Dictionary. (dotnet#50611)
Remove unused BigNumFromBinary P/Invoke (dotnet#50670)
Make Ninja the default CMake generator on Windows for the repo (dotnet#49715)
[AppleAppBuilder] Entitlements to run tests on catalyst using the JIT (dotnet#50637)
[mono] Fix delegate invokes to dynamic methods in mixed mode. (dotnet#50547)
...
# Conflicts:
#	src/mono/dlls/mscordbi/CMakeLists.txt
@ghostghost locked as resolved and limited conversation to collaborators May 6, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@sywhang@noahfalk@josalem@iSazonov@karelz
, '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

Enforce 64KB event payload size limit on EventPipe - #50600

Merged
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event
Apr 5, 2021
Merged

Enforce 64KB event payload size limit on EventPipe #50600
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event

Conversation

@sywhang

Copy link
Copy Markdown
Contributor

ETW has a maximum of 64KB event payload size limit that is not enforced on EventPipe. This causes issues like #50515 to occur where an event that's greater than 100KB can cause the flushing thread's event block to be too small to fit a single event payload, which crashes the application.

ep_return_false_if_nok (ep_event_is_enabled (ep_event));

// Check that the payload size is less than 64 KB (max size for ETW events)
ep_return_false_if_nok (ep_event_payload_get_size (payload) <= 64 * 1024);

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.

ETW might limit its payloads to 64KB, but does EventPipe need to? EventSource doesn't explicitly prevent you from having payloads this large, e.g., your test.

@sywhangsywhangApr 1, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It doesn't. But ETW will drop the event if it's greater than 64KB and I'd like to enforce the same behavior here since:

  1. We need some kind of limit regardless. Currently >100KB payloads crash the app. We could enforce a 100KB limit instead of 64KB.
  2. But if we do enforce 100KB limit, that leads to a discrepancy between ETW/EventPipe behavior which we then need to go and figure out how customers can find out whether big events are getting dropped on ETW but not on EventPipe and document why such behavior differences exist.
  3. Another approach is to enforce 1MB payload (which we currently do - just not explicitly but because we just fail to allocate buffers greater than that) and increase the max flushing block size to 1MB but that's a pretty inefficient use of space for sessions listening on much smaller-sized payloads (i.e. counters).

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.

Fair point. Let me mull this over, but I think 64KB is fine. Should we remove the DebugBreak in the EP_UNLIKELY macro expansion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'd actually like to keep that. It lets us catch exceptions like this rather than silently failing and us never noticing the failures.

Comment threadsrc/tests/tracing/eventpipe/bigevent/bigevent.cs

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few comments inline, looks good otherwise : )

Comment threadsrc/native/eventpipe/ep-file.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c
@sywhang

Copy link
Copy Markdown
ContributorAuthor

I'm merging this since CI failure is due to #50753.

@sywhang
sywhang merged commit bdd7ca0 into dotnet:mainApr 5, 2021
@sywhang
sywhang deleted the dev/suwhang/big-event branch April 5, 2021 23:27
thaystg added a commit to thaystg/runtime that referenced this pull request Apr 6, 2021
…shim_mono
# By Aaron Robinson (10) and others
# Via GitHub
* upstream/main: (108 commits)
[mbr] Add Apple sample (dotnet#50740)
make EstablishProxyTunnelAsync throw on failure status code from proxy (dotnet#50763)
Improve RGB Min Max evaluation performance by using 2 or 3 comparison… (dotnet#50622)
[mono] More domain cleanups (dotnet#50479)
Fix Crossgen2 of PlatformDefaultMemberFunction methods and calls. (dotnet#50754)
Disable EventSource generator in design-time builds (dotnet#50741)
Fix X509 test failures on Android (dotnet#50301)
Do not confuse fgDispBasicBlocks in fgMorphBlocks (dotnet#50703)
Enforce 64KB event payload size limit on EventPipe (dotnet#50600)
Reorganize CoreCLR native build to reduce CMake reconfigures when the build system is untouched (dotnet#49906)
[mbr] Turn on hot reload for iOS, tvOS and MacCatalyst (dotnet#50458)
improve connection scavenge logic by doing zero-byte read (dotnet#50545)
Resolve call mdtokens when making tier 1 inline observations (dotnet#50675)
Annotate APIs in System.Private.Xml (dotnet#49682)
Support compiling against OpenSSL 3 headers
Change Configuration.Json to use a regular Dictionary. (dotnet#50611)
Remove unused BigNumFromBinary P/Invoke (dotnet#50670)
Make Ninja the default CMake generator on Windows for the repo (dotnet#49715)
[AppleAppBuilder] Entitlements to run tests on catalyst using the JIT (dotnet#50637)
[mono] Fix delegate invokes to dynamic methods in mixed mode. (dotnet#50547)
...
# Conflicts:
#	src/mono/dlls/mscordbi/CMakeLists.txt
@ghostghost locked as resolved and limited conversation to collaborators May 6, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@sywhang@noahfalk@josalem@iSazonov@karelz
, '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

Enforce 64KB event payload size limit on EventPipe - #50600

Merged
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event
Apr 5, 2021
Merged

Enforce 64KB event payload size limit on EventPipe #50600
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event

Conversation

@sywhang

Copy link
Copy Markdown
Contributor

ETW has a maximum of 64KB event payload size limit that is not enforced on EventPipe. This causes issues like #50515 to occur where an event that's greater than 100KB can cause the flushing thread's event block to be too small to fit a single event payload, which crashes the application.

ep_return_false_if_nok (ep_event_is_enabled (ep_event));

// Check that the payload size is less than 64 KB (max size for ETW events)
ep_return_false_if_nok (ep_event_payload_get_size (payload) <= 64 * 1024);

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.

ETW might limit its payloads to 64KB, but does EventPipe need to? EventSource doesn't explicitly prevent you from having payloads this large, e.g., your test.

@sywhangsywhangApr 1, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It doesn't. But ETW will drop the event if it's greater than 64KB and I'd like to enforce the same behavior here since:

  1. We need some kind of limit regardless. Currently >100KB payloads crash the app. We could enforce a 100KB limit instead of 64KB.
  2. But if we do enforce 100KB limit, that leads to a discrepancy between ETW/EventPipe behavior which we then need to go and figure out how customers can find out whether big events are getting dropped on ETW but not on EventPipe and document why such behavior differences exist.
  3. Another approach is to enforce 1MB payload (which we currently do - just not explicitly but because we just fail to allocate buffers greater than that) and increase the max flushing block size to 1MB but that's a pretty inefficient use of space for sessions listening on much smaller-sized payloads (i.e. counters).

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.

Fair point. Let me mull this over, but I think 64KB is fine. Should we remove the DebugBreak in the EP_UNLIKELY macro expansion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'd actually like to keep that. It lets us catch exceptions like this rather than silently failing and us never noticing the failures.

Comment threadsrc/tests/tracing/eventpipe/bigevent/bigevent.cs

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few comments inline, looks good otherwise : )

Comment threadsrc/native/eventpipe/ep-file.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c
@sywhang

Copy link
Copy Markdown
ContributorAuthor

I'm merging this since CI failure is due to #50753.

@sywhang
sywhang merged commit bdd7ca0 into dotnet:mainApr 5, 2021
@sywhang
sywhang deleted the dev/suwhang/big-event branch April 5, 2021 23:27
thaystg added a commit to thaystg/runtime that referenced this pull request Apr 6, 2021
…shim_mono
# By Aaron Robinson (10) and others
# Via GitHub
* upstream/main: (108 commits)
[mbr] Add Apple sample (dotnet#50740)
make EstablishProxyTunnelAsync throw on failure status code from proxy (dotnet#50763)
Improve RGB Min Max evaluation performance by using 2 or 3 comparison… (dotnet#50622)
[mono] More domain cleanups (dotnet#50479)
Fix Crossgen2 of PlatformDefaultMemberFunction methods and calls. (dotnet#50754)
Disable EventSource generator in design-time builds (dotnet#50741)
Fix X509 test failures on Android (dotnet#50301)
Do not confuse fgDispBasicBlocks in fgMorphBlocks (dotnet#50703)
Enforce 64KB event payload size limit on EventPipe (dotnet#50600)
Reorganize CoreCLR native build to reduce CMake reconfigures when the build system is untouched (dotnet#49906)
[mbr] Turn on hot reload for iOS, tvOS and MacCatalyst (dotnet#50458)
improve connection scavenge logic by doing zero-byte read (dotnet#50545)
Resolve call mdtokens when making tier 1 inline observations (dotnet#50675)
Annotate APIs in System.Private.Xml (dotnet#49682)
Support compiling against OpenSSL 3 headers
Change Configuration.Json to use a regular Dictionary. (dotnet#50611)
Remove unused BigNumFromBinary P/Invoke (dotnet#50670)
Make Ninja the default CMake generator on Windows for the repo (dotnet#49715)
[AppleAppBuilder] Entitlements to run tests on catalyst using the JIT (dotnet#50637)
[mono] Fix delegate invokes to dynamic methods in mixed mode. (dotnet#50547)
...
# Conflicts:
#	src/mono/dlls/mscordbi/CMakeLists.txt
@ghostghost locked as resolved and limited conversation to collaborators May 6, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@sywhang@noahfalk@josalem@iSazonov@karelz
, '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

Enforce 64KB event payload size limit on EventPipe - #50600

Merged
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event
Apr 5, 2021
Merged

Enforce 64KB event payload size limit on EventPipe #50600
sywhang merged 7 commits into
dotnet:mainfrom
sywhang:dev/suwhang/big-event

Conversation

@sywhang

Copy link
Copy Markdown
Contributor

ETW has a maximum of 64KB event payload size limit that is not enforced on EventPipe. This causes issues like #50515 to occur where an event that's greater than 100KB can cause the flushing thread's event block to be too small to fit a single event payload, which crashes the application.

ep_return_false_if_nok (ep_event_is_enabled (ep_event));

// Check that the payload size is less than 64 KB (max size for ETW events)
ep_return_false_if_nok (ep_event_payload_get_size (payload) <= 64 * 1024);

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.

ETW might limit its payloads to 64KB, but does EventPipe need to? EventSource doesn't explicitly prevent you from having payloads this large, e.g., your test.

@sywhangsywhangApr 1, 2021

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

It doesn't. But ETW will drop the event if it's greater than 64KB and I'd like to enforce the same behavior here since:

  1. We need some kind of limit regardless. Currently >100KB payloads crash the app. We could enforce a 100KB limit instead of 64KB.
  2. But if we do enforce 100KB limit, that leads to a discrepancy between ETW/EventPipe behavior which we then need to go and figure out how customers can find out whether big events are getting dropped on ETW but not on EventPipe and document why such behavior differences exist.
  3. Another approach is to enforce 1MB payload (which we currently do - just not explicitly but because we just fail to allocate buffers greater than that) and increase the max flushing block size to 1MB but that's a pretty inefficient use of space for sessions listening on much smaller-sized payloads (i.e. counters).

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.

Fair point. Let me mull this over, but I think 64KB is fine. Should we remove the DebugBreak in the EP_UNLIKELY macro expansion?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

I'd actually like to keep that. It lets us catch exceptions like this rather than silently failing and us never noticing the failures.

Comment threadsrc/tests/tracing/eventpipe/bigevent/bigevent.cs

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few comments inline, looks good otherwise : )

Comment threadsrc/native/eventpipe/ep-file.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c Outdated
Comment threadsrc/native/eventpipe/ep-buffer-manager.c
@sywhang

Copy link
Copy Markdown
ContributorAuthor

I'm merging this since CI failure is due to #50753.

@sywhang
sywhang merged commit bdd7ca0 into dotnet:mainApr 5, 2021
@sywhang
sywhang deleted the dev/suwhang/big-event branch April 5, 2021 23:27
thaystg added a commit to thaystg/runtime that referenced this pull request Apr 6, 2021
…shim_mono
# By Aaron Robinson (10) and others
# Via GitHub
* upstream/main: (108 commits)
[mbr] Add Apple sample (dotnet#50740)
make EstablishProxyTunnelAsync throw on failure status code from proxy (dotnet#50763)
Improve RGB Min Max evaluation performance by using 2 or 3 comparison… (dotnet#50622)
[mono] More domain cleanups (dotnet#50479)
Fix Crossgen2 of PlatformDefaultMemberFunction methods and calls. (dotnet#50754)
Disable EventSource generator in design-time builds (dotnet#50741)
Fix X509 test failures on Android (dotnet#50301)
Do not confuse fgDispBasicBlocks in fgMorphBlocks (dotnet#50703)
Enforce 64KB event payload size limit on EventPipe (dotnet#50600)
Reorganize CoreCLR native build to reduce CMake reconfigures when the build system is untouched (dotnet#49906)
[mbr] Turn on hot reload for iOS, tvOS and MacCatalyst (dotnet#50458)
improve connection scavenge logic by doing zero-byte read (dotnet#50545)
Resolve call mdtokens when making tier 1 inline observations (dotnet#50675)
Annotate APIs in System.Private.Xml (dotnet#49682)
Support compiling against OpenSSL 3 headers
Change Configuration.Json to use a regular Dictionary. (dotnet#50611)
Remove unused BigNumFromBinary P/Invoke (dotnet#50670)
Make Ninja the default CMake generator on Windows for the repo (dotnet#49715)
[AppleAppBuilder] Entitlements to run tests on catalyst using the JIT (dotnet#50637)
[mono] Fix delegate invokes to dynamic methods in mixed mode. (dotnet#50547)
...
# Conflicts:
#	src/mono/dlls/mscordbi/CMakeLists.txt
@ghostghost locked as resolved and limited conversation to collaborators May 6, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@sywhang@noahfalk@josalem@iSazonov@karelz