]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/V2Writable.pm
improve error handling on import fork / lock failures
[public-inbox.git] / lib / PublicInbox / V2Writable.pm
index 6908bd2eea80dc9317031ad83b8d264658c2894f..e1c9a393a36f0fa12b3a04e804984f6981c03223 100644 (file)
@@ -660,21 +660,35 @@ sub barrier { checkpoint($_[0], 1) };
 # public
 sub done {
        my ($self) = @_;
-       my $im = delete $self->{im};
-       $im->done if $im; # PublicInbox::Import::done
-       checkpoint($self);
-       my $mm = delete $self->{mm};
-       $mm->{dbh}->commit if $mm;
+       my $err = '';
+       if (my $im = delete $self->{im}) {
+               eval { $im->done }; # PublicInbox::Import::done
+               $err .= "import done: $@\n" if $@;
+       }
+       if (!$err) {
+               eval { checkpoint($self) };
+               $err .= "checkpoint: $@\n" if $@;
+       }
+       if (my $mm = delete $self->{mm}) {
+               my $m = $err ? 'rollback' : 'commit';
+               eval { $mm->{dbh}->$m };
+               $err .= "msgmap $m: $@\n" if $@;
+       }
        my $shards = delete $self->{idx_shards};
        if ($shards) {
-               $_->remote_close for @$shards;
+               for (@$shards) {
+                       eval { $_->remote_close };
+                       $err .= "shard close: $@\n" if $@;
+               }
        }
-       $self->{over}->disconnect;
+       eval { $self->{over}->disconnect };
+       $err .= "over disconnect: $@\n" if $@;
        delete $self->{bnote};
        my $nbytes = $self->{total_bytes};
        $self->{total_bytes} = 0;
        $self->lock_release(!!$nbytes) if $shards;
        $self->{ibx}->git->cleanup;
+       die $err if $err;
 }
 
 sub fill_alternates ($$) {
@@ -1225,7 +1239,8 @@ sub index_sync {
                # only for batch performance.
                $self->{mm}->{dbh}->rollback;
                $self->{mm}->{dbh}->begin_work;
-               $sync->{mm_tmp} = $self->{mm}->tmp_clone;
+               $sync->{mm_tmp} =
+                       $self->{mm}->tmp_clone($self->{ibx}->{inboxdir});
        }
        if ($sync->{index_max_size} = $self->{ibx}->{index_max_size}) {
                $sync->{index_oid} = \&index_oid;