use PublicInbox::Msgmap;
use PublicInbox::Git;
use PublicInbox::MID qw(mid2path);
+require PublicInbox::EvCleanup;
use Email::Simple;
-use Data::Dumper qw(Dumper);
use POSIX qw(strftime);
use Time::HiRes qw(clock_gettime CLOCK_MONOTONIC);
use URI::Escape qw(uri_escape_utf8);
my %DISABLED; # = map { $_ => 1 } qw(xover list_overview_fmt newnews xhdr);
my $EXPMAP; # fd -> [ idle_time, $self ]
-my $EXPTIMER;
+my $expt;
our $EXPTIME = 180; # 3 minutes
my $WEAKEN = {}; # string(nntpd) -> nntpd
-my $WEAKTIMER;
+my $weakt;
+my $nextt;
-my $next_tick;
my $nextq = [];
sub next_tick () {
- $next_tick = undef;
+ $nextt = undef;
my $q = $nextq;
$nextq = [];
foreach my $nntp (@$q) {
# reduce FD pressure by closing some "git cat-file --batch" processes
# and unused FDs for msgmap and Xapian indices
sub weaken_groups () {
- $WEAKTIMER = undef;
+ $weakt = undef;
foreach my $nntpd (values %$WEAKEN) {
$_->weaken_all foreach (@{$nntpd->{grouplist}});
}
my $now = now();
my $exp = $EXPTIME;
my $old = $now - $exp;
- my $next = $now + $exp;
my $nr = 0;
my %new;
while (my ($fd, $v) = each %$EXPMAP) {
if ($idle_time < $old) {
$nntp->close; # idempotent
} else {
- my $nexp = $idle_time + $exp;
- $next = $nexp if ($nexp < $next);
++$nr;
$new{$fd} = $v;
}
}
$EXPMAP = \%new;
if ($nr) {
- $next -= $now;
- $next = 0 if $next < 0;
- $EXPTIMER = Danga::Socket->AddTimer($next, *expire_old);
+ $expt = PublicInbox::EvCleanup::later(*expire_old);
weaken_groups();
} else {
- $EXPTIMER = undef;
+ $expt = undef;
# noop to kick outselves out of the loop ASAP so descriptors
# really get closed
- Danga::Socket->AddTimer(0, sub {});
+ PublicInbox::EvCleanup::asap(sub {});
# grace period for reaping resources
- $WEAKTIMER ||= Danga::Socket->AddTimer(30, *weaken_groups);
+ $weakt ||= PublicInbox::EvCleanup::later(*weaken_groups);
}
}
$self->watch_read(1);
update_idle_time($self);
$WEAKEN->{"$nntpd"} = $nntpd;
- $EXPTIMER ||= Danga::Socket->AddTimer($EXPTIME, *expire_old);
+ $expt ||= PublicInbox::EvCleanup::later(*expire_old);
$self;
}
my $res = eval { $req->($self, @args) };
my $err = $@;
if ($err && !$self->{closed}) {
- chomp($l = Dumper(\$l));
+ chomp($l);
err($self, 'error from: %s (%s)', $l, $err);
$res = '503 program fault - command not performed';
}
foreach my $ng (@{$self->{nntpd}->{grouplist}}) {
$ng->{newsgroup} =~ $wildmat or next;
my $c = eval { $ng->mm->created_at } || time;
- more($self, "$ng->{newsgroup} $c $ng->{address}");
+ more($self, "$ng->{newsgroup} $c $ng->{-primary_address}");
}
}
sub cmd_post ($) {
my ($self) = @_;
my $ng = $self->{ng};
- $ng ? "440 mailto:$ng->{address} to post" : '440 posting not allowed'
+ $ng ? "440 mailto:$ng->{-primary_address} to post"
+ : '440 posting not allowed'
}
sub cmd_quit ($) {
# clobber some
$hdr->header_set('Newsgroups', $ng->{newsgroup});
$hdr->header_set('Xref', xref($ng, $n));
- header_append($hdr, 'List-Post', "<mailto:$ng->{address}>");
- if (my $url = $ng->{url}) {
+ header_append($hdr, 'List-Post', "<mailto:$ng->{-primary_address}>");
+ if (my $url = $ng->base_url) {
$mid = uri_escape_utf8($mid);
header_append($hdr, 'Archived-At', "<$url$mid/>");
header_append($hdr, 'List-Archive', "<$url>");
update_idle_time($self);
push @$nextq, $self;
- $next_tick ||= Danga::Socket->AddTimer(0, *next_tick);
+ $nextt ||= PublicInbox::EvCleanup::asap(*next_tick);
} else { # all done!
$self->{long_res} = undef;
$self->watch_read(1);
$self->{rbuf} .= $$buf;
while ($r > 0 && $self->{rbuf} =~ s/\A\s*([^\r\n]+)\r?\n//) {
my $line = $1;
+ return $self->close if $line =~ /[[:cntrl:]]/s;
my $t0 = now();
my $fd = $self->{fd};
$r = eval { process_line($self, $line) };
# in case we really did dispatch a read event and started
# another long response.
push @$nextq, $self;
- $next_tick ||= Danga::Socket->AddTimer(0, *next_tick);
+ $nextt ||= PublicInbox::EvCleanup::asap(*next_tick);
}
$rv;
}