Skip to content

Instantly share code, notes, and snippets.

@athomason
Created May 22, 2011 20:38
Show Gist options
  • Save athomason/985867 to your computer and use it in GitHub Desktop.
Save athomason/985867 to your computer and use it in GitHub Desktop.
AnyEvent::Gearman::Client memory leak, object edition
use strict;
use warnings;
use AnyEvent;
use AnyEvent::Gearman::Client;
use Devel::Cycle;
use Data::Dumper;
use Devel::Events::Handler::ObjectTracker;
use Devel::Events::Filter::RemoveFields;
use Devel::Events::Generator::Objects;
my $tracker = Devel::Events::Handler::ObjectTracker->new();
my $gen = Devel::Events::Generator::Objects->new(
handler => Devel::Events::Filter::RemoveFields->new(
fields => [qw/generator/], # don't need to have a ref to $gen in each event
handler => $tracker,
),
);
$gen->enable(); # start generating events
leak();
$gen->disable();
my @leaked_objects = keys %{ $tracker->live_objects };
print "leaked ", scalar(@leaked_objects), " objects\n";
foreach my $object ( @leaked_objects ) {
print "Leaked object: $object\n";
# the event that generated it
print Dumper( $object, $tracker->live_objects->{$object} );
find_cycle( $object );
}
my $client;
my $cv;
my $done;
sub leak {
$client = AnyEvent::Gearman::Client->new(job_servers => ['127.0.0.1:7003']);
$cv = AnyEvent->condvar;
$done = 0;
sub done {
$cv->send if ++$done > 10000;
new();
}
sub new {
$client->add_task(
test => 1 =>
on_complete => \&done,
on_error => \&done,
);
}
report();
new();
END { report() }
$cv->recv;
undef $cv;
}
sub report {
open my $stat_fh, '<', '/proc/self/status';
print "$1KB\n" if join('', <$stat_fh>) =~ /VmSize:\s+(\d+)\s+kB/;
}
66976KB
leaked 0 objects
123364KB
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment