# an estimate of the post-packed size to the raw uncompressed size
my $PACKING_FACTOR = 0.4;
-# assume 2 cores if GNU nproc(1) is not available
+# SATA storage lags behind what CPUs are capable of, so relying on
+# nproc(1) can be misleading and having extra Xapian partions is a
+# waste of FDs and space. It can also lead to excessive IO latency
+# and slow things down. Users on NVME or other fast storage can
+# use the NPROC env or switches in our script/public-inbox-* programs
+# to increase Xapian partitions.
+our $NPROC_MAX_DEFAULT = 4;
+
sub nproc_parts ($) {
my ($creat_opt) = @_;
if (ref($creat_opt) eq 'HASH') {
}
}
- my $n = int($ENV{NPROC} || `nproc 2>/dev/null` || 2);
+ my $n = $ENV{NPROC};
+ if (!$n) {
+ chomp($n = `nproc 2>/dev/null`);
+ # assume 2 cores if GNU nproc(1) is not available
+ $n = 2 if !$n;
+ $n = $NPROC_MAX_DEFAULT if $n > $NPROC_MAX_DEFAULT;
+ }
+
# subtract for the main process and git-fast-import
$n -= 1;
$n < 1 ? 1 : $n;
}
-sub count_partitions ($) {
+sub count_shards ($) {
my ($self) = @_;
my $nparts = 0;
my $xpfx = $self->{xpfx};
# always load existing partitions in case core count changes:
- # Also, partition count may change while -watch is running
- # due to -compact
+ # Also, shard count may change while -watch is running
+ # due to "xcpdb --reshard"
if (-d $xpfx) {
foreach my $part (<$xpfx/*>) {
-d $part && $part =~ m!/[0-9]+\z! or next;
rotate_bytes => int((1024 * 1024 * 1024) / $PACKING_FACTOR),
last_commit => [], # git repo -> commit
};
- $self->{partitions} = count_partitions($self) || nproc_parts($creat);
+ $self->{shards} = count_shards($self) || nproc_parts($creat);
bless $self, $class;
}
sub do_idx ($$$$$$$) {
my ($self, $msgref, $mime, $len, $num, $oid, $mid0) = @_;
$self->{over}->add_overview($mime, $len, $num, $oid, $mid0);
- my $npart = $self->{partitions};
+ my $npart = $self->{shards};
my $part = $num % $npart;
my $idx = idx_part($self, $part);
$idx->index_raw($len, $msgref, $num, $oid, $mid0, $mime);
$self->lock_acquire unless ($opt && $opt->{-skip_lock});
$over->create;
- # -compact can change partition count while -watch is idle
- my $nparts = count_partitions($self);
- if ($nparts && $nparts != $self->{partitions}) {
- $self->{partitions} = $nparts;
+ # xcpdb can change shard count while -watch is idle
+ my $nparts = count_shards($self);
+ if ($nparts && $nparts != $self->{shards}) {
+ $self->{shards} = $nparts;
}
# need to create all parts before initializing msgmap FD
- my $max = $self->{partitions} - 1;
+ my $max = $self->{shards} - 1;
# idx_parts must be visible to all forked processes
my $idx = $self->{idx_parts} = [];