We must preserve the umask for the entirety of the indexing
operation, as Xapian transactions replace entire files
atomically instead of writing them in place.
---
 lib/PublicInbox/SearchIdx.pm | 40 +++++++++++++++++++++++++++-------------
 public-inbox-mda             |  2 +-
 2 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm
index 5664c38..2c2f819 100644
--- a/lib/PublicInbox/SearchIdx.pm
+++ b/lib/PublicInbox/SearchIdx.pm
@@ -21,19 +21,18 @@ sub new {
        my $dir = $class->xdir($git_dir);
        require Search::Xapian::WritableDatabase;
        my $flag = Search::Xapian::DB_OPEN;
-       if ($writable == 1) {
-               require File::Path;
-               File::Path::mkpath($dir);
-               $flag = Search::Xapian::DB_CREATE_OR_OPEN;
-       }
        my $self = bless { git_dir => $git_dir }, $class;
-       my $umask = _umask_for($self->_git_config_perm);
-       my $old_umask = umask $umask;
-       my $db = eval { Search::Xapian::WritableDatabase->new($dir, $flag) };
-       my $err = $@;
-       umask $old_umask;
-       die $err if $err;
-       $self->{xdb} = $db;
+       my $perm = $self->_git_config_perm;
+       my $umask = _umask_for($perm);
+       $self->{umask} = $umask;
+       $self->{xdb} = $self->with_umask(sub {
+               if ($writable == 1) {
+                       require File::Path;
+                       File::Path::mkpath($dir);
+                       $flag = Search::Xapian::DB_CREATE_OR_OPEN;
+               }
+               Search::Xapian::WritableDatabase->new($dir, $flag);
+       });
        $self;
 }
 
@@ -288,9 +287,14 @@ sub do_cat_mail {
        $@ ? undef : $mime;
 }
 
-# indexes all unindexed messages
 sub index_sync {
        my ($self, $head) = @_;
+       $self->with_umask(sub { $self->_index_sync($head) });
+}
+
+# indexes all unindexed messages
+sub _index_sync {
+       my ($self, $head) = @_;
        require PublicInbox::GitCatFile;
        my $db = $self->{xdb};
        my $hex = '[a-f0-9]';
@@ -423,4 +427,14 @@ sub _umask_for {
        (~$rv & 0777);
 }
 
+sub with_umask {
+       my ($self, $cb) = @_;
+       my $old = umask $self->{umask};
+       my $rv = eval { $cb->() };
+       my $err = $@;
+       umask $old;
+       die $err if $@;
+       $rv;
+}
+
 1;
diff --git a/public-inbox-mda b/public-inbox-mda
index 8e98d6e..c4822b6 100755
--- a/public-inbox-mda
+++ b/public-inbox-mda
@@ -88,7 +88,7 @@ sub do_spamc {
 sub search_index_sync {
        my ($git_dir) = @_;
        eval {
-               require PublicInbox::Search;
+               require PublicInbox::SearchIdx;
                PublicInbox::SearchIdx->new($git_dir, 2)->index_sync;
        };
 }
-- 
EW

--
unsubscribe: meta+unsubscr...@public-inbox.org
archive: http://public-inbox.org/meta/

Reply via email to