CHUNK_MAX_HDR => 256,
};
-# FIXME: duplicated code with NNTP.pm, layering violation
-my $WEAKEN = {}; # string(inbox) -> inbox
-my $weakt;
-sub weaken_task () {
- $weakt = undef;
- $_->weaken_all for values %$WEAKEN;
- $WEAKEN = {};
-}
-
my $pipelineq = [];
my $pipet;
sub process_pipelineq () {
$self->{env} = undef;
$self->write("0\r\n\r\n") if $alive == 2;
$self->write(sub { $alive ? next_request($self) : $self->close });
-
- # FIXME: layering violation
- if (my $obj = $env->{'pi-httpd.inbox'}) {
- # grace period for reaping resources
- $WEAKEN->{"$obj"} = $obj;
- PublicInbox::EvCleanup::later(*weaken_task);
- }
}
sub getline_response {
use PublicInbox::Git;
use PublicInbox::MID qw(mid2path);
+my $weakt;
+eval {
+ $weakt = 'disabled';
+ require PublicInbox::EvCleanup;
+ $weakt = undef; # OK if we get here
+};
+
+my $WEAKEN = {}; # string(inbox) -> inbox
+sub weaken_task () {
+ $weakt = undef;
+ _weaken_fields($_) for values %$WEAKEN;
+ $WEAKEN = {};
+}
+
+sub _weaken_later ($) {
+ my ($self) = @_;
+ $weakt ||= PublicInbox::EvCleanup::later(*weaken_task);
+ $WEAKEN->{"$self"} = $self;
+}
+
sub new {
my ($class, $opts) = @_;
my $v = $opts->{address} ||= 'public-inbox@example.com';
bless $opts, $class;
}
-sub weaken_all {
+sub _weaken_fields {
my ($self) = @_;
foreach my $f (qw(git mm search)) {
isweak($self->{$f}) or weaken($self->{$f});
sub git {
my ($self) = @_;
- $self->{git} ||= eval { PublicInbox::Git->new($self->{mainrepo}) };
+ $self->{git} ||= eval {
+ _weaken_later($self);
+ PublicInbox::Git->new($self->{mainrepo});
+ };
}
sub mm {
my ($self) = @_;
- $self->{mm} ||= eval { PublicInbox::Msgmap->new($self->{mainrepo}) };
+ $self->{mm} ||= eval {
+ _weaken_later($self);
+ PublicInbox::Msgmap->new($self->{mainrepo});
+ };
}
sub search {
my ($self) = @_;
- $self->{search} ||= eval { PublicInbox::Search->new($self->{mainrepo}) };
+ $self->{search} ||= eval {
+ _weaken_later($self);
+ PublicInbox::Search->new($self->{mainrepo});
+ };
}
sub try_cat {
my $EXPMAP; # fd -> [ idle_time, $self ]
my $expt;
our $EXPTIME = 180; # 3 minutes
-my $WEAKEN = {}; # string(nntpd) -> nntpd
-my $weakt;
my $nextt;
my $nextq = [];
defined $fd and $EXPMAP->{$fd} = [ now(), $self ];
}
-# reduce FD pressure by closing some "git cat-file --batch" processes
-# and unused FDs for msgmap and Xapian indices
-sub weaken_groups () {
- $weakt = undef;
- foreach my $nntpd (values %$WEAKEN) {
- $_->weaken_all foreach (@{$nntpd->{grouplist}});
- }
- $WEAKEN = {};
-}
-
sub expire_old () {
my $now = now();
my $exp = $EXPTIME;
$EXPMAP = \%new;
if ($nr) {
$expt = PublicInbox::EvCleanup::later(*expire_old);
- weaken_groups();
} else {
$expt = undef;
# noop to kick outselves out of the loop ASAP so descriptors
# really get closed
PublicInbox::EvCleanup::asap(sub {});
-
- # grace period for reaping resources
- $weakt ||= PublicInbox::EvCleanup::later(*weaken_groups);
}
}
$self->{rbuf} = '';
$self->watch_read(1);
update_idle_time($self);
- $WEAKEN->{"$nntpd"} = $nntpd;
$expt ||= PublicInbox::EvCleanup::later(*expire_old);
$self;
}
if (defined $obj) {
$ctx->{git_dir} = $obj->{mainrepo};
$ctx->{git} = $obj->git;
- # for PublicInbox::HTTP::weaken_task:
- $ctx->{env}->{'pi-httpd.inbox'} = $obj;
$ctx->{-inbox} = $obj;
$ctx->{inbox} = $inbox;
return;