+
+ my ($cur) = $self->{oidx}->dbh->selectrow_array(<<EOM);
+SELECT MIN(num) FROM over
+EOM
+ my ($max) = $self->{oidx}->dbh->selectrow_array(<<EOM);
+SELECT MAX(num) FROM over
+EOM
+ my $exists;
+restart:
+ $exists = $self->{oidx}->dbh->prepare(<<EOM);
+SELECT COUNT(num) FROM over WHERE num = ?
+EOM
+ for (; $cur <= $max; $cur++) {
+ $exists->execute($cur);
+ next if $exists->fetchrow_array != 0;
+ $self->idx_shard($cur)->ipc_do('xdb_remove_quiet', $cur);
+ if (checkpoint_due($sync)) {
+ $exists = undef;
+ reindex_checkpoint($self, $sync);
+ goto restart;
+ }
+ }
+}
+
+sub eidx_gc {
+ my ($self, $opt) = @_;
+ $self->{cfg} or die "E: GC requires ->attach_config\n";
+ $opt->{-idx_gc} = 1;
+ my $sync = {
+ need_checkpoint => \(my $need_checkpoint = 0),
+ check_intvl => 10,
+ next_check => now() + 10,
+ checkpoint_unlocks => 1,
+ -opt => $opt,
+ };
+ $self->idx_init($opt); # acquire lock via V2Writable::_idx_init
+ eidx_gc_scan_inboxes($self, $sync);
+ eidx_gc_scan_shards($self, $sync);