Skip to content

Multithreaded MSBuild (-mt) is incompatible with -reportfileaccesses: MSB0001 'We failed to request a node to be created' #14825

Description

@JanProvaznik

Summary

-mt (experimental multithreaded MSBuild) and -reportfileaccesses cannot be used together. Combining them fails the build immediately with an internal error, before any project work happens:

MSBUILD : error MSB1025: An internal failure occurred while running MSBuild.
Microsoft.Build.Framework.InternalErrorException: MSB0001: Internal MSBuild Error: We failed to request a node to be created.
at Microsoft.Build.Shared.ErrorUtilities.ThrowInternalError(String message, Exception innerException, Object[] args)
at Microsoft.Build.Shared.ErrorUtilities.VerifyThrow(Boolean condition, String unformattedMessage)
at Microsoft.Build.BackEnd.Scheduler.ScheduleUnassignedRequests(List`1 responses)
at Microsoft.Build.BackEnd.Scheduler.ReportRequestBlocked(Int32 nodeId, BuildRequestBlocker blocker)
at Microsoft.Build.Execution.BuildManager.HandleNewRequest(Int32 node, BuildRequestBlocker blocker)

This was found while investigating #14824.

Steps to reproduce

Any project at all, using the x64 .NET Framework MSBuild (file-access reporting is only compiled into the net472 build, and it additionally requires x64):

<Project>
<TargetName="Build">
<MessageImportance="High"Text="hello" />
</Target>
</Project>
MSBuild.exe trivial.proj -mt -reportfileaccesses

Actual behavior

MSB1025 / MSB0001: We failed to request a node to be created.

Either switch on its own works fine (-mt alone prints hello; -reportfileaccesses alone builds normally).

Expected behavior

Either the combination works, or MSBuild reports a clear, actionable error explaining that the two switches are mutually exclusive.

Root cause

The two features make contradictory demands on node affinity:

  1. BuildManager.EnableDetouredNodeLauncher (src/Build/BackEnd/BuildManager/BuildManager.cs) sets _buildParameters.DisableInProcNode = true, because the in-proc node cannot be detoured:

    // To properly report file access, we need to disable the in-proc node which won't be detoured._buildParameters!.DisableInProcNode=true;
  2. Scheduler.CreateNewNodeIfPossible (src/Build/BackEnd/Components/Scheduler/Scheduler.cs) gives multithreaded mode an out-of-proc node budget of zero, because MT mode is supposed to service everything with in-proc thread nodes:

    intmaxInProcNodeCount=_componentHost.BuildParameters.MultiThreaded?_componentHost.BuildParameters.MaxNodeCount:1;intavailableNodesWithInProcAffinity=maxInProcNodeCount-_currentInProcNodeCount;intavailableNodesWithOutOfProcAffinity=_componentHost.BuildParameters.MultiThreaded?0:_componentHost.BuildParameters.MaxNodeCount-_currentOutOfProcNodeCount;

With DisableInProcNode == true, NodeAffinity.Any requests are pushed down the out-of-proc branch, but the out-of-proc budget is 0, so no CreateNode response is ever produced and ScheduleUnassignedRequests throws.

Impact

Cache implementations built on the project-cache plugin API (for example Microsoft.MSBuildCache) need -reportfileaccesses for cache population, since ProjectCacheService only registers ProjectCachePluginBase.HandleFileAccess / HandleProcess handlers when BuildParameters.ReportFileAccesses is set. Those builds therefore cannot opt into -mt at all today — independent of the deserialization defect in #14824.

Suggested fix

Short term, since both switches are experimental and opt-in, detect the combination up front (in BuildManager.BeginBuild or during command-line switch processing) and fail with a specific, localized error instead of an internal error.

Longer term this needs a design decision: file-access attribution today relies on DetouredNodeLauncher detouring a launched worker process, whereas MT thread nodes live inside the scheduler process and are never launched through NodeLauncher. Reporting file accesses for thread nodes would need a different attribution mechanism before the two features can coexist.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
       blocks
      (function() {
      function addCopyButtons() {
      document.querySelectorAll('pre code').forEach(function(codeBlock) {
      if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
      codeBlock.parentElement.setAttribute('data-copy-added', 'true');
      var btn = document.createElement('button');
      btn.textContent = 'Copy';
      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;';
      btn.onmouseover = function() { this.style.opacity = '1'; };
      btn.onmouseout = function() { this.style.opacity = '0.7'; };
      btn.onclick = function() {
      navigator.clipboard.writeText(codeBlock.textContent).then(function() {
      btn.textContent = 'Copied!';
      setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
      });
      };
      codeBlock.parentElement.style.position = 'relative';
      codeBlock.parentElement.appendChild(btn);
      });
      }
      addCopyButtons();
      // Re-run on dynamic content
      var observer = new MutationObserver(addCopyButtons);
      observer.observe(document.body, { childList: true, subtree: true });
      })();
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      Multithreaded MSBuild (-mt) is incompatible with -reportfileaccesses: MSB0001 'We failed to request a node to be created' · Issue #14825 · dotnet/msbuild · GitHub
      Skip to content

      Multithreaded MSBuild (-mt) is incompatible with -reportfileaccesses: MSB0001 'We failed to request a node to be created' #14825

      Description

      @JanProvaznik

      Summary

      -mt (experimental multithreaded MSBuild) and -reportfileaccesses cannot be used together. Combining them fails the build immediately with an internal error, before any project work happens:

      MSBUILD : error MSB1025: An internal failure occurred while running MSBuild.
      Microsoft.Build.Framework.InternalErrorException: MSB0001: Internal MSBuild Error: We failed to request a node to be created.
      at Microsoft.Build.Shared.ErrorUtilities.ThrowInternalError(String message, Exception innerException, Object[] args)
      at Microsoft.Build.Shared.ErrorUtilities.VerifyThrow(Boolean condition, String unformattedMessage)
      at Microsoft.Build.BackEnd.Scheduler.ScheduleUnassignedRequests(List`1 responses)
      at Microsoft.Build.BackEnd.Scheduler.ReportRequestBlocked(Int32 nodeId, BuildRequestBlocker blocker)
      at Microsoft.Build.Execution.BuildManager.HandleNewRequest(Int32 node, BuildRequestBlocker blocker)
      

      This was found while investigating #14824.

      Steps to reproduce

      Any project at all, using the x64 .NET Framework MSBuild (file-access reporting is only compiled into the net472 build, and it additionally requires x64):

      <Project>
      <TargetName="Build">
      <MessageImportance="High"Text="hello" />
      </Target>
      </Project>
      MSBuild.exe trivial.proj -mt -reportfileaccesses
      

      Actual behavior

      MSB1025 / MSB0001: We failed to request a node to be created.

      Either switch on its own works fine (-mt alone prints hello; -reportfileaccesses alone builds normally).

      Expected behavior

      Either the combination works, or MSBuild reports a clear, actionable error explaining that the two switches are mutually exclusive.

      Root cause

      The two features make contradictory demands on node affinity:

      1. BuildManager.EnableDetouredNodeLauncher (src/Build/BackEnd/BuildManager/BuildManager.cs) sets _buildParameters.DisableInProcNode = true, because the in-proc node cannot be detoured:

        // To properly report file access, we need to disable the in-proc node which won't be detoured._buildParameters!.DisableInProcNode=true;
      2. Scheduler.CreateNewNodeIfPossible (src/Build/BackEnd/Components/Scheduler/Scheduler.cs) gives multithreaded mode an out-of-proc node budget of zero, because MT mode is supposed to service everything with in-proc thread nodes:

        intmaxInProcNodeCount=_componentHost.BuildParameters.MultiThreaded?_componentHost.BuildParameters.MaxNodeCount:1;intavailableNodesWithInProcAffinity=maxInProcNodeCount-_currentInProcNodeCount;intavailableNodesWithOutOfProcAffinity=_componentHost.BuildParameters.MultiThreaded?0:_componentHost.BuildParameters.MaxNodeCount-_currentOutOfProcNodeCount;

      With DisableInProcNode == true, NodeAffinity.Any requests are pushed down the out-of-proc branch, but the out-of-proc budget is 0, so no CreateNode response is ever produced and ScheduleUnassignedRequests throws.

      Impact

      Cache implementations built on the project-cache plugin API (for example Microsoft.MSBuildCache) need -reportfileaccesses for cache population, since ProjectCacheService only registers ProjectCachePluginBase.HandleFileAccess / HandleProcess handlers when BuildParameters.ReportFileAccesses is set. Those builds therefore cannot opt into -mt at all today — independent of the deserialization defect in #14824.

      Suggested fix

      Short term, since both switches are experimental and opt-in, detect the combination up front (in BuildManager.BeginBuild or during command-line switch processing) and fail with a specific, localized error instead of an internal error.

      Longer term this needs a design decision: file-access attribution today relies on DetouredNodeLauncher detouring a launched worker process, whereas MT thread nodes live inside the scheduler process and are never launched through NodeLauncher. Reporting file accesses for thread nodes would need a different attribution mechanism before the two features can coexist.

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        No labels
        No labels

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Multithreaded MSBuild (-mt) is incompatible with -reportfileaccesses: MSB0001 'We failed to request a node to be created' · Issue #14825 · dotnet/msbuild · GitHub
          Skip to content

          Multithreaded MSBuild (-mt) is incompatible with -reportfileaccesses: MSB0001 'We failed to request a node to be created' #14825

          Description

          @JanProvaznik

          Summary

          -mt (experimental multithreaded MSBuild) and -reportfileaccesses cannot be used together. Combining them fails the build immediately with an internal error, before any project work happens:

          MSBUILD : error MSB1025: An internal failure occurred while running MSBuild.
          Microsoft.Build.Framework.InternalErrorException: MSB0001: Internal MSBuild Error: We failed to request a node to be created.
          at Microsoft.Build.Shared.ErrorUtilities.ThrowInternalError(String message, Exception innerException, Object[] args)
          at Microsoft.Build.Shared.ErrorUtilities.VerifyThrow(Boolean condition, String unformattedMessage)
          at Microsoft.Build.BackEnd.Scheduler.ScheduleUnassignedRequests(List`1 responses)
          at Microsoft.Build.BackEnd.Scheduler.ReportRequestBlocked(Int32 nodeId, BuildRequestBlocker blocker)
          at Microsoft.Build.Execution.BuildManager.HandleNewRequest(Int32 node, BuildRequestBlocker blocker)
          

          This was found while investigating #14824.

          Steps to reproduce

          Any project at all, using the x64 .NET Framework MSBuild (file-access reporting is only compiled into the net472 build, and it additionally requires x64):

          <Project>
          <TargetName="Build">
          <MessageImportance="High"Text="hello" />
          </Target>
          </Project>
          MSBuild.exe trivial.proj -mt -reportfileaccesses
          

          Actual behavior

          MSB1025 / MSB0001: We failed to request a node to be created.

          Either switch on its own works fine (-mt alone prints hello; -reportfileaccesses alone builds normally).

          Expected behavior

          Either the combination works, or MSBuild reports a clear, actionable error explaining that the two switches are mutually exclusive.

          Root cause

          The two features make contradictory demands on node affinity:

          1. BuildManager.EnableDetouredNodeLauncher (src/Build/BackEnd/BuildManager/BuildManager.cs) sets _buildParameters.DisableInProcNode = true, because the in-proc node cannot be detoured:

            // To properly report file access, we need to disable the in-proc node which won't be detoured._buildParameters!.DisableInProcNode=true;
          2. Scheduler.CreateNewNodeIfPossible (src/Build/BackEnd/Components/Scheduler/Scheduler.cs) gives multithreaded mode an out-of-proc node budget of zero, because MT mode is supposed to service everything with in-proc thread nodes:

            intmaxInProcNodeCount=_componentHost.BuildParameters.MultiThreaded?_componentHost.BuildParameters.MaxNodeCount:1;intavailableNodesWithInProcAffinity=maxInProcNodeCount-_currentInProcNodeCount;intavailableNodesWithOutOfProcAffinity=_componentHost.BuildParameters.MultiThreaded?0:_componentHost.BuildParameters.MaxNodeCount-_currentOutOfProcNodeCount;

          With DisableInProcNode == true, NodeAffinity.Any requests are pushed down the out-of-proc branch, but the out-of-proc budget is 0, so no CreateNode response is ever produced and ScheduleUnassignedRequests throws.

          Impact

          Cache implementations built on the project-cache plugin API (for example Microsoft.MSBuildCache) need -reportfileaccesses for cache population, since ProjectCacheService only registers ProjectCachePluginBase.HandleFileAccess / HandleProcess handlers when BuildParameters.ReportFileAccesses is set. Those builds therefore cannot opt into -mt at all today — independent of the deserialization defect in #14824.

          Suggested fix

          Short term, since both switches are experimental and opt-in, detect the combination up front (in BuildManager.BeginBuild or during command-line switch processing) and fail with a specific, localized error instead of an internal error.

          Longer term this needs a design decision: file-access attribution today relies on DetouredNodeLauncher detouring a launched worker process, whereas MT thread nodes live inside the scheduler process and are never launched through NodeLauncher. Reporting file accesses for thread nodes would need a different attribution mechanism before the two features can coexist.

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            No labels
            No labels

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

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

              Multithreaded MSBuild (-mt) is incompatible with -reportfileaccesses: MSB0001 'We failed to request a node to be created' #14825

              Description

              @JanProvaznik

              Summary

              -mt (experimental multithreaded MSBuild) and -reportfileaccesses cannot be used together. Combining them fails the build immediately with an internal error, before any project work happens:

              MSBUILD : error MSB1025: An internal failure occurred while running MSBuild.
              Microsoft.Build.Framework.InternalErrorException: MSB0001: Internal MSBuild Error: We failed to request a node to be created.
              at Microsoft.Build.Shared.ErrorUtilities.ThrowInternalError(String message, Exception innerException, Object[] args)
              at Microsoft.Build.Shared.ErrorUtilities.VerifyThrow(Boolean condition, String unformattedMessage)
              at Microsoft.Build.BackEnd.Scheduler.ScheduleUnassignedRequests(List`1 responses)
              at Microsoft.Build.BackEnd.Scheduler.ReportRequestBlocked(Int32 nodeId, BuildRequestBlocker blocker)
              at Microsoft.Build.Execution.BuildManager.HandleNewRequest(Int32 node, BuildRequestBlocker blocker)
              

              This was found while investigating #14824.

              Steps to reproduce

              Any project at all, using the x64 .NET Framework MSBuild (file-access reporting is only compiled into the net472 build, and it additionally requires x64):

              <Project>
              <TargetName="Build">
              <MessageImportance="High"Text="hello" />
              </Target>
              </Project>
              MSBuild.exe trivial.proj -mt -reportfileaccesses
              

              Actual behavior

              MSB1025 / MSB0001: We failed to request a node to be created.

              Either switch on its own works fine (-mt alone prints hello; -reportfileaccesses alone builds normally).

              Expected behavior

              Either the combination works, or MSBuild reports a clear, actionable error explaining that the two switches are mutually exclusive.

              Root cause

              The two features make contradictory demands on node affinity:

              1. BuildManager.EnableDetouredNodeLauncher (src/Build/BackEnd/BuildManager/BuildManager.cs) sets _buildParameters.DisableInProcNode = true, because the in-proc node cannot be detoured:

                // To properly report file access, we need to disable the in-proc node which won't be detoured._buildParameters!.DisableInProcNode=true;
              2. Scheduler.CreateNewNodeIfPossible (src/Build/BackEnd/Components/Scheduler/Scheduler.cs) gives multithreaded mode an out-of-proc node budget of zero, because MT mode is supposed to service everything with in-proc thread nodes:

                intmaxInProcNodeCount=_componentHost.BuildParameters.MultiThreaded?_componentHost.BuildParameters.MaxNodeCount:1;intavailableNodesWithInProcAffinity=maxInProcNodeCount-_currentInProcNodeCount;intavailableNodesWithOutOfProcAffinity=_componentHost.BuildParameters.MultiThreaded?0:_componentHost.BuildParameters.MaxNodeCount-_currentOutOfProcNodeCount;

              With DisableInProcNode == true, NodeAffinity.Any requests are pushed down the out-of-proc branch, but the out-of-proc budget is 0, so no CreateNode response is ever produced and ScheduleUnassignedRequests throws.

              Impact

              Cache implementations built on the project-cache plugin API (for example Microsoft.MSBuildCache) need -reportfileaccesses for cache population, since ProjectCacheService only registers ProjectCachePluginBase.HandleFileAccess / HandleProcess handlers when BuildParameters.ReportFileAccesses is set. Those builds therefore cannot opt into -mt at all today — independent of the deserialization defect in #14824.

              Suggested fix

              Short term, since both switches are experimental and opt-in, detect the combination up front (in BuildManager.BeginBuild or during command-line switch processing) and fail with a specific, localized error instead of an internal error.

              Longer term this needs a design decision: file-access attribution today relies on DetouredNodeLauncher detouring a launched worker process, whereas MT thread nodes live inside the scheduler process and are never launched through NodeLauncher. Reporting file accesses for thread nodes would need a different attribution mechanism before the two features can coexist.

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                No labels
                No labels

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

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

                  Multithreaded MSBuild (-mt) is incompatible with -reportfileaccesses: MSB0001 'We failed to request a node to be created' #14825

                  Description

                  @JanProvaznik

                  Summary

                  -mt (experimental multithreaded MSBuild) and -reportfileaccesses cannot be used together. Combining them fails the build immediately with an internal error, before any project work happens:

                  MSBUILD : error MSB1025: An internal failure occurred while running MSBuild.
                  Microsoft.Build.Framework.InternalErrorException: MSB0001: Internal MSBuild Error: We failed to request a node to be created.
                  at Microsoft.Build.Shared.ErrorUtilities.ThrowInternalError(String message, Exception innerException, Object[] args)
                  at Microsoft.Build.Shared.ErrorUtilities.VerifyThrow(Boolean condition, String unformattedMessage)
                  at Microsoft.Build.BackEnd.Scheduler.ScheduleUnassignedRequests(List`1 responses)
                  at Microsoft.Build.BackEnd.Scheduler.ReportRequestBlocked(Int32 nodeId, BuildRequestBlocker blocker)
                  at Microsoft.Build.Execution.BuildManager.HandleNewRequest(Int32 node, BuildRequestBlocker blocker)
                  

                  This was found while investigating #14824.

                  Steps to reproduce

                  Any project at all, using the x64 .NET Framework MSBuild (file-access reporting is only compiled into the net472 build, and it additionally requires x64):

                  <Project>
                  <TargetName="Build">
                  <MessageImportance="High"Text="hello" />
                  </Target>
                  </Project>
                  MSBuild.exe trivial.proj -mt -reportfileaccesses
                  

                  Actual behavior

                  MSB1025 / MSB0001: We failed to request a node to be created.

                  Either switch on its own works fine (-mt alone prints hello; -reportfileaccesses alone builds normally).

                  Expected behavior

                  Either the combination works, or MSBuild reports a clear, actionable error explaining that the two switches are mutually exclusive.

                  Root cause

                  The two features make contradictory demands on node affinity:

                  1. BuildManager.EnableDetouredNodeLauncher (src/Build/BackEnd/BuildManager/BuildManager.cs) sets _buildParameters.DisableInProcNode = true, because the in-proc node cannot be detoured:

                    // To properly report file access, we need to disable the in-proc node which won't be detoured._buildParameters!.DisableInProcNode=true;
                  2. Scheduler.CreateNewNodeIfPossible (src/Build/BackEnd/Components/Scheduler/Scheduler.cs) gives multithreaded mode an out-of-proc node budget of zero, because MT mode is supposed to service everything with in-proc thread nodes:

                    intmaxInProcNodeCount=_componentHost.BuildParameters.MultiThreaded?_componentHost.BuildParameters.MaxNodeCount:1;intavailableNodesWithInProcAffinity=maxInProcNodeCount-_currentInProcNodeCount;intavailableNodesWithOutOfProcAffinity=_componentHost.BuildParameters.MultiThreaded?0:_componentHost.BuildParameters.MaxNodeCount-_currentOutOfProcNodeCount;

                  With DisableInProcNode == true, NodeAffinity.Any requests are pushed down the out-of-proc branch, but the out-of-proc budget is 0, so no CreateNode response is ever produced and ScheduleUnassignedRequests throws.

                  Impact

                  Cache implementations built on the project-cache plugin API (for example Microsoft.MSBuildCache) need -reportfileaccesses for cache population, since ProjectCacheService only registers ProjectCachePluginBase.HandleFileAccess / HandleProcess handlers when BuildParameters.ReportFileAccesses is set. Those builds therefore cannot opt into -mt at all today — independent of the deserialization defect in #14824.

                  Suggested fix

                  Short term, since both switches are experimental and opt-in, detect the combination up front (in BuildManager.BeginBuild or during command-line switch processing) and fail with a specific, localized error instead of an internal error.

                  Longer term this needs a design decision: file-access attribution today relies on DetouredNodeLauncher detouring a launched worker process, whereas MT thread nodes live inside the scheduler process and are never launched through NodeLauncher. Reporting file accesses for thread nodes would need a different attribution mechanism before the two features can coexist.

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    No labels
                    No labels

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Multithreaded MSBuild (-mt) is incompatible with -reportfileaccesses: MSB0001 'We failed to request a node to be created' · Issue #14825 · dotnet/msbuild · GitHub
                      Skip to content

                      Multithreaded MSBuild (-mt) is incompatible with -reportfileaccesses: MSB0001 'We failed to request a node to be created' #14825

                      Description

                      @JanProvaznik

                      Summary

                      -mt (experimental multithreaded MSBuild) and -reportfileaccesses cannot be used together. Combining them fails the build immediately with an internal error, before any project work happens:

                      MSBUILD : error MSB1025: An internal failure occurred while running MSBuild.
                      Microsoft.Build.Framework.InternalErrorException: MSB0001: Internal MSBuild Error: We failed to request a node to be created.
                      at Microsoft.Build.Shared.ErrorUtilities.ThrowInternalError(String message, Exception innerException, Object[] args)
                      at Microsoft.Build.Shared.ErrorUtilities.VerifyThrow(Boolean condition, String unformattedMessage)
                      at Microsoft.Build.BackEnd.Scheduler.ScheduleUnassignedRequests(List`1 responses)
                      at Microsoft.Build.BackEnd.Scheduler.ReportRequestBlocked(Int32 nodeId, BuildRequestBlocker blocker)
                      at Microsoft.Build.Execution.BuildManager.HandleNewRequest(Int32 node, BuildRequestBlocker blocker)
                      

                      This was found while investigating #14824.

                      Steps to reproduce

                      Any project at all, using the x64 .NET Framework MSBuild (file-access reporting is only compiled into the net472 build, and it additionally requires x64):

                      <Project>
                      <TargetName="Build">
                      <MessageImportance="High"Text="hello" />
                      </Target>
                      </Project>
                      MSBuild.exe trivial.proj -mt -reportfileaccesses
                      

                      Actual behavior

                      MSB1025 / MSB0001: We failed to request a node to be created.

                      Either switch on its own works fine (-mt alone prints hello; -reportfileaccesses alone builds normally).

                      Expected behavior

                      Either the combination works, or MSBuild reports a clear, actionable error explaining that the two switches are mutually exclusive.

                      Root cause

                      The two features make contradictory demands on node affinity:

                      1. BuildManager.EnableDetouredNodeLauncher (src/Build/BackEnd/BuildManager/BuildManager.cs) sets _buildParameters.DisableInProcNode = true, because the in-proc node cannot be detoured:

                        // To properly report file access, we need to disable the in-proc node which won't be detoured._buildParameters!.DisableInProcNode=true;
                      2. Scheduler.CreateNewNodeIfPossible (src/Build/BackEnd/Components/Scheduler/Scheduler.cs) gives multithreaded mode an out-of-proc node budget of zero, because MT mode is supposed to service everything with in-proc thread nodes:

                        intmaxInProcNodeCount=_componentHost.BuildParameters.MultiThreaded?_componentHost.BuildParameters.MaxNodeCount:1;intavailableNodesWithInProcAffinity=maxInProcNodeCount-_currentInProcNodeCount;intavailableNodesWithOutOfProcAffinity=_componentHost.BuildParameters.MultiThreaded?0:_componentHost.BuildParameters.MaxNodeCount-_currentOutOfProcNodeCount;

                      With DisableInProcNode == true, NodeAffinity.Any requests are pushed down the out-of-proc branch, but the out-of-proc budget is 0, so no CreateNode response is ever produced and ScheduleUnassignedRequests throws.

                      Impact

                      Cache implementations built on the project-cache plugin API (for example Microsoft.MSBuildCache) need -reportfileaccesses for cache population, since ProjectCacheService only registers ProjectCachePluginBase.HandleFileAccess / HandleProcess handlers when BuildParameters.ReportFileAccesses is set. Those builds therefore cannot opt into -mt at all today — independent of the deserialization defect in #14824.

                      Suggested fix

                      Short term, since both switches are experimental and opt-in, detect the combination up front (in BuildManager.BeginBuild or during command-line switch processing) and fail with a specific, localized error instead of an internal error.

                      Longer term this needs a design decision: file-access attribution today relies on DetouredNodeLauncher detouring a launched worker process, whereas MT thread nodes live inside the scheduler process and are never launched through NodeLauncher. Reporting file accesses for thread nodes would need a different attribution mechanism before the two features can coexist.

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        No labels
                        No labels

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Multithreaded MSBuild (-mt) is incompatible with -reportfileaccesses: MSB0001 'We failed to request a node to be created' · Issue #14825 · dotnet/msbuild · GitHub
                          Skip to content

                          Multithreaded MSBuild (-mt) is incompatible with -reportfileaccesses: MSB0001 'We failed to request a node to be created' #14825

                          Description

                          @JanProvaznik

                          Summary

                          -mt (experimental multithreaded MSBuild) and -reportfileaccesses cannot be used together. Combining them fails the build immediately with an internal error, before any project work happens:

                          MSBUILD : error MSB1025: An internal failure occurred while running MSBuild.
                          Microsoft.Build.Framework.InternalErrorException: MSB0001: Internal MSBuild Error: We failed to request a node to be created.
                          at Microsoft.Build.Shared.ErrorUtilities.ThrowInternalError(String message, Exception innerException, Object[] args)
                          at Microsoft.Build.Shared.ErrorUtilities.VerifyThrow(Boolean condition, String unformattedMessage)
                          at Microsoft.Build.BackEnd.Scheduler.ScheduleUnassignedRequests(List`1 responses)
                          at Microsoft.Build.BackEnd.Scheduler.ReportRequestBlocked(Int32 nodeId, BuildRequestBlocker blocker)
                          at Microsoft.Build.Execution.BuildManager.HandleNewRequest(Int32 node, BuildRequestBlocker blocker)
                          

                          This was found while investigating #14824.

                          Steps to reproduce

                          Any project at all, using the x64 .NET Framework MSBuild (file-access reporting is only compiled into the net472 build, and it additionally requires x64):

                          <Project>
                          <TargetName="Build">
                          <MessageImportance="High"Text="hello" />
                          </Target>
                          </Project>
                          MSBuild.exe trivial.proj -mt -reportfileaccesses
                          

                          Actual behavior

                          MSB1025 / MSB0001: We failed to request a node to be created.

                          Either switch on its own works fine (-mt alone prints hello; -reportfileaccesses alone builds normally).

                          Expected behavior

                          Either the combination works, or MSBuild reports a clear, actionable error explaining that the two switches are mutually exclusive.

                          Root cause

                          The two features make contradictory demands on node affinity:

                          1. BuildManager.EnableDetouredNodeLauncher (src/Build/BackEnd/BuildManager/BuildManager.cs) sets _buildParameters.DisableInProcNode = true, because the in-proc node cannot be detoured:

                            // To properly report file access, we need to disable the in-proc node which won't be detoured._buildParameters!.DisableInProcNode=true;
                          2. Scheduler.CreateNewNodeIfPossible (src/Build/BackEnd/Components/Scheduler/Scheduler.cs) gives multithreaded mode an out-of-proc node budget of zero, because MT mode is supposed to service everything with in-proc thread nodes:

                            intmaxInProcNodeCount=_componentHost.BuildParameters.MultiThreaded?_componentHost.BuildParameters.MaxNodeCount:1;intavailableNodesWithInProcAffinity=maxInProcNodeCount-_currentInProcNodeCount;intavailableNodesWithOutOfProcAffinity=_componentHost.BuildParameters.MultiThreaded?0:_componentHost.BuildParameters.MaxNodeCount-_currentOutOfProcNodeCount;

                          With DisableInProcNode == true, NodeAffinity.Any requests are pushed down the out-of-proc branch, but the out-of-proc budget is 0, so no CreateNode response is ever produced and ScheduleUnassignedRequests throws.

                          Impact

                          Cache implementations built on the project-cache plugin API (for example Microsoft.MSBuildCache) need -reportfileaccesses for cache population, since ProjectCacheService only registers ProjectCachePluginBase.HandleFileAccess / HandleProcess handlers when BuildParameters.ReportFileAccesses is set. Those builds therefore cannot opt into -mt at all today — independent of the deserialization defect in #14824.

                          Suggested fix

                          Short term, since both switches are experimental and opt-in, detect the combination up front (in BuildManager.BeginBuild or during command-line switch processing) and fail with a specific, localized error instead of an internal error.

                          Longer term this needs a design decision: file-access attribution today relies on DetouredNodeLauncher detouring a launched worker process, whereas MT thread nodes live inside the scheduler process and are never launched through NodeLauncher. Reporting file accesses for thread nodes would need a different attribution mechanism before the two features can coexist.

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            No labels
                            No labels

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

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

                              Multithreaded MSBuild (-mt) is incompatible with -reportfileaccesses: MSB0001 'We failed to request a node to be created' #14825

                              Description

                              @JanProvaznik

                              Summary

                              -mt (experimental multithreaded MSBuild) and -reportfileaccesses cannot be used together. Combining them fails the build immediately with an internal error, before any project work happens:

                              MSBUILD : error MSB1025: An internal failure occurred while running MSBuild.
                              Microsoft.Build.Framework.InternalErrorException: MSB0001: Internal MSBuild Error: We failed to request a node to be created.
                              at Microsoft.Build.Shared.ErrorUtilities.ThrowInternalError(String message, Exception innerException, Object[] args)
                              at Microsoft.Build.Shared.ErrorUtilities.VerifyThrow(Boolean condition, String unformattedMessage)
                              at Microsoft.Build.BackEnd.Scheduler.ScheduleUnassignedRequests(List`1 responses)
                              at Microsoft.Build.BackEnd.Scheduler.ReportRequestBlocked(Int32 nodeId, BuildRequestBlocker blocker)
                              at Microsoft.Build.Execution.BuildManager.HandleNewRequest(Int32 node, BuildRequestBlocker blocker)
                              

                              This was found while investigating #14824.

                              Steps to reproduce

                              Any project at all, using the x64 .NET Framework MSBuild (file-access reporting is only compiled into the net472 build, and it additionally requires x64):

                              <Project>
                              <TargetName="Build">
                              <MessageImportance="High"Text="hello" />
                              </Target>
                              </Project>
                              MSBuild.exe trivial.proj -mt -reportfileaccesses
                              

                              Actual behavior

                              MSB1025 / MSB0001: We failed to request a node to be created.

                              Either switch on its own works fine (-mt alone prints hello; -reportfileaccesses alone builds normally).

                              Expected behavior

                              Either the combination works, or MSBuild reports a clear, actionable error explaining that the two switches are mutually exclusive.

                              Root cause

                              The two features make contradictory demands on node affinity:

                              1. BuildManager.EnableDetouredNodeLauncher (src/Build/BackEnd/BuildManager/BuildManager.cs) sets _buildParameters.DisableInProcNode = true, because the in-proc node cannot be detoured:

                                // To properly report file access, we need to disable the in-proc node which won't be detoured._buildParameters!.DisableInProcNode=true;
                              2. Scheduler.CreateNewNodeIfPossible (src/Build/BackEnd/Components/Scheduler/Scheduler.cs) gives multithreaded mode an out-of-proc node budget of zero, because MT mode is supposed to service everything with in-proc thread nodes:

                                intmaxInProcNodeCount=_componentHost.BuildParameters.MultiThreaded?_componentHost.BuildParameters.MaxNodeCount:1;intavailableNodesWithInProcAffinity=maxInProcNodeCount-_currentInProcNodeCount;intavailableNodesWithOutOfProcAffinity=_componentHost.BuildParameters.MultiThreaded?0:_componentHost.BuildParameters.MaxNodeCount-_currentOutOfProcNodeCount;

                              With DisableInProcNode == true, NodeAffinity.Any requests are pushed down the out-of-proc branch, but the out-of-proc budget is 0, so no CreateNode response is ever produced and ScheduleUnassignedRequests throws.

                              Impact

                              Cache implementations built on the project-cache plugin API (for example Microsoft.MSBuildCache) need -reportfileaccesses for cache population, since ProjectCacheService only registers ProjectCachePluginBase.HandleFileAccess / HandleProcess handlers when BuildParameters.ReportFileAccesses is set. Those builds therefore cannot opt into -mt at all today — independent of the deserialization defect in #14824.

                              Suggested fix

                              Short term, since both switches are experimental and opt-in, detect the combination up front (in BuildManager.BeginBuild or during command-line switch processing) and fail with a specific, localized error instead of an internal error.

                              Longer term this needs a design decision: file-access attribution today relies on DetouredNodeLauncher detouring a launched worker process, whereas MT thread nodes live inside the scheduler process and are never launched through NodeLauncher. Reporting file accesses for thread nodes would need a different attribution mechanism before the two features can coexist.

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                No labels
                                No labels

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions