Since the ost-in-use array is initialized with 0 and isn't set with
OST index number correctly, OST0 is always skipped when allocating
objects on OSTs with specific stripe offset (offset > 0).
For example, when running command "lfs setstripe -c -1 -i 2 testfile"
on 4 OSTs, we will get a wrong layout, like
obdidx objid objid group
2 3 0x3 0
3 3 0x3 0
1 4 0x4 0
2 4 0x4 0
To fix the problem, we initialize the array with -1 instead, and store
the correct OST index number in it.
Signed-off-by: Liu Ying <emoly.liu@intel.com>
Change-Id: I5eeced6b66ae40771f8896204c5a6ed8e6663e57
Reviewed-on: http://review.whamcloud.com/5554
Tested-by: Hudson
Reviewed-by: Bobi Jam <bobijam@gmail.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
CERROR("can't allocate memory for ost-in-use array\n");
return -ENOMEM;
}
CERROR("can't allocate memory for ost-in-use array\n");
return -ENOMEM;
}
- memset(info->lti_ea_store, 0, sizeof(int) * stripes);
+ memset(info->lti_ea_store, -1, sizeof(int) * stripes);
/*
* We've successfuly declared (reserved) an object
*/
/*
* We've successfuly declared (reserved) an object
*/
+ lod_qos_ost_in_use(env, stripe_num, ost_idx);
stripe[stripe_num] = o;
stripe_num++;
stripe[stripe_num] = o;
stripe_num++;
}
run_test 27B "call setstripe on open unlinked file/rename victim"
}
run_test 27B "call setstripe on open unlinked file/rename victim"
+test_27C() { #LU-2871
+ [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+
+ declare -a ost_idx
+ local index
+ local i
+ local j
+
+ test_mkdir -p $DIR/$tdir
+ cd $DIR/$tdir
+ for i in $(seq 0 $((OSTCOUNT - 1))); do
+ # set stripe across all OSTs starting from OST$i
+ $SETSTRIPE -i $i -c -1 $tfile$i
+ # get striping information
+ ost_idx=($($GETSTRIPE $tfile$i |
+ tail -n $((OSTCOUNT + 1)) | awk '{print $1}'))
+ echo ${ost_idx[@]}
+ # check the layout
+ for j in $(seq 0 $((OSTCOUNT - 1))); do
+ index=$(((i + j) % OSTCOUNT))
+ [ ${ost_idx[$j]} -eq $index ] || error
+ done
+ done
+}
+run_test 27C "check full striping across all OSTs"
+
# createtest also checks that device nodes are created and
# then visible correctly (#2091)
test_28() { # bug 2091
# createtest also checks that device nodes are created and
# then visible correctly (#2091)
test_28() { # bug 2091