microsoft / microsoft/MSBuildCache
Materialize outputs after recursively memoized cache hits
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
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- 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