[ccache] Re: patch: workaround for NFS issues

John Coiner john.coiner at amd.com
Sat Mar 24 18:07:21 GMT 2007


Ignore that patch -- this workaround does not work.


John Coiner wrote:
> 
> Hi all,
> 
> Here's a patch, for ccache 2.4, which works around the NFS bug. From the 
> ccache man page:
> 
> "BUGS. When the cache is stored on an NFS filesystem, the filesystem 
> must be exported with the no_subtree_check option to make renames 
> between directories reliable."
> 
> I have seen corrupt object files when doing parallel builds. At my 
> company, I am a mere user, so I asked someone in the IT department about 
> enabling no_subtree_check. He says our fileserver doesn't support it.
> 
> This patch provides another option, when no_subtree_check isn't available.
> 
> How it works: when CCACHE_NFS_WORKAROUND is set, ccache won't rename 
> files across directories. Instead, it copies the file to its destination 
> directory, and then renames it. This is inefficient, but it's more 
> efficient than not using ccache. The cost of the extra copy is only 
> incurred on a cache miss.
> 
> To test this, I set up a testbench which starts 12 parallel builds on 
> different machines simultaneously. Each build compiles the same .c file 
> into a .o, and then links the .o into an executable. They all use the 
> same ccache. Without the workaround, this produces a linker failure in 
> about 50% of trials; with the workaround, I have not seen a failure in 
>  >15 trials. So it might actually work.
> 
> - John
> 
> 
> 
> --- ccache-2.4/ccache.c 2004-09-13 06:38:30.000000000 -0400
> +++ ccache-2.4-fix/ccache.c     2007-03-24 10:40:46.000000000 -0500
> @@ -157,6 +157,7 @@
>         char *tmp_stdout, *tmp_stderr, *tmp_hashname;
>         struct stat st1, st2;
>         int status;
> +       char *workaround = getenv("CCACHE_NFS_WORKAROUND");
> 
>         x_asprintf(&tmp_stdout, "%s/tmp.stdout.%s", temp_dir, 
> tmp_string());
>         x_asprintf(&tmp_stderr, "%s/tmp.stderr.%s", temp_dir, 
> tmp_string());
> @@ -232,7 +233,8 @@
> 
>         if (stat(tmp_stderr, &st1) != 0 ||
>             stat(tmp_hashname, &st2) != 0 ||
> -           rename(tmp_hashname, hashname) != 0 ||
> +           (  workaround && ( copy_file(tmp_hashname, hashname) != 0 ) 
> ) ||
> +           ( !workaround && ( rename   (tmp_hashname, hashname) != 0 ) 
> ) ||
>             rename(tmp_stderr, path_stderr) != 0) {
>                 cc_log("failed to rename tmp files - %s\n", 
> strerror(errno));
>                 stats_update(STATS_ERROR);
> diff -u ccache-2.4/util.c ccache-2.4-fix/util.c
> --- ccache-2.4/util.c   2004-09-13 06:38:30.000000000 -0400
> +++ ccache-2.4-fix/util.c       2007-03-24 10:46:15.000000000 -0500
> @@ -68,7 +68,16 @@
>         char *tmp_name;
>         mode_t mask;
> 
> -       x_asprintf(&tmp_name, "%s.XXXXXX", dest);
> +       if( getenv("CCACHE_NFS_WORKAROUND") )
> +       {
> +           /* hostname and pid means this filename is unique. */
> +           x_asprintf( &tmp_name, "%s.XXXXXX.%s.%d", dest,
> +                       getenv("HOSTNAME"), getpid() );
> +       }
> +       else
> +       {
> +           x_asprintf( &tmp_name, "%s.XXXXXX", dest );
> +       }
> 
>         fd1 = open(src, O_RDONLY|O_BINARY);
>         if (fd1 == -1) {
> 
> 





More information about the ccache mailing list