27498e59b5739ba9efc26576460217accc406d0e
[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 make_space_slow(){
89    
90    update_df_percent
91    
92
93    calc_low_water       
94
95    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
96    echo "!!!!! Slowly reduce usage from $df_percent percent to $low_water percent"
97    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
98    echo "!!!!!!"
99    while [ $df_percent -ge $low_water ] ; do
100
101       DELETE_FILE=`ls $TEST_DIR | head -n 1`
102       rm "$TEST_DIR/$DELETE_FILE"
103
104       update_df_percent
105       maybe_sleep
106       maybe_remount
107    done
108 }
109
110 make_space_fast(){
111    
112    calc_low_water
113    update_df_percent
114
115    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
116    echo "!!!!! Quickly reduce usage from $df_percent percent to $low_water percent"
117    echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
118    echo "!!!!!!"
119    while [ $df_percent -ge $low_water ] ; do
120
121       let file_prefix=$RANDOM%100
122       rm -f $TEST_DIR/dummy $TEST_DIR/$file_prefix*
123
124       update_df_percent
125       maybe_sleep
126       maybe_remount
127    done
128 }
129
130 make_space(){
131    local xx
132    let xx=$RANDOM%100
133    update_df_percent
134
135    if [ $df_percent -gt $MIN_LOW_WATER ] ; then
136
137            if [ $xx -lt 50 ] ; then
138                 make_space_slow
139            else
140                 make_space_fast
141            fi
142   fi
143 }
144
145 periodic_action(){
146
147   maybe_sleep
148   maybe_remount
149 }
150
151 random_number(){
152  local val
153  val=$RANDOM
154  echo $val
155 }
156
157
158 drop_caches(){
159         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
160         echo "!!!!!!!!!!! D R O P   C A C H E S"
161         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
162         sync
163         echo 3 > /proc/sys/vm/drop_caches
164 }
165
166 maybe_drop_caches(){
167         local x
168         let x=$RANDOM%10000
169         if [ $x -eq 99 ] ; then
170                 drop_caches
171         fi
172 }
173
174 create_files(){
175    
176    update_df_percent
177    
178    if [ $df_percent -lt $MAX_HIGH_WATER ] ; then
179    
180            calc_high_water
181            
182            md5sum $TEST_DIR/* > $SUM_FILE
183
184            echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
185            echo "!!!!! Fill from $df_percent percent to $high_water percent"
186            echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
187            let chunks=$RANDOM%100
188            let fsize=$RANDOM*$chunks+1
189            echo "!!!!!! File size is $fsize"
190
191         
192            update_df_percent
193            
194            let skip=0
195
196            while [ $df_percent -le $high_water ] ; do
197            
198                 if [ $skip -lt 1 ] ; then
199                         dd if=/dev/urandom of=$REF_FILE bs=$fsize count=1
200                         REF_SUM=$(md5sum $REF_FILE | cut -f1 -d" " )
201                         let skip=500
202                 fi
203            
204                 FNAME=$TEST_DIR/$RANDOM-$RANDOM-$RANDOM
205                 cp $REF_FILE $FNAME
206                 FILE_SUM=$(md5sum $FNAME | cut -f1 -d" ")
207                 md5sum $FNAME >> $SUM_FILE
208
209                 if [ "$FILE_SUM" != "$REF_SUM" ] ; then
210                         echo "File comparison failed $REF_SUM - $FILE_SUM"
211                         exit 1
212                 fi
213
214                 update_df_percent
215                 maybe_sleep
216                 maybe_remount
217                 maybe_drop_caches
218            done
219
220            if ! md5sum -c $SUM_FILE > /dev/null ; then
221                 echo "File verification failed"
222                 exit 1
223            fi
224    fi
225         
226 }
227
228 fill_disk(){
229         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
230         echo "!!!!!!!!!!! F I L L   D I S K"
231         echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
232         let full=0
233         while [ $full -eq 0 ] ; do
234                 dd if=/dev/urandom of=$TEST_DIR/$RANDOM-$RANDOM-fill bs=1000 count=50 2> /dev/null || let full=1 || true
235         done
236                 
237 }
238
239 mkdir -p $TEST_DIR
240 rm -f $TEST_DIR/*
241 touch $TEST_DIR/dont-want-empty-dir
242 create_files
243
244 while true ; do
245
246         let x=$RANDOM%100
247         if [ $x -lt 50 ] ; then
248                 create_files
249         fi
250
251         let x=$RANDOM%100
252         if [ $x -lt 50 ] ; then
253                 make_space
254         fi
255
256         let x=$RANDOM%100
257         if [ $x -lt 10 ] ; then 
258                 fill_disk
259         fi
260
261         let x=$RANDOM%100
262         if [ $x -lt 1 ] ; then
263                 drop_caches
264         fi
265 done