diff options
-rwxr-xr-x | tests/bugs/bug-893378.t | 71 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 11 |
2 files changed, 81 insertions, 1 deletions
diff --git a/tests/bugs/bug-893378.t b/tests/bugs/bug-893378.t new file mode 100755 index 0000000000..470589f537 --- /dev/null +++ b/tests/bugs/bug-893378.t @@ -0,0 +1,71 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +cleanup; +BRICK_COUNT=3 + +function file_has_linkfile() +{ + i=0 + j=0 + while [ $i -lt $BRICK_COUNT ] + do + stat=`stat $B0/${V0}$i/$1 2>/dev/null` + if [ $? -eq 0 ] + then + let j++ + let "BRICK${j}=$i" + + fi + let i++ + done + return $j +} + +function get_cached_brick() +{ + i=1 + while [ $i -lt 3 ] + do + test=`getfattr -n trusted.glusterfs.dht.linkto -e text $B0/${V0}$BRICK$i 2>&1` + if [ $? -eq 1 ] + then + cached=$BRICK"$i" + i=$(( $i+3 )) + fi + let i++ + done + + return $cached +} + +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2 +TEST $CLI volume start $V0 + +## Mount FUSE +TEST glusterfs --attribute-timeout=0 --entry-timeout=0 -s $H0 --volfile-id $V0 $M0; + +## create a linkfile on subvolume 0 +TEST touch $M0/1 +TEST mv $M0/1 $M0/2 + +file_has_linkfile 2 +has_link=$? +if [ $has_link -eq 2 ] +then + get_cached_brick + CACHED=$? + # Kill a brick process + kill -9 `cat /var/lib/glusterd/vols/$V0/run/$H0-d-backends-${V0}$CACHED.pid`; +fi + +## trigger a lookup +ls -l $M0/2 2>/dev/null + +## fail dd if file exists. + +dd if=/dev/zero of=$M0/2 bs=1 count=1 conv=excl 2>/dev/null +EXPECT "1" echo $? diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index ded86bcc37..540c2ed87a 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -1095,7 +1095,16 @@ dht_lookup_linkfile_cbk (call_frame_t *frame, void *cookie, gf_log (this->name, GF_LOG_INFO, "lookup of %s on %s (following linkfile) failed (%s)", local->loc.path, subvol->name, strerror (op_errno)); - goto err; + + /* If cached subvol returned ENOTCONN, do not do + lookup_everywhere. We need to make sure linkfile does not get + removed, which can take away the namespace, and subvol is + anyways down. */ + + if (op_errno != ENOTCONN) + goto err; + else + goto unwind; } if (check_is_dir (inode, stbuf, xattr)) { |