summaryrefslogtreecommitdiffstats
path: root/libglusterfs
diff options
context:
space:
mode:
authorKotresh H R <khiremat@redhat.com>2014-08-01 16:12:38 +0530
committerVijay Bellur <vbellur@redhat.com>2014-09-08 12:02:19 -0700
commit81a127513da40424c572d566c1f26a7dfb345037 (patch)
treea0cf87e5d13742015353843db64ec934ed75e688 /libglusterfs
parent85275c5f1d9fe120ed45147a15be74b70d4c7958 (diff)
feature/geo-rep: Keep marker.tstamp's mtime unchangeable during snapshot.
Problem: Geo-replicatoin does a full xsync crawl after snapshot restoration of slave and master. It does not do history crawl. Analysis: Marker creates 'marker.tstamp' file when geo-rep is started for the first time. The virtual extended attribute 'trusted.glusterfs.volume-mark' is maintained and whenever it is queried on gluster mount point, marker fills it on the fly and returns the combination of uuid, ctime of marker.tstamp and others. So ctime of marker.tstamp, in other sense 'volume-mark' marks the geo-rep start time when the session is freshly created. From the above, after the first filesystem crawl(xsync) is done during first geo-rep start, stime should always be less than 'volume-mark'. So whenever stime is less than volume-mark, it does full filesystem crawl (xsync). Root Cause: When snapshot is restored, marker.tstamp file is freshly created losing the timestamps, it was originally created with. Solution: 1. Change is made to depend on mtime instead of ctime. 2. mtime and atime of marker.tstamp is restored back when snapshot is created and restored. BUG: 1138952 Change-Id: I0e19e1cb2593171b9a2b41d0d303330feb7fd2b3 Signed-off-by: Kotresh H R <khiremat@redhat.com> Reviewed-on: http://review.gluster.org/8401 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com> Reviewed-on: http://review.gluster.org/8642
Diffstat (limited to 'libglusterfs')
-rw-r--r--libglusterfs/src/common-utils.c43
-rw-r--r--libglusterfs/src/common-utils.h1
2 files changed, 44 insertions, 0 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c
index 54ee3e53818..be8bd6298ac 100644
--- a/libglusterfs/src/common-utils.c
+++ b/libglusterfs/src/common-utils.c
@@ -3232,3 +3232,46 @@ gf_compare_sockaddr (const struct sockaddr *addr1,
}
return _gf_false;
}
+
+/*
+ * gf_set_timestamp:
+ * It sets the mtime and atime of 'dest' file as of 'src'.
+ */
+
+int
+gf_set_timestamp (const char *src, const char* dest)
+{
+ struct stat sb = {0, };
+ struct timeval new_time[2] = {{0, },{0,}};
+ int ret = 0;
+ xlator_t *this = NULL;
+
+ this = THIS;
+ GF_ASSERT (this);
+ GF_ASSERT (src);
+ GF_ASSERT (dest);
+
+ ret = stat (src, &sb);
+ if (ret) {
+ gf_log (this->name, GF_LOG_ERROR, "stat on %s failed: %s",
+ src, strerror(errno));
+ goto out;
+ }
+ new_time[0].tv_sec = sb.st_atime;
+ new_time[0].tv_usec = ST_ATIM_NSEC (&sb)/1000;
+
+ new_time[1].tv_sec = sb.st_mtime;
+ new_time[1].tv_usec = ST_MTIM_NSEC (&sb)/1000;
+
+ /* The granularity is micro seconds as per the current
+ * requiremnt. Hence using 'utimes'. This can be updated
+ * to 'utimensat' if we need timestamp in nanoseconds.
+ */
+ ret = utimes (dest, new_time);
+ if (ret) {
+ gf_log (this->name, GF_LOG_ERROR, "utimes on %s failed: %s",
+ dest, strerror(errno));
+ }
+out:
+ return ret;
+}
diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h
index 98f30fc47b0..4eec5170c60 100644
--- a/libglusterfs/src/common-utils.h
+++ b/libglusterfs/src/common-utils.h
@@ -620,6 +620,7 @@ int gf_get_hostname_from_ip (char *client_ip, char **hostname);
gf_boolean_t gf_is_local_addr (char *hostname);
gf_boolean_t gf_is_same_address (char *host1, char *host2);
void md5_wrapper(const unsigned char *data, size_t len, char *md5);
+int gf_set_timestamp (const char *src, const char* dest);
int gf_thread_create (pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg);