3 # A Metadata Update Test tests that
4 # metadata updates are properly completed when
5 # multiple clients create/delete files and modify the attributes of files.
9 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
10 . $LUSTRE/tests/test-framework.sh
12 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
16 TESTDIR=${TESTDIR:-$DIR/d0.$(basename $0 .sh)}
18 NODES_TO_USE=${NODES_TO_USE:-$CLIENTS}
20 [ -z $CLIENTS ] && NODES_TO_USE=$(hostname)
26 NEW_ATIME="2001-01-01 GMT"
27 NEW_MTIME="2005-05-05 GMT"
34 WRITE_DISJOINT=${WRITE_DISJOINT:-$(which write_disjoint 2> /dev/null)} || true
35 WRITE_DISJOINT_FILE=$TESTDIR/f0.write_disjoint_file
40 log "===== $0 ====== "
42 check_and_setup_lustre
46 do_nodes $NODES_TO_USE "set $TRACE;
47 DIR=$TESTDIR/\\\$(hostname);
48 TESTFILE=\\\$DIR/$FILE;
50 rmdir \\\$DIR 2>/dev/null;
51 mkdir -p \\\$DIR" || return ${PIPESTATUS[0]}
57 echo "Creating file(s) by mknod (2) ... "
59 do_nodes $NODES_TO_USE "set $TRACE
60 TESTFILE=$TESTDIR/\\\$(hostname)/$FILE
61 mcreate \\\$TESTFILE" || return ${PIPESTATUS[0]}
67 echo "Writing data to file(s) ... store md5sum ... "
69 do_nodes $NODES_TO_USE "set $TRACE;
70 TESTFILE=$TESTDIR/\\\$(hostname)/$FILE;
71 sum=${SUM}_\\\$(hostname);
72 dd if=/dev/zero of=\\\$TESTFILE bs=$FILE_SIZE count=1 2>/dev/null;
73 md5sum \\\$TESTFILE > \\\$sum "
74 if [ ${PIPESTATUS[0]} -ne 0 ] ; then
75 echo "ERROR: on file creation"
84 echo "Checking file(s) data ... "
86 for HOST in ${NODES_TO_USE//,/ } ; do
87 local sum=${SUM}_$HOST
88 do_nodes $NODES_TO_USE "md5sum --check $sum"
89 if [ ${PIPESTATUS[0]} -ne 0 ] ; then
90 echo "ERROR: wrong data."
91 [ -f $sum ] && { cat $sum ; rm -f $sum; }
94 [ -f $sum ] && { cat $sum; rm -f $sum; }
101 echo "Truncating file(s) ... "
103 do_nodes $NODES_TO_USE "set $TRACE;
104 TESTFILE=$TESTDIR/\\\$(hostname)/$FILE;
105 truncate \\\$TESTFILE 0" || return ${PIPESTATUS[0]}
112 # check st_uid, st_gid, st_size, st_mode
114 local attr="$test_UID $test_GID $FILE_SIZE $CURRENT_MODE"
116 echo "Checking file(s) attributes ... "
118 do_nodes $NODES_TO_USE "set $TRACE;
119 for HOST in ${NODES_TO_USE//,/ } ; do
120 TESTFILE=$TESTDIR/\\\$HOST/$FILE;
121 tmp=\\\$(stat -c \\\"%u %g %s 0%a\\\" \\\$TESTFILE);
122 echo \\\"\\\$TESTFILE [ uid gid size mode ] expected : $attr ; got : \\\$tmp \\\";
123 if [ x\\\"\\\$tmp\\\" != x\\\"$attr\\\" ] ; then
124 echo \\\"Wrong file attributes\\\";
128 if [ ${PIPESTATUS[0]} -ne 0 ] ; then
136 echo "Performing chmod 0$NEW_MODE ..."
138 do_nodes $NODES_TO_USE "set $TRACE;
139 TESTFILE=$TESTDIR/\\\$(hostname)/$FILE;
140 chmod $NEW_MODE \\\$TESTFILE" || return ${PIPESTATUS[0]}
142 CURRENT_MODE=$NEW_MODE
147 do_change_timestamps () {
148 echo "Changing atime, mtime ..."
150 do_nodes $NODES_TO_USE " set $TRACE;
151 TESTFILE=$TESTDIR/\\\$(hostname)/$FILE;
152 touch -c --date=\\\"$NEW_ATIME\\\" -a \\\$TESTFILE;
153 touch -c --date=\\\"$NEW_MTIME\\\" -m \\\$TESTFILE " || return ${PIPESTATUS[0]}
158 # check st_atime, st_mtime
159 do_check_timestamps () {
160 local atime=$(date --date="$NEW_ATIME" +%s)
161 local mtime=$(date --date="$NEW_MTIME" +%s)
163 local times="$atime $mtime"
165 echo "Checking atime, mtime ... "
167 do_nodes $NODES_TO_USE "set $TRACE;
168 for HOST in ${NODES_TO_USE//,/ } ; do
169 TESTFILE=$TESTDIR/\\\$HOST/$FILE;
170 tmp=\\\$(stat -c \\\"%X %Y\\\" \\\$TESTFILE);
171 if [ x\\\"\\\$tmp\\\" != x\\\"$times\\\" ] ; then
172 echo \\\"\\\$TESTFILE [ atime mtime ] expected : $times ; got : \\\$tmp \\\";
177 if [ ${PIPESTATUS[0]} -ne 0 ] ; then
178 echo "WARNING : Wrong atime and(or) mtime values. Hope this is expected."
186 echo "Filling up directories ... files : f1 ... f$NUM_FILES) ... "
188 do_nodes $NODES_TO_USE "set $TRACE;
189 TESTFILE=$TESTDIR/\\\$(hostname)/$FILE;
191 DIR=$TESTDIR/\\\$(hostname);
192 for i in \\\$(seq $NUM_FILES) ; do
193 touch \\\$DIR/f\\\$i;
194 done " || return ${PIPESTATUS[0]}
199 check_dir_contents () {
200 local num_files=${1:-1}
202 echo "Checking dir contents ... (should exist files : f$num_files ... f$NUM_FILES) ... "
203 do_nodes $NODES_TO_USE "set $TRACE;
204 for HOST in ${NODES_TO_USE//,/ } ; do
205 DIR=$TESTDIR/\\\$HOST;
206 for i in \\\$(seq $NUM_FILES -1 $num_files) ; do
207 if ! [ -f \\\$DIR/f\\\$i ] ; then
208 echo \\\"ERROR: file \\\$DIR/f\\\$i should exist\\\";
212 for i in \\\$(seq $(($num_files - 1 ))) ; do
213 if [ -f \\\$DIR/f\\\$i ] ; then
214 echo \\\"ERROR: deleted file \\\$DIR/f\\\$i exists\\\";
220 if [ ${PIPESTATUS[0]} -ne 0 ] ; then
227 do_partial_delete () {
230 echo "Deleting files ... f1 ... f$num_files ... "
231 do_nodes $NODES_TO_USE "set $TRACE;
232 DIR=$TESTDIR/\\\$(hostname);
233 for i in \\\$(seq $num_files) ; do
234 if ! rm -f \\\$DIR/f\\\$i ; then
237 done " || return ${PIPESTATUS[0]}
244 chmod 0777 $MOUNT || exit 1
245 mkdir -p $TESTDIR || exit 1
246 chmod 0777 $TESTDIR || exit 1
248 cleanup_prepare || exit 1
250 # create file(s) (mknod (2)), write data, check data, check file attributes
251 echo "Part 1. create file(s) (mknod (2)), write data, check data, check file attributes."
252 do_mknod || exit ${PIPESTATUS[0]}
253 do_write || exit ${PIPESTATUS[0]}
254 do_check_data || exit ${PIPESTATUS[0]}
257 # file(s) attributes modification
258 echo "Part 2. file(s) attributes modification."
259 do_chmod || exit ${PIPESTATUS[0]}
262 do_change_timestamps || exit ${PIPESTATUS[0]}
263 do_check_timestamps || STATUS=1
265 # truncate file(s) to 0 size, check new file size
266 echo "Part 3. truncate file(s) to 0 size, check new file size."
267 do_truncate || exit ${PIPESTATUS[0]}
270 # directory content solidity
271 echo "Part 4. directory content solidity: fill up directory, check dir content, remove some files, check dir content."
272 do_fill_dir || exit ${PIPESTATUS[0]}
273 check_dir_contents || STATUS=1
275 do_partial_delete $(($NUM_FILES / 2)) || exit ${PIPESTATUS[0]}
276 check_dir_contents $(($NUM_FILES / 2 + 1)) || STATUS=1
278 # "write_disjoint" test
279 echo "Part 5. write_disjoint test: see lustre/tests/mpi/write_disjoint.c for details"
280 if [ -f "$WRITE_DISJOINT" ]; then
282 MACHINEFILE=${MACHINEFILE:-$TMP/$(basename $0 .sh).machines}
283 generate_machine_file $NODES_TO_USE $MACHINEFILE
284 mpi_run -np $(get_node_count ${NODES_TO_USE//,/ }) -machinefile $MACHINEFILE \
285 $WRITE_DISJOINT -f $WRITE_DISJOINT_FILE -n $NUMLOOPS || STATUS=1
287 skip "$0 : write_disjoint not found "
290 equals_msg `basename $0`: test complete, cleaning up
293 check_and_cleanup_lustre