microsoft / microsoft/MSBuildCache

Materialize outputs after recursively memoized cache hits

Offen
#167 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
C#
Sterne
64
Forks
24
Ø Merge
1 T. 14 Std.
Gemergte PRs (30 T.)
2

Beschreibung

Summary

Recursive cache results are memoized only by NodeContext, but each memoized Lazy<Task<CacheResult>> captures whether outputs should be materialized.

Impact

With MSBuildCacheGetResultsForUnqueriedDependencies=true, a recursive query that does not require outputs can populate the memoized result first. A later direct query for the same node reuses that cache hit without materializing required files, allowing MSBuild to proceed with missing reference assemblies or other outputs.

Evidence

src/Common/MSBuildCachePluginBase.cs stores recursive results in ConcurrentDictionary<NodeContext, Lazy<Task<CacheResult>>>. materializeOutputs is not part of the key or separately tracked. The implementation comments assume the node will not later be queried directly, while the setting is documented for builds that are not executed in graph order.

Suggested fix

Separate result lookup from materialization state. A direct caller requiring outputs should be able to materialize a previously memoized non-materialized hit without repeating fingerprint/cache lookup. Alternatively, include the materialization requirement in memoization while preventing duplicate result mutation.

Acceptance criteria

  • A recursive non-materializing hit followed by a direct query materializes outputs exactly once.
  • The fix covers out-of-order dependency queries and multi-targeting inner builds.
  • Default and non-recursive behavior remains unchanged.
  • A deterministic concurrency/order test covers the regression.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Lies src/Common/MSBuildCachePluginBase.cs und konzentriere dich dabei auf den rekursiven Ergebnispfad von ConcurrentDictionary<NodeContext, Lazy<Task>> sowie darauf, wie materializeOutputs behandelt wird. Verfolge rekursive und direkte Abfragen und füge anschließend einen deterministischen Nebenläufigkeits-/Reihenfolgetest hinzu, der Abfragen von Abhängigkeiten in nicht aufsteigender Reihenfolge und Multi-Targeting-Innenbuilds abdeckt. Erledigt ist die Aufgabe, wenn ein nicht materialisierender rekursiver Treffer bewirkt, dass erforderliche Ausgaben genau einmal materialisiert werden, während das Standardverhalten und das nicht rekursive Verhalten unverändert bleiben.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
csharp
Bereich
build-system
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
48/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.