pqs: Removed tcpdump-errors, made the library always save the errors in a tempfile

This commit is contained in:
Brian Fraser
2013-02-25 15:59:01 -03:00
parent 1d9b013bab
commit 4b860cbd7b
5 changed files with 66 additions and 105 deletions

View File

@@ -51,19 +51,7 @@ $Data::Dumper::Indent = 1;
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Quotekeys = 0;
require Exporter;
our @ISA = qw(Exporter);
our %EXPORT_TAGS = ();
our @EXPORT = ();
our @EXPORT_OK = qw(
parse_error_packet
parse_ok_packet
parse_ok_prepared_statement_packet
parse_server_handshake_packet
parse_client_handshake_packet
parse_com_packet
parse_flags
);
use base 'ProtocolParser';
use constant {
COM_SLEEP => '00',
@@ -1526,46 +1514,6 @@ sub remove_mysql_header {
return;
}
sub _get_errors_fh {
my ( $self ) = @_;
my $errors_fh = $self->{errors_fh};
return $errors_fh if $errors_fh;
# Errors file isn't open yet; try to open it.
my $o = $self->{o};
if ( $o && $o->has('tcpdump-errors') && $o->got('tcpdump-errors') ) {
my $errors_file = $o->get('tcpdump-errors');
PTDEBUG && _d('tcpdump-errors file:', $errors_file);
open $errors_fh, '>>', $errors_file
or die "Cannot open tcpdump-errors file $errors_file: $OS_ERROR";
}
$self->{errors_fh} = $errors_fh;
return $errors_fh;
}
sub fail_session {
my ( $self, $session, $reason ) = @_;
PTDEBUG && _d('Client', $session->{client}, 'failed because', $reason);
my $errors_fh = $self->_get_errors_fh();
if ( $errors_fh ) {
my $raw_packets = $session->{raw_packets};
delete $session->{raw_packets}; # Don't dump, it's printed below.
$session->{reason_for_failure} = $reason;
my $session_dump = '# ' . Dumper($session);
chomp $session_dump;
$session_dump =~ s/\n/\n# /g;
print $errors_fh "$session_dump\n";
{
local $LIST_SEPARATOR = "\n";
print $errors_fh "@$raw_packets";
print $errors_fh "\n";
}
}
delete $self->{sessions}->{$session->{client}};
return;
}
# Delete anything we added to the session related to
# buffering a large query received in multiple packets.
sub _delete_buff {

View File

@@ -448,6 +448,7 @@ sub test_protocol_parser {
keys %args;
my $file = "$trunk/$args{file}";
my ($base_file_name) = $args{file} =~ m/([^\/]+)$/;
my @e;
eval {
open my $fh, "<", $file or die "Cannot open $file: $OS_ERROR";
@@ -463,11 +464,10 @@ sub test_protocol_parser {
close $fh;
};
my ($base_file_name) = $args{file} =~ m/([^\/]+)$/;
is(
$EVAL_ERROR,
'',
"$base_file_name: no errors"
"$base_file_name: no perl errors"
);
if ( defined $args{result} ) {

View File

@@ -27,6 +27,9 @@ use warnings FATAL => 'all';
use English qw(-no_match_vars);
use constant PTDEBUG => $ENV{PTDEBUG} || 0;
use File::Basename qw(basename);
use File::Temp qw(tempfile);
eval {
require IO::Uncompress::Inflate; # yum: perl-IO-Compress-Zlib
IO::Uncompress::Inflate->import(qw(inflate $InflateError));
@@ -245,39 +248,34 @@ sub make_event {
sub _get_errors_fh {
my ( $self ) = @_;
my $errors_fh = $self->{errors_fh};
return $errors_fh if $errors_fh;
return $self->{errors_fh} if $self->{errors_fh};
my $exec = basename($0);
# Errors file isn't open yet; try to open it.
my $o = $self->{o};
if ( $o && $o->has('tcpdump-errors') && $o->got('tcpdump-errors') ) {
my $errors_file = $o->get('tcpdump-errors');
PTDEBUG && _d('tcpdump-errors file:', $errors_file);
open $errors_fh, '>>', $errors_file
or die "Cannot open tcpdump-errors file $errors_file: $OS_ERROR";
}
my ($errors_fh, $filename) = tempfile("/tmp/$exec-errors.XXXXXXX", UNLINK => 0);
$self->{errors_fh} = $errors_fh;
$self->{errors_file} = $filename;
$self->{errors_fh} = $errors_fh;
return $errors_fh;
}
sub fail_session {
my ( $self, $session, $reason ) = @_;
my $errors_fh = $self->_get_errors_fh();
if ( $errors_fh ) {
$session->{reason_for_failure} = $reason;
my $session_dump = '# ' . Dumper($session);
chomp $session_dump;
$session_dump =~ s/\n/\n# /g;
print $errors_fh "$session_dump\n";
{
local $LIST_SEPARATOR = "\n";
print $errors_fh "@{$session->{raw_packets}}";
print $errors_fh "\n";
}
}
PTDEBUG && _d('Failed session', $session->{client}, 'because', $reason);
delete $self->{sessions}->{$session->{client}};
return if $self->{_no_save_error};
my $errors_fh = $self->_get_errors_fh();
print "Session $session->{client} had errors, will save them in $self->{errors_file}\n";
my $raw_packets = delete $session->{raw_packets};
$session->{reason_for_failure} = $reason;
my $session_dump = '# ' . Dumper($session);
chomp $session_dump;
$session_dump =~ s/\n/\n# /g;
print $errors_fh join("\n", $session_dump, @$raw_packets), "\n";
return;
}