~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to tests/fork2_test.pl

  • Committer: brian
  • Date: 2008-06-25 05:29:13 UTC
  • Revision ID: brian@localhost.localdomain-20080625052913-6upwo0jsrl4lnapl
clean slate

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/perl -w
 
2
 
 
3
# This is a test with uses 5 processes to insert, update and select from
 
4
# two tables.
 
5
# One inserts records in the tables, one updates some record in it and
 
6
# the last 3 does different selects on the tables.
 
7
# Er, hmmm..., something like that :^)
 
8
# Modified to do crazy-join, � la Nasdaq.
 
9
#
 
10
# This test uses the old obsolete mysql interface. For a test that uses
 
11
# DBI, please take a look at fork_big.pl
 
12
 
 
13
$opt_loop_count=10000; # Change this to make test harder/easier
 
14
 
 
15
##################### Standard benchmark inits ##############################
 
16
 
 
17
use Mysql;
 
18
use Getopt::Long;
 
19
use Benchmark;
 
20
 
 
21
package main;
 
22
 
 
23
$opt_skip_create=$opt_skip_in=$opt_verbose=$opt_fast_insert=
 
24
  $opt_lock_tables=$opt_debug=$opt_skip_delete=$opt_fast=$opt_force=0;
 
25
$opt_host=""; $opt_db="test";
 
26
 
 
27
GetOptions("host=s","db=s","loop-count=i","skip-create","skip-in",
 
28
           "skip-delete", "verbose","fast-insert","lock-tables","debug","fast",
 
29
           "force") || die "Aborted";
 
30
$opt_verbose=$opt_debug=$opt_lock_tables=$opt_fast_insert=$opt_fast=$opt_skip_in=$Mysql::db_errstr=$opt_force=undef;  # Ignore warnings from these
 
31
 
 
32
print "Testing 10 multiple connections to a server with 1 insert/update\n";
 
33
print "and 8 select connections and one ALTER TABLE.\n";
 
34
 
 
35
 
 
36
@testtables = qw(bench_f21 bench_f22 bench_f23 bench_f24 bench_f25);
 
37
$numtables = $#testtables;      # make emacs happier
 
38
$dtable = "directory";
 
39
####  
 
40
####  Start timeing and start test
 
41
####
 
42
 
 
43
$start_time=new Benchmark;
 
44
if (!$opt_skip_create)
 
45
{
 
46
  $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
 
47
  $Mysql::QUIET = 1;
 
48
  foreach $table (@testtables) {
 
49
      $dbh->Query("drop table $table");
 
50
  }
 
51
  $dbh->Query("drop table $dtable");
 
52
  $Mysql::QUIET = 0;
 
53
 
 
54
  foreach $table (@testtables) {
 
55
      print "Creating table $table in database $opt_db\n";
 
56
      $dbh->Query("create table $table".
 
57
                  " (id int(6) not null,".
 
58
                  " info varchar(32),".
 
59
                  " marker timestamp,".
 
60
                  " primary key(id))")
 
61
          or die $Mysql::db_errstr;
 
62
  }
 
63
  print "Creating directory table $dtable in $opt_db\n";
 
64
  $dbh->Query("create table $dtable (id int(6), last int(6))")
 
65
      or die $Mysql::db_errstr;
 
66
  # Populate directory table
 
67
  for $i ( 0 .. $numtables ) {
 
68
      $dbh->Query("insert into $dtable values($i, 0)");
 
69
  }
 
70
  $dbh=0;                       # Close handler
 
71
}
 
72
$|= 1;                          # Autoflush
 
73
 
 
74
####
 
75
#### Start the tests
 
76
####
 
77
 
 
78
#$test_index = 0;
 
79
 
 
80
test_1() if (($pid=fork()) == 0); $work{$pid}="insert";
 
81
test_2() if (($pid=fork()) == 0); $work{$pid}="simple1";
 
82
test_3() if (($pid=fork()) == 0); $work{$pid}="funny1";
 
83
test_2() if (($pid=fork()) == 0); $work{$pid}="simple2";
 
84
test_3() if (($pid=fork()) == 0); $work{$pid}="funny2";
 
85
test_2() if (($pid=fork()) == 0); $work{$pid}="simple3";
 
86
test_3() if (($pid=fork()) == 0); $work{$pid}="funny3";
 
87
test_2() if (($pid=fork()) == 0); $work{$pid}="simple4";
 
88
test_3() if (($pid=fork()) == 0); $work{$pid}="funny4";
 
89
alter_test() if (($pid=fork()) == 0); $work{$pid}="alter";
 
90
 
 
91
$errors=0;
 
92
while (($pid=wait()) != -1)
 
93
{
 
94
  $ret=$?/256;
 
95
  print "thread '" . $work{$pid} . "' finished with exit code $ret\n";
 
96
  $errors++ if ($ret != 0);
 
97
}
 
98
 
 
99
if (!$opt_skip_delete && !$errors)
 
100
{
 
101
  $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
 
102
  foreach $table (@testtables) {
 
103
      $dbh->Query("drop table $table");
 
104
  }
 
105
}
 
106
print ($errors ? "Test failed\n" :"Test ok\n");
 
107
 
 
108
$end_time=new Benchmark;
 
109
print "Total time: " .
 
110
  timestr(timediff($end_time, $start_time),"noc") . "\n";
 
111
 
 
112
exit(0);
 
113
 
 
114
#
 
115
# Insert records in the ?? tables the Nasdaq way
 
116
 
117
 
 
118
sub test_1
 
119
{
 
120
    my ($dbh,$table,$tmpvar,$rows,$found,$i);
 
121
 
 
122
    $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
 
123
    $tmpvar=1;
 
124
    $rows=$found=0;
 
125
    for ($i=0 ; $i < $opt_loop_count; $i++)
 
126
    {
 
127
        $tmpvar^= ((($tmpvar + 63) + $i)*3 % $numtables);
 
128
        # Nasdaq step 1:
 
129
        $sth=$dbh->Query("select id,last from $dtable where id='$tmpvar'")
 
130
            or die "Select directory row: $Mysql::db_errstr\n";
 
131
        # Nasdaq step 2:
 
132
        my ($did,$dlast) = $sth->FetchRow
 
133
            or die "Fetch directory row: $Mysql::db_errstr\n";
 
134
        $dlast++;
 
135
        $sth=$dbh->Query("INSERT into $testtables[$did]".
 
136
                         " VALUES($dlast,'This is entry $dlast',NULL)")
 
137
            || die "Got error on insert table $testtable[$did]:". 
 
138
                " $Mysql::db_errstr\n";
 
139
        # Nasdaq step 3 - where my application hangs
 
140
        $sth=$dbh->Query("update $dtable set last='$dlast' where id='$tmpvar'")
 
141
            or die "Updating directory for table $testtable[$did]:".
 
142
                " Mysql::db_errstr\n";
 
143
        $rows++;
 
144
    }
 
145
    $dbh=0;
 
146
    print "Test_1: Inserted $rows rows\n";
 
147
    exit(0);
 
148
}
 
149
 
 
150
#
 
151
# Nasdaq simple select
 
152
#
 
153
 
 
154
sub test_2
 
155
{
 
156
    my ($dbh,$id,$tmpvar,$rows,$found,$i);
 
157
 
 
158
    $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
 
159
    $rows=$found=0;
 
160
    $tmpvar=1;
 
161
    for ($i=0 ; $i < $opt_loop_count ; $i++)
 
162
    {
 
163
        $tmpvar^= ((($tmpvar + 63) + $i)*3 % $numtables);
 
164
        $sth=$dbh->Query("select a.id,a.info from $testtables[$tmpvar] as a,".
 
165
                         "$dtable as d".
 
166
                         " where a.id=d.last and $i >= 0")
 
167
            || die "Got error select max: $Mysql::db_errstr\n";
 
168
        if ((@row = $sth->FetchRow()) && defined($row[0]))
 
169
        {
 
170
            $found++;
 
171
        }
 
172
    }
 
173
    $dbh=0;
 
174
    print "Test_2: Found $found rows\n";
 
175
    exit(0);
 
176
}
 
177
 
 
178
 
 
179
#
 
180
# Nasdaq not-so-simple select
 
181
#
 
182
 
 
183
sub test_3
 
184
{
 
185
    my ($dbh,$id,$tmpvar,$rows,$i);
 
186
    $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
 
187
    $rows=0;
 
188
    $tmpvar ||= $numtables;
 
189
    for ($i=0 ; $i < $opt_loop_count ; $i++)
 
190
    {
 
191
        $tmpvar^= ((($tmpvar + 63) + $i)*3 % $numtables);
 
192
        $id1 = ($tmpvar+1) % $numtables;
 
193
        $id2 = ($id1+1) % $numtables;
 
194
        $id3 = ($id2+1) % $numtables;
 
195
        $sth = $dbh->Query("SELECT greatest(a.id, b.id, c.id), a.info".
 
196
                           " FROM $testtables[$id1] as a,".
 
197
                           " $testtables[$id2] as b,".
 
198
                           " $testtables[$id3] as c,".
 
199
                           " $dtable as d1, $dtable as d2, $dtable as d3".
 
200
                           " WHERE ".
 
201
                           " d1.last=a.id AND d2.last=b.id AND d3.last=c.id".
 
202
                           " AND d1.id='$id1' AND d2.id='$id2'".
 
203
                           " AND d3.id='$id3'")
 
204
            or die "Funny select: $Mysql::db_errstr\n";
 
205
        $rows+=$sth->numrows;
 
206
    }
 
207
    $dbh=0;
 
208
    print "Test_3: Found $rows rows\n";
 
209
    exit(0);
 
210
}
 
211
 
 
212
#
 
213
# Do an ALTER TABLE every 20 seconds
 
214
#
 
215
 
 
216
sub alter_test
 
217
{
 
218
    my ($dbh,$count,$old_row_count,$row_count,$id,@row,$sth);
 
219
 
 
220
    $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
 
221
    $id=$count=$row_count=0; $old_row_count= -1;
 
222
 
 
223
    # Execute the test as long as we get more data into the table
 
224
    while ($row_count != $old_row_count)
 
225
    {
 
226
      sleep(10);
 
227
      $sth=$dbh->Query("ALTER TABLE $testtables[$id] modify info varchar(32)") or die "Couldn't execute ALTER TABLE\n";
 
228
      $sth=0;
 
229
      $id=($id+1) % $numtables;
 
230
 
 
231
      # Test if insert test has ended
 
232
      $sth=$dbh->query("select count(*) from $testtables[0]") or die "Couldn't execute count(*)\n";
 
233
      @row = $sth->FetchRow();
 
234
      $old_row_count= $row_count;
 
235
      $row_count=$row[0];
 
236
      $count++;
 
237
    }
 
238
    $dbh=0;
 
239
    print "alter: Executed $count ALTER TABLE commands\n";
 
240
    exit(0);
 
241
}