1 |
dpavlin |
1.1 |
#!/usr/bin/perl |
2 |
|
|
|
3 |
|
|
|
4 |
|
|
use Pg; |
5 |
|
|
use Getopt::Long; |
6 |
|
|
use POSIX ":sys_wait_h"; |
7 |
|
|
|
8 |
|
|
|
9 |
|
|
$| = 1; |
10 |
|
|
$control = 0; |
11 |
|
|
|
12 |
|
|
|
13 |
|
|
$result = GetOptions("numprocs=i", "numstmts=i", "help"); |
14 |
|
|
if (defined($opt_help)) { |
15 |
|
|
print "Usage: $0 --numprocs=number_of_processes --numstmts=number_of_statements\n"; |
16 |
|
|
print "\n"; |
17 |
|
|
exit(0); |
18 |
|
|
} |
19 |
|
|
|
20 |
|
|
|
21 |
|
|
my $numprocs = $opt_numprocs || 4; |
22 |
|
|
my $numstmts = $opt_numstmts || 100; |
23 |
|
|
|
24 |
|
|
print STDERR "Running $numprocs threads, $numstmts inserts each\n"; |
25 |
|
|
|
26 |
|
|
my $info = "dbname=immanis host=kelly user=root"; |
27 |
|
|
#my $info = "dbname=replicate host=alicia user=nelio"; |
28 |
|
|
|
29 |
|
|
my @pids = (); |
30 |
|
|
for ($i=0; $i < $numprocs; $i++) { |
31 |
|
|
if (($pid = fork()) == 0) { |
32 |
|
|
doInserts($i+1); |
33 |
|
|
exit; |
34 |
|
|
} elsif ($pid != undef) { |
35 |
|
|
push @pids, $pid; |
36 |
|
|
} |
37 |
|
|
} |
38 |
|
|
|
39 |
|
|
foreach $pid (@pids) { |
40 |
|
|
my $x = -1; |
41 |
|
|
do { |
42 |
|
|
sleep(1); |
43 |
|
|
$x = waitpid($pid, 0); |
44 |
|
|
} until $x == $pid; |
45 |
|
|
} |
46 |
|
|
|
47 |
|
|
|
48 |
|
|
######################### |
49 |
|
|
|
50 |
|
|
sub doInserts { |
51 |
|
|
($pid) = @_; |
52 |
|
|
print "<$pid> Running...\n"; |
53 |
|
|
|
54 |
|
|
$conn = Pg::connectdb($info); |
55 |
|
|
if ($conn->status != PGRES_CONNECTION_OK) { |
56 |
|
|
print "<$pid> Failed opening $info\n"; |
57 |
|
|
print "<$pid> Abort!\n"; |
58 |
|
|
last; |
59 |
|
|
} |
60 |
|
|
|
61 |
|
|
$result = $conn->exec("BEGIN"); |
62 |
|
|
if ($result->resultStatus ne PGRES_COMMAND_OK) { |
63 |
|
|
print "<$pid> Error in query '$q': ". $conn->errorMessage."\n"; |
64 |
|
|
print "<$pid> Abort!\n"; |
65 |
|
|
last; |
66 |
|
|
} |
67 |
|
|
|
68 |
|
|
print "<$pid> Inserting $numstmts records...\n"; |
69 |
|
|
$sql = "INSERT INTO test (value) VALUES"; |
70 |
|
|
for ($i = 0; $i < $numstmts; $i++) { |
71 |
|
|
$time = time; |
72 |
|
|
$q = "$sql ('test_${pid}_${i}_$time')"; |
73 |
|
|
$result = $conn->exec($q); |
74 |
|
|
if ($result->resultStatus ne PGRES_COMMAND_OK) { |
75 |
|
|
print "<$pid> Error in query '$q': ". $conn->errorMessage."\n"; |
76 |
|
|
$conn->exec("ROLLBACK"); |
77 |
|
|
print "<$pid> Abort!\n"; |
78 |
|
|
last; |
79 |
|
|
} |
80 |
|
|
} |
81 |
|
|
print "<$pid> done!\n"; |
82 |
|
|
|
83 |
|
|
$result = $conn->exec("COMMIT"); |
84 |
|
|
if ($result->resultStatus ne PGRES_COMMAND_OK) { |
85 |
|
|
print "<$pid> Error in query '$q': ". $conn->errorMessage."\n"; |
86 |
|
|
$conn->exec("ROLLBACK"); |
87 |
|
|
print "<$pid> Abort!\n"; |
88 |
|
|
last; |
89 |
|
|
} |
90 |
|
|
|
91 |
|
|
print "<$pid> Finished.\n"; |
92 |
|
|
$control++; |
93 |
|
|
} |