summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
fd261b9)
We can calculate the total size of the mailbox while generating
the cache, which allows us to iterate the cache again to
calculate the size of the mailbox slice. While we're in the
area, simplify the loop and avoid needlessly updating the `$beg'
variable.
This adds a small amount of constant time overhead to DELE,
however that is amortized across multiple requests for fairness.
ORDER BY num ASC
$sth->execute($beg, $end);
ORDER BY num ASC
$sth->execute($beg, $end);
- do {
- $m = $sth->fetchall_arrayref({}, 1000);
+ my $tot = 0;
+ while (defined($m = $sth->fetchall_arrayref({}, 1000))) {
for my $x (@$m) {
PublicInbox::Over::load_from_row($x);
push(@cache, $x->{num}, $x->{bytes} + 0, $x->{blob});
undef $x; # saves ~1.5M memory w/ 50k messages
for my $x (@$m) {
PublicInbox::Over::load_from_row($x);
push(@cache, $x->{num}, $x->{bytes} + 0, $x->{blob});
undef $x; # saves ~1.5M memory w/ 50k messages
- } while (scalar(@$m) && ($beg = $cache[-3] + 1));
- \@cache;
+ }
+ $self->{total_bytes} = $tot;
+ $self->{cache} = \@cache;
}
sub cmd_stat {
my ($self) = @_;
my $err; $err = need_txn($self) and return $err;
}
sub cmd_stat {
my ($self) = @_;
my $err; $err = need_txn($self) and return $err;
- my $cache = $self->{cache} //= _stat_cache($self);
- my $tot = 0;
- for (my $i = 1; $i < scalar(@$cache); $i += 3) { $tot += $cache->[$i] }
+ my $cache = $self->{cache} // _stat_cache($self);
my $nr = @$cache / 3 - ($self->{nr_dele} // 0);
my $nr = @$cache / 3 - ($self->{nr_dele} // 0);
+ "+OK $nr $self->{total_bytes}\r\n";
}
# for LIST and UIDL
sub _list {
my ($desc, $idx, $self, $msn) = @_;
my $err; $err = need_txn($self) and return $err;
}
# for LIST and UIDL
sub _list {
my ($desc, $idx, $self, $msn) = @_;
my $err; $err = need_txn($self) and return $err;
- my $cache = $self->{cache} //= _stat_cache($self);
+ my $cache = $self->{cache} // _stat_cache($self);
if (defined $msn) {
my $base_off = ($msn - 1) * 3;
my $val = $cache->[$base_off + $idx] //
if (defined $msn) {
my $base_off = ($msn - 1) * 3;
my $val = $cache->[$base_off + $idx] //
my $old = $self->{txn_max_uid} //= $uid;
$self->{txn_max_uid} = $uid if $uid > $old;
my $old = $self->{txn_max_uid} //= $uid;
$self->{txn_max_uid} = $uid if $uid > $old;
+ $self->{total_bytes} -= $cache->[$base_off + 1];
$cache->[$base_off] = undef; # clobber UID
$cache->[$base_off] = undef; # clobber UID
- $cache->[$base_off + 1] = 0; # zero bytes (simplifies cmd_stat)
+ $cache->[$base_off + 1] = undef; # clobber bytes
$cache->[$base_off + 2] = undef; # clobber oidhex
++$self->{nr_dele};
}
$cache->[$base_off + 2] = undef; # clobber oidhex
++$self->{nr_dele};
}
return \"-ERR lines must be a non-negative number\r\n" if
(defined($top_nr) && $top_nr !~ /\A[0-9]+\z/);
my $err; $err = need_txn($self) and return $err;
return \"-ERR lines must be a non-negative number\r\n" if
(defined($top_nr) && $top_nr !~ /\A[0-9]+\z/);
my $err; $err = need_txn($self) and return $err;
- my $cache = $self->{cache} //= _stat_cache($self);
+ my $cache = $self->{cache} // _stat_cache($self);
my $off = $msn - 1;
my $hex = $cache->[$off * 3 + 2] // return \"-ERR no such message\r\n";
${ibx_async_cat($self->{ibx}, $hex, \&retr_cb,
my $off = $msn - 1;
my $hex = $cache->[$off * 3 + 2] // return \"-ERR no such message\r\n";
${ibx_async_cat($self->{ibx}, $hex, \&retr_cb,
sub cmd_dele {
my ($self, $msn) = @_;
my $err; $err = need_txn($self) and return $err;
sub cmd_dele {
my ($self, $msn) = @_;
my $err; $err = need_txn($self) and return $err;
- $self->{cache} //= _stat_cache($self);
+ $self->{cache} // _stat_cache($self);
$msn =~ /\A[1-9][0-9]*\z/ or return \"-ERR no such message\r\n";
mark_dele($self, $msn - 1) ? \"+OK\r\n" : \"-ERR no such message\r\n";
}
$msn =~ /\A[1-9][0-9]*\z/ or return \"-ERR no such message\r\n";
mark_dele($self, $msn - 1) ? \"+OK\r\n" : \"-ERR no such message\r\n";
}