Whamcloud - gitweb
LU-1187 tests: add create remote directory to racer
[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 # Variable to run mdsrate
15 THREADS_PER_CLIENT=${THREADS_PER_CLIENT:-5}    # thread(s) per client node
16 MACHINEFILE=${MACHINEFILE:-$TMP/$TESTSUITE.machines}
17 NODES_TO_USE=${NODES_TO_USE:-$CLIENTS}
18 NUM_CLIENTS=$(get_node_count ${NODES_TO_USE//,/ })
19
20 # bug number:
21 ALWAYS_EXCEPT="$LARGE_LUN_EXCEPT"
22
23 build_test_filter
24 LARGE_LUN_RESTORE_MOUNT=false
25 if is_mounted $MOUNT || is_mounted $MOUNT2; then
26         LARGE_LUN_RESTORE_MOUNT=true
27 fi
28 # Unmount and cleanup the Lustre filesystem
29 cleanupall
30 load_modules
31
32 FULL_MODE=${FULL_MODE:-false}
33 RUN_FSCK=${RUN_FSCK:-true}
34 # if SLOW=yes, enable the FULL_MODE
35 [[ $SLOW = yes ]] && FULL_MODE=true
36 #########################################################################
37 # Dump the super block information for the filesystem present on device.
38 run_dumpe2fs() {
39         local facet=$1
40         local dev=$2
41
42         log "dump the super block information on $facet device $dev"
43         local cmd="$DUMPE2FS -h $dev"
44         do_facet $facet "$cmd"
45 }
46
47 # Report Lustre filesystem disk space usage and inodes usage of each MDT/OST.
48 client_df() {
49         local mnt_pnt=$1
50         local cmd
51
52         cmd="df -h"
53         echo -e "\n# $cmd"
54         eval $cmd
55
56         cmd="lfs df -h $mnt_pnt"
57         echo -e "\n# $cmd"
58         eval $cmd
59
60         cmd="lfs df -i $mnt_pnt"
61         echo -e "\n# $cmd"
62         eval $cmd
63 }
64
65 # Cleanup the directories and files created by llverfs utility.
66 cleanup_dirs() {
67         local target=$1
68         local mnt=${2:-$MOUNT}
69         local cmd="rm -rf $mnt/{*.filecount,dir*}"
70         do_facet $target "$cmd"
71 }
72
73 # Run mdsrate.
74 run_mdsrate() {
75         generate_machine_file $NODES_TO_USE $MACHINEFILE ||
76                 error "can not generate machinefile"
77
78         # set the default stripe count for files in this test to one
79         local testdir=$MOUNT/mdsrate
80         mkdir -p $testdir
81         chmod 0777 $testdir
82         $LFS setstripe $testdir -i 0 -c 1
83         get_stripe $testdir
84
85         local num_dirs=$THREADS_PER_CLIENT
86         [[ $num_dirs -eq 0 ]] && num_dirs=1
87         local free_inodes=$(lfs df -i $MOUNT | grep "OST:0" | awk '{print $4}')
88         local num_files
89         num_files=$((free_inodes / num_dirs))
90
91         local command="$MDSRATE $MDSRATE_DEBUG --create --verbose \
92                 --ndirs $num_dirs --dirfmt '$testdir/dir%d' \
93                 --nfiles $num_files --filefmt 'file%%d'"
94
95         echo "# $command"
96         mpi_run -np $((NUM_CLIENTS * THREADS_PER_CLIENT)) -machinefile \
97                 $MACHINEFILE $command
98
99         if [ ${PIPESTATUS[0]} != 0 ]; then
100                 error "mdsrate create failed"
101         fi
102 }
103
104 # Run e2fsck on MDS and OST
105 do_fsck() {
106         $RUN_FSCK || return
107         local dev
108         run_e2fsck $(facet_host $SINGLEMDS) $(mdsdevname ${SINGLEMDS//mds/}) \
109                 "-y" || error "run e2fsck error"
110         for num in $(seq $OSTCOUNT); do
111                 dev=$(ostdevname $num)
112                 run_e2fsck $(facet_host ost${num}) $dev "-y" ||
113                         error "run e2fsck error"
114         done
115 }
116 ################################## Main Flow ###################################
117 trap cleanupall EXIT
118
119 test_1 () {
120         local dev
121         for num in $(seq $OSTCOUNT); do
122                 dev=$(ostdevname $num)
123                 log "run llverdev on the OST $dev"
124                 do_rpc_nodes $(facet_host ost${num}) run_llverdev $dev -vpf ||
125                         error "llverdev on $dev failed!"
126         done
127 }
128 run_test 1 "run llverdev on raw LUN"
129
130 test_2 () {
131         local dev
132         local ostmnt
133
134         for num in $(seq $OSTCOUNT); do
135                 dev=$(ostdevname $num)
136                 ostmnt=$(facet_mntpt ost${num})
137
138                 # Mount the OST as an ldiskfs filesystem.
139                 log "mount the OST $dev as a ldiskfs filesystem"
140                 add ost${num} $(mkfs_opts ost${num}) $FSTYPE_OPT --reformat \
141                         $(ostdevname $num) > /dev/null ||
142                         error "format ost${num} error"
143                 run_dumpe2fs ost${num} $dev
144                 do_facet ost${num} mount -t $(facet_fstype ost${num}) $dev \
145                         $ostmnt "$OST_MOUNT_OPTS"
146
147                 # Run llverfs on the mounted ldiskfs filesystem in partial mode
148                 # to ensure that the kernel can perform filesystem operations
149                 # on the complete device without any errors.
150                 log "run llverfs in partial mode on the OST ldiskfs $ostmnt"
151                 do_rpc_nodes $(facet_host ost${num}) run_llverfs $ostmnt -vpl \
152                         "no" || error "run_llverfs error on ldiskfs"
153
154                 # Unmount the OST.
155                 log "unmount the OST $dev"
156                 stop ost${num}
157
158                 # After llverfs is run on the ldiskfs filesystem in partial
159                 # mode, a full e2fsck should be run to catch any errors early.
160                 $RUN_FSCK && run_e2fsck $(facet_host ost${num}) $dev "-y" ||
161                         error "run e2fsck error"
162
163                 if $FULL_MODE; then
164                         log "full mode, mount the OST $dev as a ldiskfs again"
165                         do_facet ost${num} mount -t $(facet_fstype ost${num}) \
166                                 $dev $ostmnt "$OST_MOUNT_OPTS"
167                         cleanup_dirs ost${num} $ostmnt
168                         do_facet ost${num} "sync"
169
170                         run_dumpe2fs ost${num} $dev
171
172                         # Run llverfs on the mounted ldiskfs filesystem in full
173                         # mode to ensure that the kernel can perform filesystem
174                         # operations on the complete device without any errors.
175                         log "run llverfs in full mode on OST ldiskfs $ostmnt"
176                         do_rpc_nodes $(facet_host ost${num}) run_llverfs \
177                                 $ostmnt -vl "no" ||
178                                 error "run_llverfs error on ldiskfs"
179
180                         # Unmount the OST.
181                         log "unmount the OST $dev"
182                         stop ost${num}
183
184                         # After llverfs is run on the ldiskfs filesystem in
185                         # full mode, a full e2fsck should be run to catch any
186                         #  errors early.
187                         $RUN_FSCK && run_e2fsck $(facet_host ost${num}) $dev \
188                                 "-y" || error "run e2fsck error"
189                 fi
190         done
191 }
192 run_test 2 "run llverfs on OST ldiskfs filesystem"
193
194 test_3 () {
195         [ -z "$CLIENTS" ] && skip_env "CLIENTS not defined, skipping" && return
196         [ -z "$MPIRUN" ] && skip_env "MIPRUN not defined, skipping" && return
197         [ -z "$MDSRATE" ] && skip_env "MDSRATE not defined, skipping" && return
198         [ ! -x $MDSRATE ] && skip_env "$MDSRATE not built, skipping" && return
199         # Setup the Lustre filesystem.
200         log "setup the lustre filesystem"
201         REFORMAT="yes" check_and_setup_lustre
202
203         log "run mdsrate to use up the free inodes."
204         # Run the mdsrate test suite.
205         run_mdsrate
206         client_df $MOUNT
207
208         sync; sleep 5; sync
209         stopall
210         do_fsck
211 }
212 run_test 3 "use up free inodes on the OST with mdsrate"
213
214 test_4 () {
215         # Setup the Lustre filesystem.
216         log "setup the lustre filesystem"
217         REFORMAT="yes" check_and_setup_lustre
218         local dev
219
220         for num in $(seq $OSTCOUNT); do
221                 dev=$(ostdevname $num)
222                 run_dumpe2fs ost${num} $dev
223         done
224
225         # Run llverfs on the mounted Lustre filesystem both in partial and
226         # full mode to to fill the filesystem and verify the file contents.
227         log "run llverfs in partial mode on the Lustre filesystem $MOUNT"
228         run_llverfs $MOUNT -vp "no" || error "run_llverfs error on lustre"
229         client_df $MOUNT
230
231         sync; sleep 5; sync
232         stopall
233         do_fsck
234
235         if $FULL_MODE; then
236                 # Setup the Lustre filesystem again.
237                 log "setup the lustre filesystem again"
238                 setupall
239
240                 cleanup_dirs client $MOUNT
241                 sync
242                 client_df $MOUNT
243
244                 for num in $(seq $OSTCOUNT); do
245                         dev=$(ostdevname $num)
246                         run_dumpe2fs ost${num} $dev
247                 done
248
249                 log "run llverfs in full mode on the Lustre filesystem $MOUNT"
250                 run_llverfs $MOUNT -vl "no" ||
251                         error "run_llverfs error on lustre"
252                 client_df $MOUNT
253
254                 sync; sleep 5; sync
255                 stopall
256                 do_fsck
257         fi
258 }
259 run_test 4 "run llverfs on lustre filesystem"
260
261 complete $SECONDS
262 $LARGE_LUN_RESTORE_MOUNT && setupall
263 check_and_cleanup_lustre
264 exit_status