summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xtests/bugs/bug-859581.t47
-rw-r--r--xlators/storage/posix/src/posix-handle.c11
-rw-r--r--xlators/storage/posix/src/posix-handle.h13
3 files changed, 63 insertions, 8 deletions
diff --git a/tests/bugs/bug-859581.t b/tests/bugs/bug-859581.t
new file mode 100755
index 00000000000..f31e8b311ef
--- /dev/null
+++ b/tests/bugs/bug-859581.t
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+. $(dirname $0)/../include.rc
+. $(dirname $0)/../volume.rc
+
+cleanup;
+
+TEST glusterd
+TEST pidof glusterd
+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2}
+EXPECT 'Created' volinfo_field $V0 'Status';
+TEST $CLI volume start $V0
+EXPECT 'Started' volinfo_field $V0 'Status';
+# Needed to be sure self-heal daemon is running
+sleep 5
+
+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;
+
+mkdir -p $M0/dir1/dir2
+
+TEST rm -f $(gf_get_gfid_backend_file_path $B0/${V0}1 "dir1")
+TEST rmdir $B0/${V0}1/dir1/dir2
+
+TEST $CLI volume heal $V0 full
+sleep 5
+
+TEST [ -d $B0/${V0}1/dir1/dir2 ]
+TEST [ ! -d $(gf_get_gfid_backend_file_path $B0/${V0}1 "dir1") ]
+
+# Stop the volume to flush caches and force symlink recreation
+TEST umount $M0
+TEST $CLI volume stop $V0
+EXPECT 'Stopped' volinfo_field $V0 'Status';
+TEST $CLI volume start $V0
+EXPECT 'Started' volinfo_field $V0 'Status';
+TEST glusterfs --entry-timeout=0 --attribute-timeout=0 -s $H0 --volfile-id $V0 $M0;
+
+ls -l $M0/
+
+TEST [ -h $(gf_get_gfid_backend_file_path $B0/${V0}1 "dir1") ]
+
+TEST umount $M0
+TEST $CLI volume stop $V0
+TEST $CLI volume delete $V0
+
+cleanup
+
diff --git a/xlators/storage/posix/src/posix-handle.c b/xlators/storage/posix/src/posix-handle.c
index adb8acc075d..78aba988e31 100644
--- a/xlators/storage/posix/src/posix-handle.c
+++ b/xlators/storage/posix/src/posix-handle.c
@@ -438,7 +438,6 @@ posix_handle_init (xlator_t *this)
struct posix_private *priv = NULL;
char *handle_pfx = NULL;
int ret = 0;
- int len = 0;
struct stat stbuf;
struct stat rootbuf;
struct stat exportbuf;
@@ -491,9 +490,7 @@ posix_handle_init (xlator_t *this)
stat (handle_pfx, &priv->handledir);
- len = posix_handle_path (this, gfid, NULL, NULL, 0);
- rootstr = alloca (len);
- posix_handle_path (this, gfid, NULL, rootstr, len);
+ MAKE_HANDLE_ABSPATH(rootstr, this, gfid);
ret = stat (rootstr, &rootbuf);
switch (ret) {
@@ -683,7 +680,7 @@ posix_handle_hard (xlator_t *this, const char *oldpath, uuid_t gfid, struct stat
int ret = -1;
- MAKE_HANDLE_PATH (newpath, this, gfid, NULL);
+ MAKE_HANDLE_ABSPATH (newpath, this, gfid);
ret = lstat (newpath, &newbuf);
if (ret == -1 && errno != ENOENT) {
@@ -742,11 +739,9 @@ posix_handle_soft (xlator_t *this, const char *real_path, loc_t *loc,
struct stat newbuf;
int ret = -1;
-
- MAKE_HANDLE_PATH (newpath, this, gfid, NULL);
+ MAKE_HANDLE_ABSPATH (newpath, this, gfid);
MAKE_HANDLE_RELPATH (oldpath, this, loc->pargfid, loc->name);
-
ret = lstat (newpath, &newbuf);
if (ret == -1 && errno != ENOENT) {
gf_log (this->name, GF_LOG_WARNING,
diff --git a/xlators/storage/posix/src/posix-handle.h b/xlators/storage/posix/src/posix-handle.h
index 31cbf83fd02..0f596b6069e 100644
--- a/xlators/storage/posix/src/posix-handle.h
+++ b/xlators/storage/posix/src/posix-handle.h
@@ -24,6 +24,10 @@
#define UUID0_STR "00000000-0000-0000-0000-000000000000"
#define SLEN(str) (sizeof(str) - 1)
+#define HANDLE_ABSPATH_LEN(this) (POSIX_BASE_PATH_LEN(this) + \
+ SLEN("/" GF_HIDDEN_PATH "/00/00/" \
+ UUID0_STR) + 1)
+
#define LOC_HAS_ABSPATH(loc) (loc && (loc->path) && (loc->path[0] == '/'))
#define MAKE_PGFID_XATTR_KEY(var, prefix, pgfid) do { \
@@ -133,6 +137,15 @@
} while (0)
+#define MAKE_HANDLE_ABSPATH(var, this, gfid) do { \
+ struct posix_private * __priv = this->private; \
+ int __len = HANDLE_ABSPATH_LEN(this); \
+ var = alloca(__len); \
+ snprintf(var, __len, "%s/" GF_HIDDEN_PATH "/%02x/%02x/%s", \
+ __priv->base_path, gfid[0], gfid[1], uuid_utoa(gfid)); \
+ } while (0)
+
+
#define MAKE_INODE_HANDLE(rpath, this, loc, iatt_p) do { \
if (uuid_is_null (loc->gfid)) { \
gf_log (this->name, GF_LOG_ERROR, \