Whamcloud - gitweb
2a60f902c3d68d89031b80f95ac8e6fc629cbda8
[fs/lustre-release.git] / lustre / tests / large-lun.sh
1 #!/bin/bash
2 #
3 # This script is used to test large size LUN support in Lustre.
4 #
5 ################################################################################
6 set -e
7
8 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
9 . $LUSTRE/tests/test-framework.sh
10 init_test_env $@
11 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
12 init_logging
13
14 if ! [ "$REFORMAT" ]; then
15         skip_env "$0 reformats all devices,\
16                 please set REFORMAT to run this test"
17         exit 0
18 fi
19
20 # Variable to run mdsrate
21 THREADS_PER_CLIENT=${THREADS_PER_CLIENT:-5}    # thread(s) per client node
22 MACHINEFILE=${MACHINEFILE:-$TMP/$TESTSUITE.machines}
23 NODES_TO_USE=${NODES_TO_USE:-$CLIENTS}
24 NUM_CLIENTS=$(get_node_count ${NODES_TO_USE//,/ })
25
26 # bug number:
27 ALWAYS_EXCEPT="$LARGE_LUN_EXCEPT"
28
29 build_test_filter
30 LARGE_LUN_RESTORE_MOUNT=false
31 if is_mounted $MOUNT || is_mounted $MOUNT2; then
32         LARGE_LUN_RESTORE_MOUNT=true
33 fi
34 # Unmount and cleanup the Lustre filesystem
35 cleanupall
36 load_modules
37
38 FULL_MODE=${FULL_MODE:-false}
39 RUN_FSCK=${RUN_FSCK:-true}
40 # if SLOW=yes, enable the FULL_MODE
41 [[ $SLOW = yes ]] && FULL_MODE=true
42 #########################################################################
43 # Dump the super block information for the filesystem present on device.
44 run_dumpfs() {
45         local facet=$1
46         local dev=$2
47         local cmd
48
49         log "dump the super block information on $facet device $dev"
50         local fstype=$(facet_fstype $facet)
51
52         case $fstype in
53                 ldiskfs )
54                         cmd="$DUMPE2FS -h $dev" ;;
55                 zfs )
56                         cmd="$ZDB -l $(facet_vdevice $facet)" ;;
57                 * )
58                         error "unknown fstype!" ;;
59         esac
60
61         do_facet $facet "$cmd"
62 }
63
64 # Report Lustre filesystem disk space usage and inodes usage of each MDT/OST.
65 client_df() {
66         local mnt_pnt=$1
67         local cmd
68
69         cmd="df -h"
70         echo -e "\n# $cmd"
71         eval $cmd
72
73         cmd="lfs df -h $mnt_pnt"
74         echo -e "\n# $cmd"
75         eval $cmd
76
77         cmd="lfs df -i $mnt_pnt"
78         echo -e "\n# $cmd"
79         eval $cmd
80 }
81
82 # Cleanup the directories and files created by llverfs utility.
83 cleanup_dirs() {
84         local target=$1
85         local mnt=${2:-$MOUNT}
86         local cmd="rm -rf $mnt/{*.filecount,dir*}"
87         do_facet $target "$cmd"
88 }
89
90 # Run mdsrate.
91 run_mdsrate() {
92         generate_machine_file $NODES_TO_USE $MACHINEFILE ||
93                 error "can not generate machinefile"
94
95         # set the default stripe count for files in this test to one
96         local testdir=$MOUNT/mdsrate
97         mkdir -p $testdir
98         chmod 0777 $testdir
99         $LFS setstripe $testdir -i 0 -c 1
100         get_stripe $testdir
101
102         local num_dirs=$THREADS_PER_CLIENT
103         [[ $num_dirs -eq 0 ]] && num_dirs=1
104         local free_inodes=$(lfs df -i $MOUNT | grep "OST:0" | awk '{print $4}')
105         local num_files
106         num_files=$((free_inodes / num_dirs))
107
108         local command="$MDSRATE $MDSRATE_DEBUG --create --verbose \
109                 --ndirs $num_dirs --dirfmt '$testdir/dir%d' \
110                 --nfiles $num_files --filefmt 'file%%d'"
111
112         echo "# $command"
113         mpi_run -machinefile $MACHINEFILE \
114                 -np $((NUM_CLIENTS * THREADS_PER_CLIENT)) $command
115
116         if [ ${PIPESTATUS[0]} != 0 ]; then
117                 error "mdsrate create failed"
118         fi
119 }
120
121 check_fsfacet() {
122         local facet=$1
123         local fstype=$(facet_fstype $facet)
124
125         case $fstype in
126             ldiskfs)
127                 run_e2fsck $(facet_active_host $facet) $(facet_device $facet) \
128                     "-y" || error "run e2fsck error"
129                 ;;
130             zfs)
131                 # Could call fsck.zfs, but currently it does nothing,
132                 # Could also call zpool scrub, but that could take a LONG time
133                 # do_facet $facet "fsck.zfs $(facet_device $facet)"
134                 ;;
135         esac
136 }
137
138 # Run e2fsck on MDS and OST
139 do_fsck() {
140         $RUN_FSCK || return
141
142         check_fsfacet $SINGLEMDS
143
144         for num in $(seq $OSTCOUNT); do
145                 check_fsfacet ost${num}
146         done
147 }
148 ################################## Main Flow ###################################
149 trap cleanupall EXIT
150
151 test_1 () {
152         [ $(facet_fstype $SINGLEMDS) != ldiskfs ] &&
153                 skip "Only applicable to ldiskfs-based nodes" && return
154         local dev
155         for num in $(seq $OSTCOUNT); do
156                 dev=$(ostdevname $num)
157                 log "run llverdev on the OST $dev"
158                 do_rpc_nodes $(facet_host ost${num}) run_llverdev $dev -vpf ||
159                         error "llverdev on $dev failed!"
160         done
161         # restore format overwritten by llverdev
162         formatall
163 }
164 run_test 1 "run llverdev on raw LUN"
165
166 test_2 () {
167         local dev
168         local ostmnt
169         local fstype
170
171         for num in $(seq $OSTCOUNT); do
172                 dev=$(ostdevname $num)
173                 ostmnt=$(facet_mntpt ost${num})
174                 fstype=$(facet_fstype ost${num})
175
176                 # Mount the OST as an ldiskfs filesystem.
177                 log "mount the OST $dev as a $fstype filesystem"
178                 add ost${num} $(mkfs_opts ost${num} $dev) $FSTYPE_OPT \
179                         --reformat $(ostdevname $num) \
180                         $(ostvdevname $num) > /dev/null ||
181                         error "format ost${num} error"
182                 if [ $fstype == zfs ]; then
183                         import_zpool ost${num}
184                         do_facet ost${num} "$ZFS set canmount=on $dev; " \
185                             "$ZFS set mountpoint=legacy $dev; $ZFS list $dev"
186                 fi
187                 run_dumpfs ost${num} $dev
188                 do_facet ost${num} mount -t $fstype $dev \
189                         $ostmnt "$OST_MOUNT_OPTS"
190
191                 # Run llverfs on the mounted ldiskfs filesystem in partial mode
192                 # to ensure that the kernel can perform filesystem operations
193                 # on the complete device without any errors.
194                 log "run llverfs in partial mode on the OST $fstype $ostmnt"
195                 do_rpc_nodes $(facet_host ost${num}) run_llverfs $ostmnt -vpl \
196                         "no" || error "run_llverfs error on $fstype"
197
198                 # Unmount the OST.
199                 log "unmount the OST $dev"
200                 stop ost${num}
201
202                 # After llverfs is run on the ldiskfs filesystem in partial
203                 # mode, a full e2fsck should be run to catch any errors early.
204                 $RUN_FSCK && check_fsfacet ost${num}
205
206                 if $FULL_MODE; then
207                         log "full mode, mount the OST $dev as a $fstype again"
208                         if [ $fstype == zfs ]; then
209                                 import_zpool ost${num}
210                         fi
211                         do_facet ost${num} mount -t $(facet_fstype ost${num}) \
212                                 $dev $ostmnt "$OST_MOUNT_OPTS"
213                         cleanup_dirs ost${num} $ostmnt
214                         do_facet ost${num} "sync"
215
216                         run_dumpfs ost${num} $dev
217
218                         # Run llverfs on the mounted ldiskfs filesystem in full
219                         # mode to ensure that the kernel can perform filesystem
220                         # operations on the complete device without any errors.
221                         log "run llverfs in full mode on OST $fstype $ostmnt"
222                         do_rpc_nodes $(facet_host ost${num}) run_llverfs \
223                                 $ostmnt -vl "no" ||
224                                 error "run_llverfs error on $fstype"
225
226                         # Unmount the OST.
227                         log "unmount the OST $dev"
228                         stop ost${num}
229
230                         # After llverfs is run on the ldiskfs filesystem in
231                         # full mode, a full e2fsck should be run to catch any
232                         #  errors early.
233                         $RUN_FSCK && check_fsfacet ost${num}
234                 fi
235         done
236         # there is no reason to continue using ost devices
237         # filled by llverfs as ldiskfs
238         formatall
239 }
240 run_test 2 "run llverfs on OST ldiskfs/zfs filesystem"
241
242 test_3 () {
243         [ -z "$CLIENTS" ] && skip_env "CLIENTS not defined, skipping" && return
244         [ -z "$MPIRUN" ] && skip_env "MIPRUN not defined, skipping" && return
245         [ -z "$MDSRATE" ] && skip_env "MDSRATE not defined, skipping" && return
246         [ ! -x $MDSRATE ] && skip_env "$MDSRATE not built, skipping" && return
247         # Setup the Lustre filesystem.
248         log "setup the lustre filesystem"
249         REFORMAT="yes" check_and_setup_lustre
250
251         log "run mdsrate to use up the free inodes."
252         # Run the mdsrate test suite.
253         run_mdsrate
254         client_df $MOUNT
255
256         sync; sleep 5; sync
257         stopall
258         do_fsck
259 }
260 run_test 3 "use up free inodes on the OST with mdsrate"
261
262 test_4 () {
263         # Setup the Lustre filesystem.
264         log "setup the lustre filesystem"
265         REFORMAT="yes" check_and_setup_lustre
266         local dev
267
268         for num in $(seq $OSTCOUNT); do
269                 dev=$(ostdevname $num)
270                 run_dumpfs ost${num} $dev
271         done
272
273         # Run llverfs on the mounted Lustre filesystem both in partial and
274         # full mode to to fill the filesystem and verify the file contents.
275         log "run llverfs in partial mode on the Lustre filesystem $MOUNT"
276         run_llverfs $MOUNT -vp "no" || error "run_llverfs error on lustre"
277         client_df $MOUNT
278
279         sync; sleep 5; sync
280         stopall
281         do_fsck
282
283         if $FULL_MODE; then
284                 # Setup the Lustre filesystem again.
285                 log "setup the lustre filesystem again"
286                 setupall
287
288                 cleanup_dirs client $MOUNT
289                 sync
290                 client_df $MOUNT
291
292                 for num in $(seq $OSTCOUNT); do
293                         dev=$(ostdevname $num)
294                         run_dumpfs ost${num} $dev
295                 done
296
297                 log "run llverfs in full mode on the Lustre filesystem $MOUNT"
298                 run_llverfs $MOUNT -vl "no" ||
299                         error "run_llverfs error on lustre"
300                 client_df $MOUNT
301
302                 sync; sleep 5; sync
303                 stopall
304                 do_fsck
305         fi
306 }
307 run_test 4 "run llverfs on lustre filesystem"
308
309 complete $SECONDS
310 $LARGE_LUN_RESTORE_MOUNT && setupall
311 check_and_cleanup_lustre
312 exit_status