diff options
author | Dan Lambright <dlambrig@redhat.com> | 2015-02-18 14:49:50 -0500 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2015-03-18 04:47:41 -0700 |
commit | a216745e5db3fdb4fa8d625c971e70f8d0e34d23 (patch) | |
tree | c1165dbc612ec7121bd1734cb9bb006f9ac7c9d3 /tests/bugs | |
parent | 38ccaaf9d1a93c4fc6d733ee3bd5c73e5457bdab (diff) |
cluster/dht: Change the subvolume encoding in d_off to be a "global"
position in the graph rather than relative (local) to a particular
translator.
Encoding the volume in this way allows a single translator to manage
which brick is currently being scanned for directory entries. Using a
single translator minimizes allocated bits in the d_off. It also allows
multiple DHT translators in the same graph to have a common frame of
reference (the graph position) for which brick is being read. Multiple
DHT translators are needed for the Tiering feature.
The fix builds off a previous change (9332) which removed subvolume
encoding from AFR. The fix makes an equivalent change to the EC
translator.
More background can be found in fix 9332 and gluster-dev discussions [1].
DHT and AFR/EC are responsibile (as before) for choosing which brick to
enumerate directory entries in over the readdir lifecycle.
The client translator receiving the readdir fop encodes the dht_t. It
is referred to as the "leaf node" in the graph and corresponds to the
brick being scanned.
When DHT decodes the d_off, it translates the leaf node to a local
subvolume, which represents the next node in the graph leading to
the brick.
Tracking of leaf nodes is done in common utility functions. Leaf nodes
counts and positional information are updated on a graph switch.
[1] www.gluster.org/pipermail/gluster-devel/2015-January/043592.html
Change-Id: Iaf0ea86d7046b1ceadbad69d88707b243077ebc8
BUG: 1190734
Signed-off-by: Dan Lambright <dlambrig@redhat.com>
Reviewed-on: http://review.gluster.org/9688
Reviewed-by: Xavier Hernandez <xhernandez@datalab.es>
Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Tested-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'tests/bugs')
-rw-r--r-- | tests/bugs/distribute/bug-1190734.t | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/tests/bugs/distribute/bug-1190734.t b/tests/bugs/distribute/bug-1190734.t new file mode 100644 index 00000000000..c2f2338dc0f --- /dev/null +++ b/tests/bugs/distribute/bug-1190734.t @@ -0,0 +1,104 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../nfs.rc + +BRICK_COUNT=3 +FILE_COUNT=100 + +function create_files { + rm -rf $2 + mkdir $2 + for i in `seq 1 $1`; do + touch $2/file_$i + done +} + +function check_file_count { + ORIG_FILE_COUNT=`find $2 | tail -n +2 |wc -l` + [ $ORIG_FILE_COUNT -eq $1 ] +} + +function reset { + $CLI volume stop $V0 + umount $1 + $CLI volume delete $V0 +} + +function start_mount_fuse { + $CLI volume start $V0 + [ $? -ne 0 ] && return 1 + + $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0 + [ $? -ne 0 ] && return 1 + + create_files $FILE_COUNT $M0/$1 + [ $? -ne 0 ] && return 1 + + return 0 +} + +function start_mount_nfs { + $CLI volume start $V0 + [ $? -ne 0 ] && return 1 + + sleep 3 + mount_nfs $H0:/$V0 $N0 + [ $? -ne 0 ] && return 1 + + create_files $FILE_COUNT $N0/$1 + [ $? -ne 0 ] && return 1 + + return 0 +} + +function start_removing_bricks { + check_file_count $FILE_COUNT $1 + [ $? -ne 0 ] && return 1 + $CLI volume remove-brick $V0 replica 2 $H0:$B0/${V0}2 $H0:$B0/${V0}3 start + [ $? -ne 0 ] && return 1 + + return 0 +} + +function finish_removing_bricks { + + $CLI volume remove-brick $V0 replica 2 $H0:$B0/${V0}2 $H0:$B0/${V0}3 commit + [ $? -ne 0 ] && return 1 + + check_file_count $FILE_COUNT $1 + return $? +} + +cleanup + +TEST glusterd +TEST pidof glusterd + +# Test 1-2 Create repliacted volume + +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1 \ + $H0:$B0/${V0}2 $H0:$B0/${V0}3 $H0:$B0/${V0}4 $H0:$B0/${V0}5 + +# ------- test 1: AFR, fuse + remove bricks + +TEST start_mount_fuse test1 +TEST start_removing_bricks $M0/test1 +EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0" "$H0:$B0/${V0}2 $H0:$B0/${V0}3" +$CLI volume remove-brick $V0 replica 2 $H0:$B0/${V0}2 $H0:$B0/${V0}3 status > /tmp/out +TEST finish_removing_bricks $M0/test1 +reset $M0 + +# ------- test 2: AFR, nfs + remove bricks + +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1 \ + $H0:$B0/${V0}2 $H0:$B0/${V0}3 $H0:$B0/${V0}4 $H0:$B0/${V0}5 + +TEST start_mount_nfs test2 +TEST start_removing_bricks $N0/test2 +EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" remove_brick_status_completed_field "$V0" "$H0:$B0/${V0}2 $H0:$B0/${V0}3" +TEST finish_removing_bricks $N0/test2 +reset $N0 + +cleanup |