1f08c3bdfSopenharmony_ci#!/usr/bin/perl
2f08c3bdfSopenharmony_ci#
3f08c3bdfSopenharmony_ci# Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
4f08c3bdfSopenharmony_ci#
5f08c3bdfSopenharmony_ci
6f08c3bdfSopenharmony_ci#
7f08c3bdfSopenharmony_ci# Mongo.pl is reiserfs benchmark.
8f08c3bdfSopenharmony_ci#
9f08c3bdfSopenharmony_ci# To run please use run_mongo script or :
10f08c3bdfSopenharmony_ci#
11f08c3bdfSopenharmony_ci# # ./mongo.pl reiserfs /dev/xxxx /testfs log1 5
12f08c3bdfSopenharmony_ci# or
13f08c3bdfSopenharmony_ci# # ./mongo.pl ext2 /dev/xxxx /testfs log2 5
14f08c3bdfSopenharmony_ci#
15f08c3bdfSopenharmony_ci# 5 - number of processes, you can set any number here
16f08c3bdfSopenharmony_ci#
17f08c3bdfSopenharmony_ci# Test will format partition /dev/xxxx by 'mkreiserfs' or 'mke2fs'
18f08c3bdfSopenharmony_ci# mount it and run given number of processes during each phase :
19f08c3bdfSopenharmony_ci# Create, Copy, Symlinks, Read, Stats, Rename and Delete.
20f08c3bdfSopenharmony_ci#
21f08c3bdfSopenharmony_ci# Also, the program calc fragmentations after Create and Copy phases:
22f08c3bdfSopenharmony_ci# Fragm = number_of_fragments / number_of_files
23f08c3bdfSopenharmony_ci# (Current version use the files more than 16KB to calc Fragm.)
24f08c3bdfSopenharmony_ci#
25f08c3bdfSopenharmony_ci# You can find the same results in files : log, log.tbl, log_table
26f08c3bdfSopenharmony_ci#
27f08c3bdfSopenharmony_ci# log       - raw results
28f08c3bdfSopenharmony_ci# log.tbl   - results for compare program
29f08c3bdfSopenharmony_ci# log_table - results in table form
30f08c3bdfSopenharmony_ci#
31f08c3bdfSopenharmony_ci
32f08c3bdfSopenharmony_ci$EXTENDED_STATISTICS = 1;
33f08c3bdfSopenharmony_ci
34f08c3bdfSopenharmony_ci
35f08c3bdfSopenharmony_ciuse POSIX;
36f08c3bdfSopenharmony_ciuse File::stat;
37f08c3bdfSopenharmony_ci
38f08c3bdfSopenharmony_cisub print_usage {
39f08c3bdfSopenharmony_ci
40f08c3bdfSopenharmony_ci        print "\nUsage: mongo.pl <filesystem> <device>";
41f08c3bdfSopenharmony_ci	print                  " <mount_point> <log> <processes>\n";
42f08c3bdfSopenharmony_ci
43f08c3bdfSopenharmony_ci	print "<filesystem>  - the name of filesystem [reiserfs|ext2]\n";
44f08c3bdfSopenharmony_ci	print "<device>      - the device for benchmark (e.g. /dev/hda9)\n";
45f08c3bdfSopenharmony_ci	print "<mount_point> - mount-point for the filesystem";
46f08c3bdfSopenharmony_ci	print " (e.g. /mnt/testfs)\n";
47f08c3bdfSopenharmony_ci	print "<log>         - the name prefix for benchmark results\n";
48f08c3bdfSopenharmony_ci	print "<processes>   - the number of benchmark processes\n";
49f08c3bdfSopenharmony_ci
50f08c3bdfSopenharmony_ci	print "\nexamples:\n";
51f08c3bdfSopenharmony_ci	print "mongo.pl reiserfs /dev/hda9 /testfs reiserfs_results 1\n";
52f08c3bdfSopenharmony_ci	print "mongo.pl ext2 /dev/hda9 /testfs ext2_results 1\n";
53f08c3bdfSopenharmony_ci
54f08c3bdfSopenharmony_ci	print "\nThe results will be put in ./results directory\n";
55f08c3bdfSopenharmony_ci}
56f08c3bdfSopenharmony_ci
57f08c3bdfSopenharmony_ci
58f08c3bdfSopenharmony_ci#------- Subroutines declaration --------
59f08c3bdfSopenharmony_cisub make_fsys;
60f08c3bdfSopenharmony_cisub mongo_x_process;
61f08c3bdfSopenharmony_cisub mongo_launcher;
62f08c3bdfSopenharmony_cisub set_params;
63f08c3bdfSopenharmony_ci
64f08c3bdfSopenharmony_ci#------- main() -------------------------
65f08c3bdfSopenharmony_ci
66f08c3bdfSopenharmony_ciif ( $#{ARGV} != 4 ) {
67f08c3bdfSopenharmony_ci        print_usage;
68f08c3bdfSopenharmony_ci	exit(0);
69f08c3bdfSopenharmony_ci    }
70f08c3bdfSopenharmony_ci
71f08c3bdfSopenharmony_ci#--------------------------------------------
72f08c3bdfSopenharmony_ci# Set working directories
73f08c3bdfSopenharmony_ci#--------------------------------------------
74f08c3bdfSopenharmony_ci$TOPDIR  = "$ENV{PWD}";
75f08c3bdfSopenharmony_ci
76f08c3bdfSopenharmony_ci$RESDIR  = "${TOPDIR}/results";
77f08c3bdfSopenharmony_ci$HTMLDIR = "${RESDIR}/html";
78f08c3bdfSopenharmony_ci
79f08c3bdfSopenharmony_ci$FILESYSTEM  = $ARGV[0];
80f08c3bdfSopenharmony_ci$DEVICE      = $ARGV[1];
81f08c3bdfSopenharmony_ci$TESTDIR     = $ARGV[2];
82f08c3bdfSopenharmony_ci$PROCESSES   = $ARGV[4];
83f08c3bdfSopenharmony_ci
84f08c3bdfSopenharmony_ci$LOGFILE     = "${RESDIR}/${ARGV[3]}";
85f08c3bdfSopenharmony_ci$LOGFILE2    = "${LOGFILE}_table";
86f08c3bdfSopenharmony_ci$LOGFILE3    = "${LOGFILE}.tbl";
87f08c3bdfSopenharmony_ci
88f08c3bdfSopenharmony_ci$TMPFILE     = "${RESDIR}/mongo_tmp";
89f08c3bdfSopenharmony_ci$nproc       = $PROCESSES;
90f08c3bdfSopenharmony_ci$READIT      = "${TOPDIR}/mongo_read";
91f08c3bdfSopenharmony_ci$SLINKS      = "${TOPDIR}/mongo_slinks";
92f08c3bdfSopenharmony_ci
93f08c3bdfSopenharmony_ci#-------- reiser_fract_tree parameters----------------
94f08c3bdfSopenharmony_ci$x1mb   = 1024 * 1024;
95f08c3bdfSopenharmony_ci$x2mb   =    2 * $x1mb;
96f08c3bdfSopenharmony_ci$x3mb   =    3 * $x1mb;
97f08c3bdfSopenharmony_ci
98f08c3bdfSopenharmony_ci$x5mb   =    5 * $x1mb;
99f08c3bdfSopenharmony_ci$x50mb  =   50 * $x1mb;
100f08c3bdfSopenharmony_ci$x100mb =  100 * $x1mb;
101f08c3bdfSopenharmony_ci
102f08c3bdfSopenharmony_ci# Total amount of bytes in all files on test partition
103f08c3bdfSopenharmony_ci#-----------------------------------------------------
104f08c3bdfSopenharmony_ci
105f08c3bdfSopenharmony_ci$small_bytes   = $x50mb;
106f08c3bdfSopenharmony_ci$medium_bytes  = $x100mb;
107f08c3bdfSopenharmony_ci$big_bytes     = $x100mb;
108f08c3bdfSopenharmony_ci$large_bytes   = $x100mb;
109f08c3bdfSopenharmony_ci
110f08c3bdfSopenharmony_ci# Median size of files in bytes for first tree to create
111f08c3bdfSopenharmony_ci#-------------------------------------------------------
112f08c3bdfSopenharmony_ci$small_size   = 100;
113f08c3bdfSopenharmony_ci$medium_size  = 1000;
114f08c3bdfSopenharmony_ci$big_size     = 10000;
115f08c3bdfSopenharmony_ci$large_size   = 100000;
116f08c3bdfSopenharmony_ci
117f08c3bdfSopenharmony_ci# Keep the largest file to one fifth (100 million bytes)
118f08c3bdfSopenharmony_ci# of the total tree size.
119f08c3bdfSopenharmony_ci#-------------------------------------------------------
120f08c3bdfSopenharmony_ci$max_file_size = 100000000;
121f08c3bdfSopenharmony_ci
122f08c3bdfSopenharmony_ci# Yuri Shevchuk says that 0 is the median size
123f08c3bdfSopenharmony_ci# in real life, so I believe him.
124f08c3bdfSopenharmony_ci#----------------------------------------------
125f08c3bdfSopenharmony_ci$median_dir_nr_files = 0;
126f08c3bdfSopenharmony_ci
127f08c3bdfSopenharmony_ci# This should be larger, change once done testing.
128f08c3bdfSopenharmony_ci#-------------------------------------------------
129f08c3bdfSopenharmony_ci$bytes_to_consume = 10000000;
130f08c3bdfSopenharmony_ci
131f08c3bdfSopenharmony_ci$median_file_size = 100;
132f08c3bdfSopenharmony_ci$max_file_size    = 1000000;
133f08c3bdfSopenharmony_ci
134f08c3bdfSopenharmony_ci$median_dir_nr_files    = 100;
135f08c3bdfSopenharmony_ci$max_directory_nr_files = 10000;
136f08c3bdfSopenharmony_ci
137f08c3bdfSopenharmony_ci$median_dir_branching = 0;
138f08c3bdfSopenharmony_ci$max_dir_branching    = 1;
139f08c3bdfSopenharmony_ci
140f08c3bdfSopenharmony_ci# This should be varying, someday....
141f08c3bdfSopenharmony_ci#------------------------------------
142f08c3bdfSopenharmony_ci$write_buffer_size = 4096;
143f08c3bdfSopenharmony_ci
144f08c3bdfSopenharmony_ci@numb_of_bytes = ($small_bytes, $medium_bytes, $big_bytes, $large_bytes);
145f08c3bdfSopenharmony_ci@size_of_files = ($small_size,  $medium_size,  $big_size,  $large_size);
146f08c3bdfSopenharmony_ci
147f08c3bdfSopenharmony_ci$reiser_fract_tree_rep_counter = 3;
148f08c3bdfSopenharmony_ci
149f08c3bdfSopenharmony_ci$total_params = $#{numb_of_bytes};
150f08c3bdfSopenharmony_ci
151f08c3bdfSopenharmony_ci#... Make directories for results
152f08c3bdfSopenharmony_ci#--------------------------------
153f08c3bdfSopenharmony_ciunless (-e $RESDIR) {
154f08c3bdfSopenharmony_ci    print "Creating dir: ${RESDIR} \n";
155f08c3bdfSopenharmony_ci    system("mkdir $RESDIR");
156f08c3bdfSopenharmony_ci}
157f08c3bdfSopenharmony_ci
158f08c3bdfSopenharmony_ciunless ( -e $HTMLDIR ) {
159f08c3bdfSopenharmony_ci    print "Creating dir: ${HTMLDIR} \n";
160f08c3bdfSopenharmony_ci    system("mkdir $HTMLDIR");
161f08c3bdfSopenharmony_ci}
162f08c3bdfSopenharmony_ci
163f08c3bdfSopenharmony_ci#... Compile *.c files if it is necessary
164f08c3bdfSopenharmony_ci#----------------------------------------
165f08c3bdfSopenharmony_cisub compile
166f08c3bdfSopenharmony_ci{
167f08c3bdfSopenharmony_ci  my $file = shift @_;
168f08c3bdfSopenharmony_ci  my $opt = shift @_ if @_ ;
169f08c3bdfSopenharmony_ci  my $cfile = $file . ".c";
170f08c3bdfSopenharmony_ci  die "source file \"${cfile}\" does not exist" unless (-e  "$cfile");
171f08c3bdfSopenharmony_ci  if ( -e "$file" && (stat("$file")->mtime >= stat("$cfile")->mtime)) {
172f08c3bdfSopenharmony_ci    print "$file is up to date ...\n";
173f08c3bdfSopenharmony_ci  } else {
174f08c3bdfSopenharmony_ci    print "Compiling ${cfile} ...\n";
175f08c3bdfSopenharmony_ci    system ("gcc $cfile -o $file $opt");
176f08c3bdfSopenharmony_ci  }
177f08c3bdfSopenharmony_ci}
178f08c3bdfSopenharmony_ci
179f08c3bdfSopenharmony_cicompile("reiser_fract_tree", "-lm");
180f08c3bdfSopenharmony_cicompile("mongo_slinks");
181f08c3bdfSopenharmony_cicompile("mongo_read");
182f08c3bdfSopenharmony_cicompile("map5");
183f08c3bdfSopenharmony_cicompile("summ");
184f08c3bdfSopenharmony_cicompile("mongo_compare");
185f08c3bdfSopenharmony_ci
186f08c3bdfSopenharmony_ci#... Check the command string parameters
187f08c3bdfSopenharmony_ci#---------------------------------------
188f08c3bdfSopenharmony_ciunless ( ($FILESYSTEM eq "reiserfs") or ($FILESYSTEM eq "ext2") ) {
189f08c3bdfSopenharmony_ci    print "mongo.pl: not valid filesystem name: ${FILESYSTEM} \n";
190f08c3bdfSopenharmony_ci    print "Usage: mongo.pl <filesystem> <device> <mount_point> <log> <repeat>\n";
191f08c3bdfSopenharmony_ci    exit(0);
192f08c3bdfSopenharmony_ci}
193f08c3bdfSopenharmony_ci
194f08c3bdfSopenharmony_ciunless ( -b $DEVICE ) {
195f08c3bdfSopenharmony_ci    print "mongo.pl: not valid device: ${DEVICE} \n";
196f08c3bdfSopenharmony_ci    print "Usage: mongo.pl <filesystem> <device> <mount_point> <log> <repeat>\n";
197f08c3bdfSopenharmony_ci    exit(0);
198f08c3bdfSopenharmony_ci}
199f08c3bdfSopenharmony_ci
200f08c3bdfSopenharmony_ci
201f08c3bdfSopenharmony_ci#------- Subroutines --------------------------------------
202f08c3bdfSopenharmony_ci#----------------------------------------------------------
203f08c3bdfSopenharmony_cisub get_blocks_usage ($) {
204f08c3bdfSopenharmony_ci  my ($mp) = @_;
205f08c3bdfSopenharmony_ci  my $df = `df -k $mp | tail -n 1`;
206f08c3bdfSopenharmony_ci  chomp $df;
207f08c3bdfSopenharmony_ci  my @items = split / +/, $df;
208f08c3bdfSopenharmony_ci  return $items[2];
209f08c3bdfSopenharmony_ci}
210f08c3bdfSopenharmony_ci
211f08c3bdfSopenharmony_cisub make_fsys {
212f08c3bdfSopenharmony_ci
213f08c3bdfSopenharmony_ci    system ("umount $TESTDIR") ;
214f08c3bdfSopenharmony_ci
215f08c3bdfSopenharmony_ci    if ( $FILESYSTEM eq "reiserfs" ) {
216f08c3bdfSopenharmony_ci	system("echo y | mkreiserfs $DEVICE") ;
217f08c3bdfSopenharmony_ci	system("mount -t reiserfs $DEVICE $TESTDIR") ;
218f08c3bdfSopenharmony_ci    }
219f08c3bdfSopenharmony_ci
220f08c3bdfSopenharmony_ci    if ( $FILESYSTEM eq "ext2" ) {
221f08c3bdfSopenharmony_ci	system("mke2fs $DEVICE") ;
222f08c3bdfSopenharmony_ci	system("mount $DEVICE $TESTDIR") ;
223f08c3bdfSopenharmony_ci    }
224f08c3bdfSopenharmony_ci}
225f08c3bdfSopenharmony_ci
226f08c3bdfSopenharmony_ci
227f08c3bdfSopenharmony_ci#------------------------------------------------------------------
228f08c3bdfSopenharmony_ci# Mongo Launcher
229f08c3bdfSopenharmony_ci#------------------------------------------------------------------
230f08c3bdfSopenharmony_cisub mongo_launcher {
231f08c3bdfSopenharmony_ci
232f08c3bdfSopenharmony_ci    my ($phase_num, $phase_name, $cmd, $dir1, $dir2, $flag, $processes) = @_ ;
233f08c3bdfSopenharmony_ci
234f08c3bdfSopenharmony_ci
235f08c3bdfSopenharmony_ci    print "$phase_num.$phase_name files of median size $median_file_size bytes ($p processes)...\n";
236f08c3bdfSopenharmony_ci    print LOG "********* Phase $phase_num: $phase_name files of median size $median_file_size bytes ($p processes) *********\n";
237f08c3bdfSopenharmony_ci    $i=0;
238f08c3bdfSopenharmony_ci    $total=0;
239f08c3bdfSopenharmony_ci
240f08c3bdfSopenharmony_ci# eliminate the rep counter and the while
241f08c3bdfSopenharmony_ci    while ( $i < $reiser_fract_tree_rep_counter ) {
242f08c3bdfSopenharmony_ci	print "$phase_name : ";
243f08c3bdfSopenharmony_ci    	print LOG "$phase_name : ";
244f08c3bdfSopenharmony_ci	$com = "";
245f08c3bdfSopenharmony_ci	$pp=$processes;
246f08c3bdfSopenharmony_ci
247f08c3bdfSopenharmony_ci	$j=0;
248f08c3bdfSopenharmony_ci	while ($pp > 0) {
249f08c3bdfSopenharmony_ci	    $pp--;
250f08c3bdfSopenharmony_ci
251f08c3bdfSopenharmony_ci# the fact that this if statement was necessary indicated you
252f08c3bdfSopenharmony_ci# attempted excessive generalization and abstraction where it was not
253f08c3bdfSopenharmony_ci# natural to the task that makes the code harder to understand.  put
254f08c3bdfSopenharmony_ci# every command on one line to execute.  I like it when I can read a
255f08c3bdfSopenharmony_ci# one line command and see what that phase of the test does instead of
256f08c3bdfSopenharmony_ci# looking in many places throughout the code.
257f08c3bdfSopenharmony_ci
258f08c3bdfSopenharmony_ci	    if ($phase_num == 1) {
259f08c3bdfSopenharmony_ci    		$com .= "$cmd $dir1-$i-$j $flag";
260f08c3bdfSopenharmony_ci	    }
261f08c3bdfSopenharmony_ci	    elsif ($phase_num == 2) {
262f08c3bdfSopenharmony_ci		$com .= "$cmd $dir1-$i-$j $dir2-$i-$j";
263f08c3bdfSopenharmony_ci	    }
264f08c3bdfSopenharmony_ci	    elsif ($phase_num == 3) {
265f08c3bdfSopenharmony_ci		$com .= "$cmd $dir1-$i-$j "."-type f | while read X; do echo \$X \$X.lnk ; done | $TOPDIR/mongo_slinks ";
266f08c3bdfSopenharmony_ci	    }
267f08c3bdfSopenharmony_ci	    elsif ($phase_num == 4) {
268f08c3bdfSopenharmony_ci		$com .= "$cmd";
269f08c3bdfSopenharmony_ci	    }
270f08c3bdfSopenharmony_ci	    elsif ($phase_num == 5) {
271f08c3bdfSopenharmony_ci		$com .= "$cmd";
272f08c3bdfSopenharmony_ci	    }
273f08c3bdfSopenharmony_ci	    elsif ($phase_num == 6) {
274f08c3bdfSopenharmony_ci		$com .= "$cmd $dir1-$i-$j -type f | perl -e 'while (<>) { chomp; rename (\$_, \"\$_.r\"); };'";
275f08c3bdfSopenharmony_ci		#$com .= " & $cmd $dir2-$i-$j "."-type d -exec mv {} {}.r ';'";
276f08c3bdfSopenharmony_ci	    }
277f08c3bdfSopenharmony_ci	    elsif ($phase_num == 7) {
278f08c3bdfSopenharmony_ci		if ($processes > 1) {
279f08c3bdfSopenharmony_ci		    $com .= "$cmd $dir1-$i-$j & $cmd $dir2-$i-$j";
280f08c3bdfSopenharmony_ci		}
281f08c3bdfSopenharmony_ci		else {
282f08c3bdfSopenharmony_ci		    $com .= "$cmd $dir1-$i-$j ; $cmd $dir2-$i-$j";
283f08c3bdfSopenharmony_ci		}
284f08c3bdfSopenharmony_ci	    }
285f08c3bdfSopenharmony_ci	    $com .= " & ";
286f08c3bdfSopenharmony_ci	    $j++;
287f08c3bdfSopenharmony_ci	}
288f08c3bdfSopenharmony_ci
289f08c3bdfSopenharmony_ci	$com .= " wait";
290f08c3bdfSopenharmony_ci	#print $com, "\n";
291f08c3bdfSopenharmony_ci
292f08c3bdfSopenharmony_ci	@t=`(time -p $com) 2>&1`;
293f08c3bdfSopenharmony_ci
294f08c3bdfSopenharmony_ci	@tt = split ' ', $t[0];
295f08c3bdfSopenharmony_ci    	$res = $tt[1];
296f08c3bdfSopenharmony_ci	unless ( $res =~ /\s*\d+/) {
297f08c3bdfSopenharmony_ci	    print @t , "\n";
298f08c3bdfSopenharmony_ci	    print LOG @t, "\n";
299f08c3bdfSopenharmony_ci	} else {
300f08c3bdfSopenharmony_ci	    print LOG "$res sec.\n";
301f08c3bdfSopenharmony_ci	    print "$res sec.\n";
302f08c3bdfSopenharmony_ci	}
303f08c3bdfSopenharmony_ci
304f08c3bdfSopenharmony_ci	$total += $res;
305f08c3bdfSopenharmony_ci    	$i++;
306f08c3bdfSopenharmony_ci     }
307f08c3bdfSopenharmony_ci
308f08c3bdfSopenharmony_ci    print "total $phase_name time: $total sec.\n";
309f08c3bdfSopenharmony_ci    print LOG "total $phase_name time: $total sec.\n";
310f08c3bdfSopenharmony_ci
311f08c3bdfSopenharmony_ci    $ares[$phase_num]=$total;  # ser array of results
312f08c3bdfSopenharmony_ci
313f08c3bdfSopenharmony_ci    if ($EXTENDED_STATISTICS) {
314f08c3bdfSopenharmony_ci	if( $phase_num < 3) {
315f08c3bdfSopenharmony_ci	    $used = get_blocks_usage($TESTDIR) - $used0;
316f08c3bdfSopenharmony_ci	    if ($phase_num == 1) {
317f08c3bdfSopenharmony_ci		$used1=$used;
318f08c3bdfSopenharmony_ci	    }elsif($phase_num == 2){
319f08c3bdfSopenharmony_ci		$used2=$used;
320f08c3bdfSopenharmony_ci	    }
321f08c3bdfSopenharmony_ci	    print "Used disk space (df) : $used KB\n";
322f08c3bdfSopenharmony_ci	    print LOG "Used disk space (df) : $used KB\n";
323f08c3bdfSopenharmony_ci
324f08c3bdfSopenharmony_ci	    open (FIND_PIPE, "find $TESTDIR|") || die "cannnot open pipe from \"find\": $!\n";
325f08c3bdfSopenharmony_ci	    $dirs = 0;
326f08c3bdfSopenharmony_ci	    $files = 0;
327f08c3bdfSopenharmony_ci	    $files16 = 0;
328f08c3bdfSopenharmony_ci
329f08c3bdfSopenharmony_ci	    while(<FIND_PIPE>) {
330f08c3bdfSopenharmony_ci		chomp;
331f08c3bdfSopenharmony_ci		$st = lstat ($_);
332f08c3bdfSopenharmony_ci		if (S_ISDIR($st->mode)) {
333f08c3bdfSopenharmony_ci		    $dirs ++;
334f08c3bdfSopenharmony_ci		} elsif (S_ISREG($st->mode)) {
335f08c3bdfSopenharmony_ci		    $files ++;
336f08c3bdfSopenharmony_ci		    $files16 ++ if ($st->size > 16384);
337f08c3bdfSopenharmony_ci		}
338f08c3bdfSopenharmony_ci	    }
339f08c3bdfSopenharmony_ci
340f08c3bdfSopenharmony_ci	    close (FIND_PIPE);
341f08c3bdfSopenharmony_ci
342f08c3bdfSopenharmony_ci	    print "Total dirs: $dirs\n";
343f08c3bdfSopenharmony_ci	    print "Total files: $files\n";
344f08c3bdfSopenharmony_ci	    print LOG "Total dirs: $dirs\n";
345f08c3bdfSopenharmony_ci	    print LOG "Total files: $files\n";
346f08c3bdfSopenharmony_ci
347f08c3bdfSopenharmony_ci	    #$f=$frag;
348f08c3bdfSopenharmony_ci	    $f16  = $files16;
349f08c3bdfSopenharmony_ci	    $fr16 =`find $TESTDIR -type f -size +16k | xargs $TOPDIR/map5 | $TOPDIR/summ | tail -n 1 2>&1`;
350f08c3bdfSopenharmony_ci	    @ff16= split ' ', $f16;
351f08c3bdfSopenharmony_ci	    @ffr16= split ' ', $fr16;
352f08c3bdfSopenharmony_ci	    $files16 = $ff16[0];
353f08c3bdfSopenharmony_ci	    $frag = $ffr16[0];
354f08c3bdfSopenharmony_ci	    $procent = $frag / $files16;
355f08c3bdfSopenharmony_ci	    print "Total fragments : $frag \n";
356f08c3bdfSopenharmony_ci	    print LOG "Total fragments : $frag \n";
357f08c3bdfSopenharmony_ci
358f08c3bdfSopenharmony_ci	    printf "Fragments / files :%.3f\n", $procent;
359f08c3bdfSopenharmony_ci	    printf LOG "Fragments / files :%.3f\n", $procent;
360f08c3bdfSopenharmony_ci	    $frag_res[$phase_num]=$procent;  # ser array of results
361f08c3bdfSopenharmony_ci	}
362f08c3bdfSopenharmony_ci    }
363f08c3bdfSopenharmony_ci
364f08c3bdfSopenharmony_ci    system("sync");
365f08c3bdfSopenharmony_ci    print "\n";
366f08c3bdfSopenharmony_ci    print LOG "\n";
367f08c3bdfSopenharmony_ci
368f08c3bdfSopenharmony_ci}
369f08c3bdfSopenharmony_ci
370f08c3bdfSopenharmony_ci# and what is an x process?
371f08c3bdfSopenharmony_ci
372f08c3bdfSopenharmony_ci#------------------------------------------------------------------
373f08c3bdfSopenharmony_ci# MONGO_X_PROCESS ( x is number of processes to run )
374f08c3bdfSopenharmony_ci#------------------------------------------------------------------
375f08c3bdfSopenharmony_cisub mongo_x_process {
376f08c3bdfSopenharmony_ci
377f08c3bdfSopenharmony_ci    my ($processes) = @_ ;
378f08c3bdfSopenharmony_ci    $p = $processes;
379f08c3bdfSopenharmony_ci
380f08c3bdfSopenharmony_ci    make_fsys;       # make and mount the file system
381f08c3bdfSopenharmony_ci    $used0 = get_blocks_usage($TESTDIR);
382f08c3bdfSopenharmony_ci
383f08c3bdfSopenharmony_ci    open LOG,  ">>$LOGFILE"  or die "Can not open log file $LOGFILE\n";
384f08c3bdfSopenharmony_ci    open LOG2, ">>$LOGFILE2" or die "Can not open log file $LOGFILE2\n";
385f08c3bdfSopenharmony_ci    open LOG3, ">>$LOGFILE3" or die "Can not open log file $LOGFILE2\n";
386f08c3bdfSopenharmony_ci
387f08c3bdfSopenharmony_ci    print LOG "FILESYSTEM=$FILESYSTEM \n";
388f08c3bdfSopenharmony_ci
389f08c3bdfSopenharmony_ci    print "\n";
390f08c3bdfSopenharmony_ci    if($p == 1) {
391f08c3bdfSopenharmony_ci	print "mongo_single_process, the_set_of_param.N=$par_set_n of $total_params \n";
392f08c3bdfSopenharmony_ci	print LOG "mongo_single_process, the_set_of_paramN=$par_set_n of $total_params \n";
393f08c3bdfSopenharmony_ci    } elsif ($p > 1) {
394f08c3bdfSopenharmony_ci        print "mongo_multi_process ($p processes), the_set_of_param.N=$par_set_n of $total_params \n";
395f08c3bdfSopenharmony_ci	print LOG "mongo_multi_process ($p processes), the_set_of_paramN=$par_set_n of $total_params \n";
396f08c3bdfSopenharmony_ci    }
397f08c3bdfSopenharmony_ci
398f08c3bdfSopenharmony_ci    print "Results in file : $LOGFILE \n";
399f08c3bdfSopenharmony_ci    print "\n";
400f08c3bdfSopenharmony_ci
401f08c3bdfSopenharmony_ci    $dir1 = "$TESTDIR/testdir1";
402f08c3bdfSopenharmony_ci    $dir2 = "$TESTDIR/testdir2";
403f08c3bdfSopenharmony_ci    $flag = 0;
404f08c3bdfSopenharmony_ci
405f08c3bdfSopenharmony_ci    $cmd_1 = "$TOPDIR/reiser_fract_tree $bytes_to_consume $median_file_size $max_file_size $median_dir_nr_files $max_directory_nr_files $median_dir_branching $max_dir_branching $write_buffer_size";
406f08c3bdfSopenharmony_ci    $cmd_2 = "cp -r";
407f08c3bdfSopenharmony_ci    $cmd_3 = "find";
408f08c3bdfSopenharmony_ci    $cmd_4 = "find $TESTDIR -type f | xargs $TOPDIR/mongo_read";
409f08c3bdfSopenharmony_ci    $cmd_5 = "find $TESTDIR -type f > /dev/null"; # it should be enough for stat all files. -zam
410f08c3bdfSopenharmony_ci    $cmd_6 = "find"; #" $TESTDIR -type f -exec mv {} {}.r ';'";
411f08c3bdfSopenharmony_ci    $cmd_7 = "rm -r";
412f08c3bdfSopenharmony_ci
413f08c3bdfSopenharmony_ci    system("sync");
414f08c3bdfSopenharmony_ci    $frag = 0;
415f08c3bdfSopenharmony_ci    mongo_launcher ( 1, "Create", $cmd_1, $dir1, $dir2, $flag, $p); # phase 1
416f08c3bdfSopenharmony_ci    mongo_launcher ( 2, "Copy  ", $cmd_2, $dir1, $dir2, $flag, $p); # phase 2
417f08c3bdfSopenharmony_ci    mongo_launcher ( 3, "Slinks", $cmd_3, $dir1, $dir2, $flag, $p); # phase 3
418f08c3bdfSopenharmony_ci    mongo_launcher ( 4, "Read  ", $cmd_4, $dir1, $dir2, $flag, $p); # phase 4
419f08c3bdfSopenharmony_ci    mongo_launcher ( 5, "Stats ", $cmd_5, $dir1, $dir2, $flag, $p); # phase 5
420f08c3bdfSopenharmony_ci    mongo_launcher ( 6, "Rename", $cmd_6, $dir1, $dir2, $flag, $p); # phase 6
421f08c3bdfSopenharmony_ci    mongo_launcher ( 7, "Delete", $cmd_7, $dir1, $dir2, $flag, $p); # phase 7
422f08c3bdfSopenharmony_ci
423f08c3bdfSopenharmony_ci    print LOG2 "\n";
424f08c3bdfSopenharmony_ci    if ($processes > 1) {
425f08c3bdfSopenharmony_ci	print LOG2 "MONGO_MULTI_PROCESS ($processes processes) BENCHMARK RESULTS (time in sec.)\n";
426f08c3bdfSopenharmony_ci    }else {
427f08c3bdfSopenharmony_ci	print LOG2 "MONGO_SINGLE_PROCESS BENCHMARK RESULTS (time in sec.)\n";
428f08c3bdfSopenharmony_ci    }
429f08c3bdfSopenharmony_ci    print LOG2 "  FILESYSTEM=$FILESYSTEM\n";
430f08c3bdfSopenharmony_ci    print LOG2 "  parameters: files=$files, base_size=$median_file_size bytes, dirs=$dirs\n";
431f08c3bdfSopenharmony_ci    print LOG2 "--------------------------------------------------------------\n";
432f08c3bdfSopenharmony_ci    print LOG2 "Create\tCopy\tSlink\tRead\tStats\tRename\tDelete\n";
433f08c3bdfSopenharmony_ci    print LOG2 " time \ttime\ttime\ttime\ttime \t time \t time\n";
434f08c3bdfSopenharmony_ci    print LOG2 "--------------------------------------------------------------\n";
435f08c3bdfSopenharmony_ci    print LOG2 "$ares[1]\t$ares[2]\t$ares[3]\t$ares[4]\t$ares[5]\t$ares[6]\t$ares[7]\n";
436f08c3bdfSopenharmony_ci    print LOG2 "--------------------------------------------------------------\n";
437f08c3bdfSopenharmony_ci    print LOG2 "The size of files tree : \n";
438f08c3bdfSopenharmony_ci    print LOG2 "         after create = $used1 kb\n";
439f08c3bdfSopenharmony_ci    print LOG2 "         after copy   = $used2 kb\n";
440f08c3bdfSopenharmony_ci    print LOG2 "\n";
441f08c3bdfSopenharmony_ci
442f08c3bdfSopenharmony_ci
443f08c3bdfSopenharmony_ci    print LOG3 "\n";
444f08c3bdfSopenharmony_ci    if ($processes > 1) {
445f08c3bdfSopenharmony_ci	print LOG3 "MONGO_MULTI_PROCESS  ($processes)    \n";
446f08c3bdfSopenharmony_ci    }else {
447f08c3bdfSopenharmony_ci	print LOG3 "MONGO_SINGLE_PROCESS      \n";
448f08c3bdfSopenharmony_ci    }
449f08c3bdfSopenharmony_ci    print LOG3 "parameters:              \n";
450f08c3bdfSopenharmony_ci    print LOG3 "files=$files            \n";
451f08c3bdfSopenharmony_ci    print LOG3 "base_size=$median_file_size bytes    \n";
452f08c3bdfSopenharmony_ci    print LOG3 "dirs=$dirs              \n";
453f08c3bdfSopenharmony_ci    print LOG3 "\n";
454f08c3bdfSopenharmony_ci
455f08c3bdfSopenharmony_ci    print LOG3 "FSYS=$FILESYSTEM         \n";
456f08c3bdfSopenharmony_ci    print LOG3 "(time in sec.)           \n";
457f08c3bdfSopenharmony_ci    print LOG3 "Create : $ares[1]\n";
458f08c3bdfSopenharmony_ci    print LOG3 "Fragm. : $frag_res[1]\n";
459f08c3bdfSopenharmony_ci    print LOG3 "df     : $used1\n\n";
460f08c3bdfSopenharmony_ci    print LOG3 "Copy   : $ares[2] \n";
461f08c3bdfSopenharmony_ci    print LOG3 "Fragm. : $frag_res[2]\n";
462f08c3bdfSopenharmony_ci    print LOG3 "df     : $used2\n\n";
463f08c3bdfSopenharmony_ci    print LOG3 "Slinks : $ares[3]\n";
464f08c3bdfSopenharmony_ci    print LOG3 "Read   : $ares[4]\n";
465f08c3bdfSopenharmony_ci    print LOG3 "Stats  : $ares[5]\n";
466f08c3bdfSopenharmony_ci    print LOG3 "Rename : $ares[6] \n";
467f08c3bdfSopenharmony_ci    print LOG3 "Delete : $ares[7]\n";
468f08c3bdfSopenharmony_ci
469f08c3bdfSopenharmony_ci    print LOG3 "\n";
470f08c3bdfSopenharmony_ci
471f08c3bdfSopenharmony_ci
472f08c3bdfSopenharmony_ci    if($processes > 1) {
473f08c3bdfSopenharmony_ci	print LOG "******* The end of mongo_multi_process *******";
474f08c3bdfSopenharmony_ci    }else {
475f08c3bdfSopenharmony_ci	print LOG "******* The end of mongo_single_process *******";
476f08c3bdfSopenharmony_ci    }
477f08c3bdfSopenharmony_ci}
478f08c3bdfSopenharmony_ci
479f08c3bdfSopenharmony_ci#---------------------------------------------------
480f08c3bdfSopenharmony_ci# Set parameters
481f08c3bdfSopenharmony_ci#---------------------------------------------------
482f08c3bdfSopenharmony_cisub set_params {
483f08c3bdfSopenharmony_ci    my ($n) = @_ ;
484f08c3bdfSopenharmony_ci
485f08c3bdfSopenharmony_ci    $bytes_to_consume = $numb_of_bytes[$n];
486f08c3bdfSopenharmony_ci    $median_file_size = $size_of_files[$n];
487f08c3bdfSopenharmony_ci
488f08c3bdfSopenharmony_ci    #$max_file_size    = 1000000;
489f08c3bdfSopenharmony_ci
490f08c3bdfSopenharmony_ci    #$median_dir_nr_files    = 100;
491f08c3bdfSopenharmony_ci    #$max_directory_nr_files = 10000;
492f08c3bdfSopenharmony_ci
493f08c3bdfSopenharmony_ci    #$median_dir_branching = 0;
494f08c3bdfSopenharmony_ci    #$max_dir_branching    = 1;
495f08c3bdfSopenharmony_ci
496f08c3bdfSopenharmony_ci}
497f08c3bdfSopenharmony_ci
498f08c3bdfSopenharmony_ci#----------------------------------------------------------
499f08c3bdfSopenharmony_ci#           TEST START
500f08c3bdfSopenharmony_ci#----------------------------------------------------------
501f08c3bdfSopenharmony_ci
502f08c3bdfSopenharmony_ci    $par_set_n = 0;
503f08c3bdfSopenharmony_ci    foreach $fsize (@size_of_files) {
504f08c3bdfSopenharmony_ci	set_params ($par_set_n);
505f08c3bdfSopenharmony_ci	mongo_x_process( $nproc );    # run n processes
506f08c3bdfSopenharmony_ci	$par_set_n++;
507f08c3bdfSopenharmony_ci    }
508f08c3bdfSopenharmony_ci    system("umount $TESTDIR");
509f08c3bdfSopenharmony_ci    exit;
510f08c3bdfSopenharmony_ci
511f08c3bdfSopenharmony_ci
512