afr: customize client-pid=-1 xtime aggregation to tolerate a replica down

Using the new 'pluggable policies' API of libxlator.

Change-Id: Ie7528182dff8fb42c6e8287a106d3057944df775
BUG: 847839
Original Author: Csaba Henk <csaba@redhat.com>
Signed-off-by: Avra Sengupta <asengupt@redhat.com>
Reviewed-on: http://review.gluster.org/4904
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
This commit is contained in:
Avra Sengupta 2013-04-29 20:30:30 +02:00 committed by Vijay Bellur
parent 2af3e8bd6d
commit 3f6a570264
2 changed files with 50 additions and 2 deletions

41
tests/bugs/bug-877293.t Executable file
View File

@ -0,0 +1,41 @@
#!/bin/bash
. $(dirname $0)/../include.rc
. $(dirname $0)/../volume.rc
TEST glusterd
TEST pidof glusterd
## Start and create a replicated volume
mkdir -p ${B0}/${V0}-0
mkdir -p ${B0}/${V0}-1
TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}-{0,1}
TEST $CLI volume set $V0 indexing on
TEST $CLI volume start $V0;
## Mount native
TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0
## Mount client-pid=-1
TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 --client-pid=-1 $M1
TEST touch $M0
vol_uuid=`getfattr -n trusted.glusterfs.volume-mark -ehex $M1 | sed -n 's/^trusted.glusterfs.volume-mark=0x//p' | cut -b5-36 | sed 's/\([a-f0-9]\{8\}\)\([a-f0-9]\{4\}\)\([a-f0-9]\{4\}\)\([a-f0-9]\{4\}\)/\1-\2-\3-\4-/'`
xtime=trusted.glusterfs.$vol_uuid.xtime
TEST "getfattr -n $xtime $M1 | grep -q ${xtime}="
TEST kill_brick $V0 $H0 $B0/${V0}-0
TEST "getfattr -n $xtime $M1 | grep -q ${xtime}="
TEST umount $M0
TEST umount $M1
TEST $CLI volume stop $V0;
TEST $CLI volume delete $V0;
cleanup

View File

@ -1461,7 +1461,7 @@ afr_getxattr (call_frame_t *frame, xlator_t *this,
int32_t read_child = -1;
int ret = -1;
fop_getxattr_cbk_t cbk = NULL;
int afr_xtime_gauge[MCNT_MAX] = {0,};
VALIDATE_OR_GOTO (frame, out);
VALIDATE_OR_GOTO (this, out);
@ -1557,13 +1557,20 @@ afr_getxattr (call_frame_t *frame, xlator_t *this,
}
/* don't err out on getting ENOTCONN (brick down)
* from a subset of the bricks
*/
memcpy (afr_xtime_gauge, marker_xtime_default_gauge,
sizeof (afr_xtime_gauge));
afr_xtime_gauge[MCNT_NOTFOUND] = 0;
afr_xtime_gauge[MCNT_ENOTCONN] = 0;
if (cluster_getmarkerattr (frame, this, loc,
name, local,
afr_getxattr_unwind,
sub_volumes,
priv->child_count,
MARKER_XTIME_TYPE,
marker_xtime_default_gauge,
afr_xtime_gauge,
priv->vol_uuid)) {
gf_log (this->name, GF_LOG_INFO,
"%s: failed to get marker attr (%s)",