~percona-dev/percona-server/release-5.5.11-20.2-fix-bug-764138

« back to all changes in this revision

Viewing changes to HandlerSocket-Plugin-for-MySQL/client/hstest.pl

  • Committer: Ignacio Nin
  • Date: 2011-03-13 17:18:23 UTC
  • mfrom: (33.3.17 release-5.5.8-20)
  • Revision ID: ignacio.nin@percona.com-20110313171823-m06xs104nekulywb
Merge changes from release-5.5.8-20 to 5.5.9

Merge changes from the release branch of 5.5.8 to 5.5.9. These include
the HandlerSocket and UDF directories and the building scripts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/perl
 
2
 
 
3
# vim:sw=8:ai:ts=8
 
4
 
 
5
use strict;
 
6
use warnings;
 
7
 
 
8
use DBI;
 
9
use Net::HandlerSocket;
 
10
 
 
11
my %conf = ();
 
12
for my $i (@ARGV) {
 
13
        my ($k, $v) = split(/=/, $i);
 
14
        $conf{$k} = $v;
 
15
}
 
16
 
 
17
my $verbose = get_conf("verbose", 0);
 
18
my $actions_str = get_conf("actions", "hsread");
 
19
my $tablesize = get_conf("tablesize", 10000);
 
20
my $db = get_conf("db", "hstest");
 
21
my $table = get_conf("table", "hstest_table1");
 
22
my $engine = get_conf("engine", "innodb");
 
23
my $host = get_conf("host", "localhost");
 
24
my $mysqlport = get_conf("mysqlport", 3306);
 
25
my $mysqluser = get_conf("mysqluser", "root");
 
26
my $mysqlpass = get_conf("mysqlpass", "");
 
27
my $hsport = get_conf("hsport", 9999);
 
28
my $loop = get_conf("loop", 10000);
 
29
my $op = get_conf("op", "=");
 
30
my $ssps = get_conf("ssps", 0);
 
31
my $num_moreflds = get_conf("moreflds", 0);
 
32
my $moreflds_prefix = get_conf("moreflds_prefix", "column0123456789_");
 
33
my $keytype = get_conf("keytype", "varchar(32)");
 
34
my $file = get_conf("file", undef);
 
35
 
 
36
my $dsn = "DBI:mysql:database=;host=$host;port=$mysqlport"
 
37
        . ";mysql_server_prepare=$ssps";
 
38
my $dbh = DBI->connect($dsn, $mysqluser, $mysqlpass, { RaiseError => 1 });
 
39
my $hsargs = { 'host' => $host, 'port' => $hsport };
 
40
my $cli = new Net::HandlerSocket($hsargs);
 
41
 
 
42
my @actions = split(/,/, $actions_str);
 
43
for my $action (@actions) {
 
44
        if ($action eq "table") {
 
45
                print("TABLE $db.$table\n");
 
46
                $dbh->do("drop database if exists $db");
 
47
                $dbh->do("create database $db");
 
48
                $dbh->do("use $db");
 
49
                my $moreflds = get_createtbl_moreflds_str();
 
50
                $dbh->do(
 
51
                        "create table $table (" .
 
52
                        "k $keytype primary key" .
 
53
                        ",v varchar(32) not null" .
 
54
                        $moreflds .
 
55
                        ") character set utf8 collate utf8_bin " .
 
56
                        "engine = $engine");
 
57
        } elsif ($action eq "insert") {
 
58
                print("INSERT $db.$table tablesize=$tablesize\n");
 
59
                $dbh->do("use $db");
 
60
                my $moreflds = get_insert_moreflds_str();
 
61
                for (my $i = 0; $i < $tablesize; $i += 100) {
 
62
                        my $qstr = "insert into $db.$table values";
 
63
                        for (my $j = 0; $j < 100; ++$j) {
 
64
                                if ($j != 0) {
 
65
                                        $qstr .= ",";
 
66
                                }
 
67
                                my $k = "" . ($i + $j);
 
68
                                my $v = "v" . int(rand(1000)) . ($i + $j);
 
69
                                $qstr .= "('$k', '$v'";
 
70
                                for (my $j = 0; $j < $num_moreflds; ++$j) {
 
71
                                        $qstr .= ",'$j'";
 
72
                                }
 
73
                                $qstr .= ")";
 
74
                        }
 
75
                        $dbh->do($qstr);
 
76
                        print "$i/$tablesize\n" if $i % 1000 == 0;
 
77
                }
 
78
        } elsif ($action eq "read") {
 
79
                print("READ $db.$table op=$op loop=$loop\n");
 
80
                $dbh->do("use $db");
 
81
                my $moreflds = get_select_moreflds_str();
 
82
                my $sth = $dbh->prepare(
 
83
                        "select k,v$moreflds from $db.$table where k = ?");
 
84
                for (my $i = 0; $i < $loop; ++$i) {
 
85
                        my $k = "" . int(rand($tablesize));
 
86
                        # print "k=$k\n";
 
87
                        $sth->execute($k);
 
88
                        if ($verbose >= 10) {
 
89
                                print "RET:";
 
90
                                while (my $ref = $sth->fetchrow_arrayref()) {
 
91
                                        my $rk = $ref->[0];
 
92
                                        my $rv = $ref->[1];
 
93
                                        print " $rk $rv";
 
94
                                }
 
95
                                print "\n";
 
96
                        }
 
97
                        print "$i/$loop\n" if $i % 1000 == 0;
 
98
                }
 
99
        } elsif ($action eq "hsinsert") {
 
100
                print("HSINSERT $db.$table tablesize=$tablesize\n");
 
101
                $cli->open_index(1, $db, $table, '', 'k,v');
 
102
                for (my $i = 0; $i < $tablesize; ++$i) {
 
103
                        my $k = "" . $i;
 
104
                        my $v = "v" . int(rand(1000)) . $i;
 
105
                        my $r = $cli->execute_insert(1, [ $k, $v ]);
 
106
                        if ($r->[0] != 0) {
 
107
                                die;
 
108
                        }
 
109
                        print "$i/$tablesize\n" if $i % 1000 == 0;
 
110
                }
 
111
        } elsif ($action eq "hsread") {
 
112
                print("HSREAD $db.$table op=$op loop=$loop\n");
 
113
                my $moreflds = get_select_moreflds_str();
 
114
                $cli->open_index(1, $db, $table, '', "k,v$moreflds");
 
115
                for (my $i = 0; $i < $loop; ++$i) {
 
116
                        my $k = "" . int(rand($tablesize));
 
117
                        # print "k=$k\n";
 
118
                        my $r = $cli->execute_find(1, $op, [ $k ], 1, 0);
 
119
                        if ($verbose >= 10) {
 
120
                                my $len = scalar(@{$r});
 
121
                                print "LEN=$len";
 
122
                                for my $e (@{$r}) {
 
123
                                        print " [$e]";
 
124
                                }
 
125
                                print "\n";
 
126
                        }
 
127
                        print "$i/$loop\n" if $i % 1000 == 0;
 
128
                }
 
129
        } elsif ($action eq "hsupdate") {
 
130
                my $vbase = "v" . int(rand(1000));
 
131
                print("HSUPDATE $db.$table op=$op loop=$loop vbase=$vbase\n");
 
132
                $cli->open_index(1, $db, $table, '', 'v');
 
133
                for (my $i = 0; $i < $loop; ++$i) {
 
134
                        my $k = "" . int(rand($tablesize));
 
135
                        my $v = $vbase . $i;
 
136
                        print "k=$k v=$v\n";
 
137
                        my $r = $cli->execute_update(1, $op, [ $k ], 1, 0,
 
138
                                [ $v ]);
 
139
                        if ($verbose >= 10) {
 
140
                                print "UP k=$k v=$v\n";
 
141
                        }
 
142
                        print "$i/$loop\n" if $i % 1000 == 0;
 
143
                }
 
144
        } elsif ($action eq "hsdelete") {
 
145
                print("HSDELETE $db.$table op=$op loop=$loop\n");
 
146
                $cli->open_index(1, $db, $table, '', '');
 
147
                for (my $i = 0; $i < $loop; ++$i) {
 
148
                        my $k = "" . int(rand($tablesize));
 
149
                        print "k=$k\n";
 
150
                        my $r = $cli->execute_delete(1, $op, [ $k ], 1, 0);
 
151
                        if ($verbose >= 10) {
 
152
                                print "DEL k=$k\n";
 
153
                        }
 
154
                        print "$i/$loop\n" if $i % 1000 == 0;
 
155
                }
 
156
        } elsif ($action eq "verify") {
 
157
                verify_do();
 
158
        }
 
159
}
 
160
 
 
161
sub verify_do {
 
162
        my ($fail_cnt, $ok_cnt) = (0, 0);
 
163
        my $sth = $dbh->prepare("select v from $db.$table where k = ?");
 
164
        use FileHandle;
 
165
        my $fh = new FileHandle($file, "r");
 
166
        while (my $line = <$fh>) {
 
167
                chomp($line);
 
168
                my @vec = split(/\t/, $line);
 
169
                my $k = $vec[3];
 
170
                my $v = $vec[7];
 
171
                next if (!defined($k) || !defined($v));
 
172
                # print "$k $v\n";
 
173
                $sth->execute($k);
 
174
                my $aref = $sth->fetchrow_arrayref();
 
175
                if (!defined($aref)) {
 
176
                        print "FAILED: $k notfound\n";
 
177
                        ++$fail_cnt;
 
178
                } else {
 
179
                        my $gv = $aref->[0];
 
180
                        if ($gv ne $v) {
 
181
                                print "FAILED: $k got=$gv expected=$v\n";
 
182
                                ++$fail_cnt;
 
183
                        } else {
 
184
                                print "OK: $k $v $gv\n" if $verbose >= 10;
 
185
                                ++$ok_cnt;
 
186
                        }
 
187
                }
 
188
        }
 
189
        print "OK=$ok_cnt FAIL=$fail_cnt\n";
 
190
}
 
191
 
 
192
sub get_conf {
 
193
        my ($key, $def) = @_;
 
194
        my $val = $conf{$key};
 
195
        if ($val) {
 
196
                print "$key=$val\n";
 
197
        } else {
 
198
                $val = $def;
 
199
                $def ||= '';
 
200
                print "$key=$def(default)\n";
 
201
        }
 
202
        return $val;
 
203
}
 
204
 
 
205
sub get_createtbl_moreflds_str {
 
206
        my $s = "";
 
207
        for (my $j = 0; $j < $num_moreflds; ++$j) {
 
208
                $s .= ",$moreflds_prefix$j varchar(30)";
 
209
        }
 
210
        return $s;
 
211
}
 
212
 
 
213
sub get_select_moreflds_str {
 
214
        my $s = "";
 
215
        for (my $i = 0; $i < $num_moreflds; ++$i) {
 
216
                $s .= ",$moreflds_prefix$i";
 
217
        }
 
218
        return $s;
 
219
}
 
220
 
 
221
sub get_insert_moreflds_str {
 
222
        my $s = "";
 
223
        for (my $i = 0; $i < $num_moreflds; ++$i) {
 
224
                $s .= ",?";
 
225
        }
 
226
        return $s;
 
227
}
 
228