Merge lp:~percona-toolkit-dev/percona-toolkit/fix-1160338-pqd-tcp-errors into lp:percona-toolkit/2.2

Proposed by Brian Fraser
Status: Merged
Approved by: Daniel Nichter
Approved revision: 572
Merged at revision: 574
Proposed branch: lp:~percona-toolkit-dev/percona-toolkit/fix-1160338-pqd-tcp-errors
Merge into: lp:percona-toolkit/2.2
Diff against target: 307 lines (+105/-20)
4 files modified
bin/pt-query-digest (+27/-12)
bin/pt-upgrade (+18/-4)
lib/ProtocolParser.pm (+11/-2)
t/lib/MySQLProtocolParser.t (+49/-2)
To merge this branch: bzr merge lp:~percona-toolkit-dev/percona-toolkit/fix-1160338-pqd-tcp-errors
Reviewer Review Type Date Requested Status
Daniel Nichter Approve
Review via email: mp+159194@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Daniel Nichter (daniel-nichter) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bin/pt-query-digest'
2--- bin/pt-query-digest 2013-03-20 17:53:36 +0000
3+++ bin/pt-query-digest 2013-04-16 16:28:26 +0000
4@@ -81,6 +81,7 @@
5 # ###########################################################################
6 {
7 package Lmo::Utils;
8+
9 use strict;
10 use warnings qw( FATAL all );
11 require Exporter;
12@@ -88,7 +89,12 @@
13
14 BEGIN {
15 @ISA = qw(Exporter);
16- @EXPORT = @EXPORT_OK = qw(_install_coderef _unimport_coderefs _glob_for _stash_for);
17+ @EXPORT = @EXPORT_OK = qw(
18+ _install_coderef
19+ _unimport_coderefs
20+ _glob_for
21+ _stash_for
22+ );
23 }
24
25 {
26@@ -272,7 +278,6 @@
27 return Lmo::Meta->new(class => $class);
28 }
29
30-
31 1;
32 }
33 # ###########################################################################
34@@ -3789,6 +3794,7 @@
35 sessions => {},
36 o => $args{o},
37 fake_thread_id => 2**32, # see _make_event()
38+ null_event => $args{null_event},
39 };
40 PTDEBUG && $self->{server} && _d('Watching only server', $self->{server});
41 return bless $self, $class;
42@@ -3809,7 +3815,7 @@
43 $server .= ":$self->{port}";
44 if ( $src_host ne $server && $dst_host ne $server ) {
45 PTDEBUG && _d('Packet is not to or from', $server);
46- return;
47+ return $self->{null_event};
48 }
49 }
50
51@@ -3825,7 +3831,7 @@
52 }
53 else {
54 PTDEBUG && _d('Packet is not to or from a MySQL server');
55- return;
56+ return $self->{null_event};
57 }
58 PTDEBUG && _d('Client', $client);
59
60@@ -3843,7 +3849,7 @@
61 else {
62 PTDEBUG && _d('Ignoring mid-stream', $packet_from, 'data,',
63 'packetno', $packetno);
64- return;
65+ return $self->{null_event};
66 }
67
68 $self->{sessions}->{$client} = {
69@@ -3886,7 +3892,7 @@
70 delete $self->{sessions}->{$session->{client}};
71 return $event;
72 }
73- return;
74+ return $self->{null_event};
75 }
76
77 if ( $session->{compress} ) {
78@@ -3912,7 +3918,7 @@
79 PTDEBUG && _d('remove_mysql_header() failed; failing session');
80 $session->{EVAL_ERROR} = $EVAL_ERROR;
81 $self->fail_session($session, 'remove_mysql_header() failed');
82- return;
83+ return $self->{null_event};
84 }
85 }
86
87@@ -3927,7 +3933,7 @@
88 $self->_delete_buff($session);
89 }
90 else {
91- return; # waiting for more data; buff_left was reported earlier
92+ return $self->{null_event}; # waiting for more data; buff_left was reported earlier
93 }
94 }
95 elsif ( $packet->{mysql_data_len} > ($packet->{data_len} - 4) ) {
96@@ -3948,7 +3954,7 @@
97
98 PTDEBUG && _d('Data not complete; expecting',
99 $session->{buff_left}, 'more bytes');
100- return;
101+ return $self->{null_event};
102 }
103
104 if ( $session->{cmd} && ($session->{state} || '') eq 'awaiting_reply' ) {
105@@ -3971,7 +3977,7 @@
106 }
107
108 $args{stats}->{events_parsed}++ if $args{stats};
109- return $event;
110+ return $event || $self->{null_event};
111 }
112
113 sub _packet_from_server {
114@@ -9831,7 +9837,15 @@
115 return $self->{errors_fh} if $self->{errors_fh};
116
117 my $exec = basename($0);
118- my ($errors_fh, $filename) = tempfile("/tmp/$exec-errors.XXXXXXX", UNLINK => 0);
119+ my ($errors_fh, $filename);
120+ if ( $filename = $ENV{PERCONA_TOOLKIT_TCP_ERRORS_FILE} ) {
121+ open $errors_fh, ">", $filename
122+ or die "Cannot open $filename for writing (supplied from "
123+ . "PERCONA_TOOLKIT_TCP_ERRORS_FILE): $OS_ERROR";
124+ }
125+ else {
126+ ($errors_fh, $filename) = tempfile("/tmp/$exec-errors.XXXXXXX", UNLINK => 0);
127+ }
128
129 $self->{errors_file} = $filename;
130 $self->{errors_fh} = $errors_fh;
131@@ -9847,7 +9861,8 @@
132
133 my $errors_fh = $self->_get_errors_fh();
134
135- print "Session $session->{client} had errors, will save them in $self->{errors_file}\n";
136+ warn "TCP session $session->{client} had errors, will save them in $self->{errors_file}\n"
137+ unless $self->{_warned_for}->{$self->{errors_file}}++;
138
139 my $raw_packets = delete $session->{raw_packets};
140 $session->{reason_for_failure} = $reason;
141
142=== modified file 'bin/pt-upgrade'
143--- bin/pt-upgrade 2013-04-04 21:45:50 +0000
144+++ bin/pt-upgrade 2013-04-16 16:28:26 +0000
145@@ -78,6 +78,7 @@
146 # ###########################################################################
147 {
148 package Lmo::Utils;
149+
150 use strict;
151 use warnings qw( FATAL all );
152 require Exporter;
153@@ -85,7 +86,12 @@
154
155 BEGIN {
156 @ISA = qw(Exporter);
157- @EXPORT = @EXPORT_OK = qw(_install_coderef _unimport_coderefs _glob_for _stash_for);
158+ @EXPORT = @EXPORT_OK = qw(
159+ _install_coderef
160+ _unimport_coderefs
161+ _glob_for
162+ _stash_for
163+ );
164 }
165
166 {
167@@ -269,7 +275,6 @@
168 return Lmo::Meta->new(class => $class);
169 }
170
171-
172 1;
173 }
174 # ###########################################################################
175@@ -7309,7 +7314,15 @@
176 return $self->{errors_fh} if $self->{errors_fh};
177
178 my $exec = basename($0);
179- my ($errors_fh, $filename) = tempfile("/tmp/$exec-errors.XXXXXXX", UNLINK => 0);
180+ my ($errors_fh, $filename);
181+ if ( $filename = $ENV{PERCONA_TOOLKIT_TCP_ERRORS_FILE} ) {
182+ open $errors_fh, ">", $filename
183+ or die "Cannot open $filename for writing (supplied from "
184+ . "PERCONA_TOOLKIT_TCP_ERRORS_FILE): $OS_ERROR";
185+ }
186+ else {
187+ ($errors_fh, $filename) = tempfile("/tmp/$exec-errors.XXXXXXX", UNLINK => 0);
188+ }
189
190 $self->{errors_file} = $filename;
191 $self->{errors_fh} = $errors_fh;
192@@ -7325,7 +7338,8 @@
193
194 my $errors_fh = $self->_get_errors_fh();
195
196- print "Session $session->{client} had errors, will save them in $self->{errors_file}\n";
197+ warn "TCP session $session->{client} had errors, will save them in $self->{errors_file}\n"
198+ unless $self->{_warned_for}->{$self->{errors_file}}++;
199
200 my $raw_packets = delete $session->{raw_packets};
201 $session->{reason_for_failure} = $reason;
202
203=== modified file 'lib/ProtocolParser.pm'
204--- lib/ProtocolParser.pm 2013-02-25 18:59:01 +0000
205+++ lib/ProtocolParser.pm 2013-04-16 16:28:26 +0000
206@@ -252,7 +252,15 @@
207
208 my $exec = basename($0);
209 # Errors file isn't open yet; try to open it.
210- my ($errors_fh, $filename) = tempfile("/tmp/$exec-errors.XXXXXXX", UNLINK => 0);
211+ my ($errors_fh, $filename);
212+ if ( $filename = $ENV{PERCONA_TOOLKIT_TCP_ERRORS_FILE} ) {
213+ open $errors_fh, ">", $filename
214+ or die "Cannot open $filename for writing (supplied from "
215+ . "PERCONA_TOOLKIT_TCP_ERRORS_FILE): $OS_ERROR";
216+ }
217+ else {
218+ ($errors_fh, $filename) = tempfile("/tmp/$exec-errors.XXXXXXX", UNLINK => 0);
219+ }
220
221 $self->{errors_file} = $filename;
222 $self->{errors_fh} = $errors_fh;
223@@ -268,7 +276,8 @@
224
225 my $errors_fh = $self->_get_errors_fh();
226
227- print "Session $session->{client} had errors, will save them in $self->{errors_file}\n";
228+ warn "TCP session $session->{client} had errors, will save them in $self->{errors_file}\n"
229+ unless $self->{_warned_for}->{$self->{errors_file}}++;
230
231 my $raw_packets = delete $session->{raw_packets};
232 $session->{reason_for_failure} = $reason;
233
234=== modified file 't/lib/MySQLProtocolParser.t'
235--- t/lib/MySQLProtocolParser.t 2013-03-01 19:35:43 +0000
236+++ t/lib/MySQLProtocolParser.t 2013-04-16 16:28:26 +0000
237@@ -1759,14 +1759,14 @@
238 $protocol->parse_event(%parser_args, event => $p);
239 }
240 close $fh;
241-});
242+}, stderr => 1);
243
244 like(
245 $out,
246 qr/had errors, will save them in /,
247 "Saves errors by default"
248 );
249-
250+
251 close $protocol->{errors_fh}; # flush the handle
252
253 like(
254@@ -1775,6 +1775,53 @@
255 "The right error is saved"
256 );
257
258+$out = output(sub {
259+ open my $fh, "<", "$sample/tcpdump032.txt" or die "Cannot open tcpdump032.txt: $OS_ERROR";
260+ my %parser_args = (
261+ next_event => sub { return <$fh>; },
262+ tell => sub { return tell($fh); },
263+ );
264+ while ( my $p = $tcpdump->parse_event(%parser_args) ) {
265+ $protocol->parse_event(%parser_args, event => $p);
266+ }
267+ close $fh;
268+}, stderr => 1);
269+
270+is(
271+ $out,
272+ '',
273+ "No warnings the second time around"
274+);
275+
276+{
277+$protocol = new MySQLProtocolParser(server=>'127.0.0.1',port=>'3306');
278+# ..but allow setting the filename through an ENV var:
279+local $ENV{PERCONA_TOOLKIT_TCP_ERRORS_FILE} = '/dev/null';
280+
281+$out = output(sub {
282+ open my $fh, "<", "$sample/tcpdump032.txt" or die "Cannot open tcpdump032.txt: $OS_ERROR";
283+ my %parser_args = (
284+ next_event => sub { return <$fh>; },
285+ tell => sub { return tell($fh); },
286+ );
287+ while ( my $p = $tcpdump->parse_event(%parser_args) ) {
288+ $protocol->parse_event(%parser_args, event => $p);
289+ }
290+ close $fh;
291+}, stderr => 1);
292+
293+like(
294+ $out,
295+ qr/had errors, will save them in /,
296+ "Still tries saving the errors with PERCONA_TOOLKIT_TCP_ERRORS_FILE"
297+);
298+
299+is(
300+ $protocol->{errors_file},
301+ '/dev/null',
302+ "...but uses the provided file"
303+);
304+}
305 # #############################################################################
306 # Done.
307 # #############################################################################

Subscribers

People subscribed via source and target branches