]> Sergey Matveev's repositories - public-inbox.git/commitdiff
ds: workaround a memory leak in Perl 5.16.x
authorEric Wong <e@80x24.org>
Thu, 26 Sep 2019 01:50:37 +0000 (01:50 +0000)
committerEric Wong <e@80x24.org>
Thu, 26 Sep 2019 01:51:46 +0000 (01:51 +0000)
The perl-5.16.3-294.el7_6 RPM package on RHEL/CentOS 7 is
affected by a memory leak in Perl when calling `ref' on
blessed references.  This resulted in a very slow leak that
manifests more quickly with a nonstop "git fetch" loop.

Use Scalar::Util::blessed to work around the issue.
Tested overnight on a CentOS 7 VM.

cf. https://rt.perl.org/Public/Bug/Display.html?id=114340

lib/PublicInbox/DS.pm

index 30a9641ac6b08c3a051ec93af44300ddee959ac0..7f7cb85d8583cd69c509f7a7ca2280dcd01e156e 100644 (file)
@@ -24,6 +24,7 @@ use parent qw(Exporter);
 our @EXPORT_OK = qw(now msg_more);
 use warnings;
 use 5.010_001;
+use Scalar::Util qw(blessed);
 
 use PublicInbox::Syscall qw(:epoll);
 use PublicInbox::Tmpfile;
@@ -178,10 +179,12 @@ sub next_tick () {
     my $q = $nextq;
     $nextq = [];
     for (@$q) {
-        if (ref($_) eq 'CODE') {
-            $_->();
-        } else {
+        # we avoid "ref" on blessed refs to workaround a Perl 5.16.3 leak:
+        # https://rt.perl.org/Public/Bug/Display.html?id=114340
+        if (blessed($_)) {
             $_->event_step;
+        } else {
+            $_->();
         }
     }
 }