Re: pathological direct mode behavior for files with many often changing include files

Joel Rosdahl <[email protected]>
Newsgroups gmane.comp.compilers.ccache
Message-ID <CAK8D=pgsJyVY9SGLVa-UZWGcNCz0WadX7dJ2R7iujoFURimsBw@mail.gmail.com>
> 2. Ccache infinite loops while writing out manifest after 65k files. In
> `write_manifest`, the counter is 16bit while n_file_infos is 32bit.

Oh, that's an oversight in an early refactoring of the manifest format.
Thanks for finding and fixing the problem.

> Since the manifest file reaping is only based on the actual source
> file (not its dependent files) changing, this list can grow very large.

For the record, and just to clarify, a changed source file results in a
different manifest file, which is subject to the same cache cleanup logic
as other files in the cache. New object file entries are added to a
manifest file when the set (or content) of included header files for a
given source file (in combination with compiler options, etc.) has changed.
When the list of such entries becomes larger than 100, the manifest will be
emptied as a crude method of garbage collection.

Doing the same maneuver for a large number of file info entries, like you
suggest, sounds like a good idea. Patch applied.

-- Joel


On 15 April 2014 00:05, Yiding Jia <[email protected]> wrote:

> When direct mode is enabled and a file has many dependencies that change,
> it will cause `file_info` entries to accumulate over an extended period of
> time. Since the manifest file reaping is only based on the actual source
> file (not its dependent files) changing, this list can grow very large.
>
> This has two effects:
>
> 1. Ccache execution becomes slower when writing. In a simple pathological
> test ccache took from 50ms to 150ms on cache misses, this includes the
> underlying compile time, so actual ccache attributed performance hit is
> worse. The effect is minimized during hits.
> 2. Ccache infinite loops while writing out manifest after 65k files. In
> `write_manifest`, the counter is 16bit while n_file_infos is 32bit.
>
> This may be a somewhat rare occurrence in the field. We use ccache for
> continuous integration, and this problem only shows up for a few files
> (those with many recursively included frequently changing headers) after
> tens of thousands of builds. Once it starts happening, however, subsequent
> builds fail as the cache is effectively poisoned.
>
>
>
> Repro steps:
>
> 1. Create 10000 header files with some random valid contents (such as
> `extern int foo_RANDOMNUMBER;`)
> 2. Create a c file that references those header files, and does something
> trivial.
> 3. Compile with ccache in direct mode.
> 4. Goto 1.
>
>
> Simple patch attached, which converts all the counters in `manifest.c` to
> `uint32_t` from `uint16_t` and reaps a manifest file when the number of
> file_info entries becomes larger than some threshold. I have not
> experimented with this threshold, but 10000 should accommodate a sizable
> number of file changes.
>
>
> _______________________________________________
> ccache mailing list
> [email protected]
> https://lists.samba.org/mailman/listinfo/ccache
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.