[ccache] patch: fix NFS issues
John Coiner
john.coiner at amd.com
Tue Mar 27 22:31:36 GMT 2007
This is a more elegant fix for NFS issues. It applies to ccache-2.4.
Unlike my previous patch, it doesn't create lock files, thereby avoiding
any issues with stale lock files.
- John
diff -u /home/jcoiner/ccache-2.4/ccache.c ccache-2.4_nfs_fix/ccache.c
--- /home/jcoiner/ccache-2.4/ccache.c Mon Sep 13 06:38:30 2004
+++ ccache-2.4_nfs_fix/ccache.c Tue Mar 27 12:39:35 2007
@@ -149,6 +149,22 @@
return ret;
}
+static int safe_rename(const char* oldpath, const char* newpath)
+{
+ /* safe_rename is for creating entries in the cache.
+
+ Works like rename(), but it never overwrites an existing
+ cache entry. This avoids corruption on NFS. */
+ int status = link( oldpath, newpath );
+ if( status == 0 || errno == EEXIST )
+ {
+ return unlink( oldpath );
+ }
+ else
+ {
+ return -1;
+ }
+}
/* run the real compiler and put the result in cache */
static void to_cache(ARGS *args)
@@ -232,8 +248,8 @@
if (stat(tmp_stderr, &st1) != 0 ||
stat(tmp_hashname, &st2) != 0 ||
- rename(tmp_hashname, hashname) != 0 ||
- rename(tmp_stderr, path_stderr) != 0) {
+ safe_rename(tmp_hashname, hashname) != 0 ||
+ safe_rename(tmp_stderr, path_stderr) != 0) {
cc_log("failed to rename tmp files - %s\n", strerror(errno));
stats_update(STATS_ERROR);
failed();
More information about the ccache
mailing list