diff options
author | Eric Wong <e@80x24.org> | 2015-09-02 02:37:17 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2015-09-02 06:50:14 +0000 |
commit | e5f6e07f935e6f81469415d21c0189cd60040247 (patch) | |
tree | ce89972720b7a84186425834d953535a248ae165 | |
parent | 36a3b8be4c1dbd8d4c94ac1b3b22165054f9fb14 (diff) | |
download | public-inbox-e5f6e07f935e6f81469415d21c0189cd60040247.tar.gz |
It's possible that the Xapian index and git HEAD can be out-of-sync and a message which existed when we did the search is no longer accessible by the time we get to rendering it.
-rw-r--r-- | lib/PublicInbox/View.pm | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index 6aa199e6..1eb12a92 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -144,7 +144,7 @@ sub emit_thread_html { my $msgs = load_results($res); my $nr = scalar @$msgs; return missing_thread($cb) if $nr == 0; - my $fh = $cb->([200,['Content-Type'=>'text/html; charset=UTF-8']]); + my $orig_cb = $cb; my $th = thread_results($msgs); my $state = { ctx => $ctx, @@ -155,18 +155,23 @@ sub emit_thread_html { { require PublicInbox::GitCatFile; my $git = PublicInbox::GitCatFile->new($ctx->{git_dir}); - thread_entry($fh, $git, $state, $_, 0) for $th->rootset; + thread_entry(\$cb, $git, $state, $_, 0) for $th->rootset; } Email::Address->purge_cache; + + # there could be a race due to a message being deleted in git + # but still being in the Xapian index: + return missing_thread($cb) if ($orig_cb eq $cb); + my $final_anchor = $state->{anchor_idx}; my $next = "<a\nid=\"s$final_anchor\">"; $next .= $final_anchor == 1 ? 'only message in' : 'end of'; $next .= " thread</a>, back to <a\nhref=\"../../\">index</a>\n"; $next .= "download thread: <a\nhref=\"../t.mbox.gz\">mbox.gz</a>"; $next .= " / follow: <a\nhref=\"../t.atom\">Atom feed</a>\n\n"; - $fh->write("<hr />" . PRE_WRAP . $next . $foot . + $cb->write("<hr />" . PRE_WRAP . $next . $foot . "</pre></body></html>"); - $fh->close; + $cb->close; } sub index_walk { @@ -536,14 +541,16 @@ sub anchor_for { } sub thread_html_head { - my ($mime) = @_; + my ($cb, $mime) = @_; + $$cb = $$cb->([200, ['Content-Type'=> 'text/html; charset=UTF-8']]); + my $s = PublicInbox::Hval->new_oneline($mime->header('Subject')); $s = $s->as_html; - "<html><head><title>$s</title></head><body>"; + $$cb->write("<html><head><title>$s</title></head><body>"); } sub thread_entry { - my ($fh, $git, $state, $node, $level) = @_; + my ($cb, $git, $state, $node, $level) = @_; return unless $node; if (my $mime = $node->message) { @@ -552,13 +559,13 @@ sub thread_entry { $mime = eval { Email::MIME->new($git->cat_file("HEAD:$path")) }; if ($mime) { if ($state->{anchor_idx} == 0) { - $fh->write(thread_html_head($mime)); + thread_html_head($cb, $mime); } - index_entry($fh, $mime, $level, $state); + index_entry($$cb, $mime, $level, $state); } } - thread_entry($fh, $git, $state, $node->child, $level + 1); - thread_entry($fh, $git, $state, $node->next, $level); + thread_entry($cb, $git, $state, $node->child, $level + 1); + thread_entry($cb, $git, $state, $node->next, $level); } sub load_results { |