X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FPOP3D.pm;h=7432a9640c89a20a0e818a9c7262d7ca7bda80f9;hb=cab36ebd00ca72f87ff3a233ccec77aef948c926;hp=0609627e030ca2109ed8593fb3c36cce0fd501d4;hpb=f0b735529e3083e222f3edd6644cd927ad35bb39;p=public-inbox.git diff --git a/lib/PublicInbox/POP3D.pm b/lib/PublicInbox/POP3D.pm index 0609627e..7432a964 100644 --- a/lib/PublicInbox/POP3D.pm +++ b/lib/PublicInbox/POP3D.pm @@ -1,7 +1,7 @@ # Copyright (C) all contributors # License: AGPL-3.0+ -# represents an POP3D (currently a singleton) +# represents an POP3D package PublicInbox::POP3D; use v5.12; use parent qw(PublicInbox::Lock); @@ -37,23 +37,15 @@ if ($^O eq 'linux' || $^O eq 'freebsd') { die "File::FcntlLock required for POP3 on $^O: $@\n"; sub new { - my ($cls, $pi_cfg) = @_; - $pi_cfg //= PublicInbox::Config->new; - my $d = $pi_cfg->{'publicinbox.pop3state'} // - die "publicinbox.pop3state undefined\n"; - -d $d or do { - require File::Path; - File::Path::make_path($d, { mode => 0700 }); - PublicInbox::Syscall::nodatacow_dir($d); - }; + my ($cls) = @_; bless { err => \*STDERR, out => \*STDOUT, - pi_cfg => $pi_cfg, - lock_path => "$d/db.lock", # PublicInbox::Lock to protect SQLite + # pi_cfg => PublicInbox::Config + # lock_path => ... # interprocess lock is the $pop3state/txn.locks file # txn_locks => {}, # intraworker locks - # accept_tls => { SSL_server => 1, ..., SSL_reuse_ctx => ... } + # ssl_ctx_opt => { SSL_cert_file => ..., SSL_key_file => ... } }, $cls; } @@ -61,16 +53,22 @@ sub refresh_groups { # PublicInbox::Daemon callback my ($self, $sig) = @_; # TODO share pi_cfg with nntpd/imapd inside -netd my $new = PublicInbox::Config->new; - my $old = $self->{pi_cfg}; - my $s = 'publicinbox.pop3state'; - $new->{$s} //= $old->{$s}; - if ($new->{$s} ne $old->{$s}) { - warn <{'publicinbox.pop3state'} // + die "publicinbox.pop3state undefined ($new->{-f})\n"; + -d $d or do { + require File::Path; + File::Path::make_path($d, { mode => 0700 }); + PublicInbox::Syscall::nodatacow_dir($d); + }; + $self->{lock_path} //= "$d/db.lock"; + if (my $old = $self->{pi_cfg}) { + my $s = 'publicinbox.pop3state'; + $new->{$s} //= $old->{$s}; + return warn <{$s} ne $old->{$s}; $s changed: `$old->{$s}' => `$new->{$s}', config reload ignored EOM - } else { - $self->{pi_cfg} = $new; } + $self->{pi_cfg} = $new; } # persistent tables @@ -247,6 +245,12 @@ SELECT txn_id,uid_dele FROM deletes WHERE user_id = ? AND mailbox_id = ? sub unlock_mailbox { my ($self, $pop3) = @_; my $txn_id = delete($pop3->{txn_id}) // return; + if (!$pop3->{did_quit}) { # deal with QUIT-less disconnects + my $lk = $self->lock_for_scope; + $self->{-state_dbh}->begin_work; + $pop3->__cleanup_state($txn_id); + $self->{-state_dbh}->commit; + } delete $self->{txn_locks}->{$txn_id}; # same worker # other workers