yaffs Tweaks to stress test
[yaffs2.git] / linux-tests / stress_test.sh
1 #!/bin/sh
2 # Do some random operations on a yaffs2 file system
3
4 MTD="/dev/mtdblock0"
5 MOUNT_PT="/mnt"
6 TEST_DIR="$MOUNT_PT/stress_dir"
7 REF_FILE="$MOUNT_PT/ref.file"
8 SUM_FILE="$MOUNT_PT/sum.file"
9 MIN_LOW_WATER=5
10 MAX_LOW_WATER=85
11 MIN_HIGH_WATER=15
12 MAX_HIGH_WATER=95
13
14 let low_water=25
15 let high_water=90
16 let df_percent=50
17
18
19 update_df_percent(){
20         df_percent=$(df | grep $MTD | sed "s_[ %] *_ _g" | cut -d" " -f 5)
21 }
22
23 update_df_percent
24
25 calc_low_water() {
26    let low_water=0
27    while [ $low_water -lt $MIN_LOW_WATER ] ;
28    do
29         let low_water=$RANDOM%100
30         while [[ $low_water -ge $df_percent  || $low_water -gt $MAX_LOW_WATER ]] ;
31         do
32                 let low_water=$RANDOM%100
33         done
34    done
35 }
36
37 calc_high_water() {
38    let high_water=100
39    while [ $high_water -gt $MAX_HIGH_WATER ] ;
40    do
41         let high_water=$RANDOM%100
42         while [[ $high_water -le $df_percent || $high_water -lt $MIN_HIGH_WATER ]] ;
43         do
44                 let high_water=$RANDOM%100
45         done
46    done
47 }
48
49
50
51 maybe_sleep(){
52   local val
53   let val=$RANDOM%10000
54   if [ $val -le 1 ] ; then
55         let val=$RANDOM%100
56         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
57         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
58         echo "!!!!!!!!!                                                              !!!!!!!!!!!!!!!!!!!"
59         echo "!!!!!!!!! S L E E P  $val"
60         echo "!!!!!!!!!                                                              !!!!!!!!!!!!!!!!!!!"
61         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
62         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
63         sleep $val
64         echo " Sleep completed "
65   fi
66 }
67
68 maybe_remount(){
69   local val
70   let val=$RANDOM%10000
71   
72   if [ $val -le 1 ] ; then
73         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
74         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
75         echo "!!!!!!!!!                                                              !!!!!!!!!!!!!!!!!!!"
76         echo "!!!!!!!!! R E M O U N T                                                !!!!!!!!!!!!!!!!!!!"
77         echo "!!!!!!!!!                                                              !!!!!!!!!!!!!!!!!!!"
78         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
79         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
80   
81         umount $MOUNT_PT
82         mount -t yaffs2 $MTD $MOUNT_PT
83   fi
84
85 }
86
87
88
89 make_space_slow(){
90    
91    update_df_percent
92    
93
94    calc_low_water       
95
96    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
97    echo "!!!!! Slowly reduce usage from $df_percent percent to $low_water percent"
98    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
99    echo "!!!!!!"
100    while [ $df_percent -ge $low_water ] ; do
101
102       DELETE_FILE=`ls $TEST_DIR | head -n 1`
103       rm -rf "$TEST_DIR/$DELETE_FILE"
104
105       update_df_percent
106       maybe_sleep
107       maybe_remount
108    done
109 }
110
111 make_space_fast(){
112    
113    calc_low_water
114    update_df_percent
115
116    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
117    echo "!!!!! Quickly reduce usage from $df_percent percent to $low_water percent"
118    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
119    echo "!!!!!!"
120    while [ $df_percent -ge $low_water ] ; do
121
122       let file_prefix=$RANDOM%100
123       rm -rf $TEST_DIR/dummy $TEST_DIR/$file_prefix*
124
125       update_df_percent
126       maybe_sleep
127       maybe_remount
128    done
129 }
130
131 make_space(){
132    local xx
133    let xx=$RANDOM%100
134    update_df_percent
135
136    if [ $df_percent -gt $MIN_LOW_WATER ] ; then
137
138            if [ $xx -lt 50 ] ; then
139                 make_space_slow
140            else
141                 make_space_fast
142            fi
143   fi
144 }
145
146 periodic_action(){
147
148   maybe_sleep
149   maybe_remount
150 }
151
152 random_number(){
153  local val
154  val=$RANDOM
155  echo $val
156 }
157
158
159 drop_caches(){
160         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
161         echo "!!!!!!!!!!! D R O P   C A C H E S"
162         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
163         sync
164         echo 3 > /proc/sys/vm/drop_caches
165 }
166
167 maybe_drop_caches(){
168         local x
169         let x=$RANDOM%10000
170         if [ $x -eq 99 ] ; then
171                 drop_caches
172         fi
173 }
174
175 create_files(){
176    
177    update_df_percent
178    
179    if [ $df_percent -lt $MAX_HIGH_WATER ] ; then
180    
181            calc_high_water
182            
183            rm -f $SUM_FILE
184            
185            for i in $(find $TEST_DIR) ; do
186                 [ -f $i ] && md5sum $i >> $SUM_FILE
187            done
188
189            echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
190            echo "!!!!! Fill from $df_percent percent to $high_water percent"
191            echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
192            let chunks=$RANDOM%100
193
194         
195            update_df_percent
196            
197            let skip_file_create=0
198            let skip_dir_create=0
199
200            while [ $df_percent -le $high_water ] ; do
201            
202                 if [ $skip_file_create -lt 1 ] ; then
203                         let fsize=$RANDOM*$chunks+1
204                         echo "!!!!!! File size is $fsize"
205                         dd if=/dev/urandom of=$REF_FILE bs=$fsize count=1
206                         REF_SUM=$(md5sum $REF_FILE | cut -f1 -d" " )
207                         let skip_file_create=$RANDOM%50
208                 else
209                         let skip_file_create=$skip_file_create-1
210                 fi
211
212                 if [ $skip_dir_create -lt 1 ] ; then
213                         dir_name=$TEST_DIR/$RANDOM-dir
214                         mkdir -p $dir_name
215                         echo "Creating in directory $dir_name"
216                         let skip_dir_create=$RANDOM%100
217                 else
218                         let skip_dir_create=$skip_dir_create-1
219                 fi
220            
221                 FNAME=$dir_name/$RANDOM-$RANDOM-$RANDOM
222                 cp $REF_FILE $FNAME
223                 FILE_SUM=$(md5sum $FNAME | cut -f1 -d" ")
224                 md5sum $FNAME >> $SUM_FILE
225
226                 if [ "$FILE_SUM" != "$REF_SUM" ] ; then
227                         echo "File comparison failed $REF_SUM - $FILE_SUM"
228                         exit 1
229                 fi
230
231                 update_df_percent
232                 maybe_sleep
233                 maybe_remount
234                 maybe_drop_caches
235            done
236
237            if ! md5sum -c $SUM_FILE > /dev/null ; then
238                 echo "File verification failed"
239                 exit 1
240            fi
241    fi
242         
243 }
244
245 fill_disk(){
246         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
247         echo "!!!!!!!!!!! F I L L   D I S K"
248         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
249         let full=0
250         while [ $full -eq 0 ] ; do
251                 dd if=/dev/urandom of=$TEST_DIR/$RANDOM-$RANDOM-fill bs=1000 count=50 2> /dev/null || let full=1 || true
252         done
253                 
254 }
255
256 rm -rf $TEST_DIR/*
257 mkdir -p $TEST_DIR
258 touch $TEST_DIR/dont-want-empty-dir
259 create_files
260
261 while true ; do
262
263         let x=$RANDOM%100
264         if [ $x -lt 50 ] ; then
265                 create_files
266         fi
267
268         let x=$RANDOM%100
269         if [ $x -lt 50 ] ; then
270                 make_space
271         fi
272
273         let x=$RANDOM%100
274         if [ $x -lt 5 ] ; then 
275                 fill_disk
276         fi
277
278         let x=$RANDOM%100
279         if [ $x -lt 1 ] ; then
280                 drop_caches
281         fi
282 done