]> Sergey Matveev's repositories - public-inbox.git/commitdiff
searchidxskeleton: extra error checking
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>
Wed, 28 Feb 2018 17:37:00 +0000 (17:37 +0000)
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>
Wed, 28 Feb 2018 23:06:20 +0000 (23:06 +0000)
I added these while chasing down the DatabaseCorruptError
exceptions which turned out to be caused by Xapian DB
modifications during iteration.

lib/PublicInbox/SearchIdxSkeleton.pm

index 0016f89a6c59ab081f73e424d0d521ef118af3c5..aa2713f12743b58944badaa003e67b7215430c68 100644 (file)
@@ -42,7 +42,6 @@ sub new {
 sub skeleton_worker_loop {
        my ($self, $r) = @_;
        $0 = 'pi-v2-skeleton';
-       my $msg;
        my $xdb = $self->_xdb_acquire;
        $xdb->begin_transaction;
        my $txn = 1;
@@ -54,9 +53,12 @@ sub skeleton_worker_loop {
                        $self->_xdb_release;
                        $xdb = $txn = undef;
                } else {
-                       read($r, $msg, $line) or die "read failed: $!\n";
+                       my $len = int($line);
+                       my $n = read($r, my $msg, $len) or die "read: $!\n";
+                       $n == $len or die "short read: $n != $len\n";
                        $msg = thaw($msg); # should raise on error
                        defined $msg or die "failed to thaw buffer\n";
+                       $xdb ||= $self->_xdb_acquire;
                        if (!$txn) {
                                $xdb->begin_transaction;
                                $txn = 1;
@@ -65,6 +67,8 @@ sub skeleton_worker_loop {
                        warn "failed to index message <$msg->[-1]>: $@\n" if $@;
                }
        }
+       die "xdb not released\n" if $xdb;
+       die "in transaction\n" if $txn;
 }
 
 # called by a partition worker