microsoft / microsoft/MSBuildCache

Materialize outputs after recursively memoized cache hits

Abierto
#167 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
C#
Estrellas
64
Forks
24
Merge medio
1 d 14 h
PR fusionados (30 d)
2

Descripción

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.

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Lee src/Common/MSBuildCachePluginBase.cs, centrándote en la ruta de resultados recursiva de ConcurrentDictionary<NodeContext, Lazy<Task>> y en cómo se gestiona materializeOutputs. Rastrea las consultas recursivas y directas y, después, añade una prueba determinista de concurrencia/orden que cubra consultas de dependencias fuera de orden y compilaciones internas de multi-targeting. La tarea estará completada cuando un resultado recursivo sin materialización haga que las salidas requeridas se materialicen exactamente una vez, mientras que el comportamiento predeterminado y el no recursivo sigan sin cambios.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
csharp
Área
build-system
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Tranquilo
Claridad
Bastante claro
Aptitud para principiantes
48/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.