From fa53ccda7a0e4e975276ed421e7226393adb7ee8 Mon Sep 17 00:00:00 2001 From: "Eric Wong (Contractor, The Linux Foundation)" Date: Mon, 19 Mar 2018 08:14:49 +0000 Subject: import: enable locking under v2 Instead of using ssoma-based locking, enable locking via Import for now. --- lib/PublicInbox/Import.pm | 14 ++++++-------- lib/PublicInbox/V2Writable.pm | 6 +++++- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/PublicInbox/Import.pm b/lib/PublicInbox/Import.pm index 77e74c13..ca30ac44 100644 --- a/lib/PublicInbox/Import.pm +++ b/lib/PublicInbox/Import.pm @@ -29,7 +29,7 @@ sub new { ref => $ref, inbox => $ibx, path_type => '2/38', # or 'v2' - ssoma_lock => 1, # disable for v2 + lock_path => "$git->{git_dir}/ssoma.lock", # v2 changes this bytes_added => 0, }, $class } @@ -46,13 +46,12 @@ sub gfi_start { my $git = $self->{git}; my $git_dir = $git->{git_dir}; - my $lockfh; - if ($self->{ssoma_lock}) { - my $lockpath = "$git_dir/ssoma.lock"; - sysopen($lockfh, $lockpath, O_WRONLY|O_CREAT) or - die "failed to open lock $lockpath: $!"; + if (my $lock_path = $self->{lock_path}) { + sysopen(my $lockfh, $lock_path, O_WRONLY|O_CREAT) or + die "failed to open lock $lock_path: $!"; # wait for other processes to be done flock($lockfh, LOCK_EX) or die "lock failed: $!\n"; + $self->{lockfh} = $lockfh; } local $/ = "\n"; @@ -66,7 +65,6 @@ sub gfi_start { $out_w->autoflush(1); $self->{in} = $in_r; $self->{out} = $out_w; - $self->{lockfh} = $lockfh; $self->{pid} = $pid; $self->{nchg} = 0; binmode $out_w, ':raw' or die "binmode :raw failed: $!"; @@ -386,7 +384,7 @@ sub done { _update_git_info($self, 1) if delete $self->{nchg}; - $self->{ssoma_lock} or return; + $self->{lock_path} or return; my $lockfh = delete $self->{lockfh} or die "BUG: not locked: $!"; flock($lockfh, LOCK_UN) or die "unlock failed: $!"; close $lockfh or die "close lock failed: $!"; diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm index a305842e..bdde76bb 100644 --- a/lib/PublicInbox/V2Writable.pm +++ b/lib/PublicInbox/V2Writable.pm @@ -26,10 +26,13 @@ sub nproc () { sub new { my ($class, $v2ibx, $creat) = @_; my $dir = $v2ibx->{mainrepo} or die "no mainrepo in inbox\n"; + my $lock_path = "$dir/inbox.lock"; unless (-d $dir) { if ($creat) { require File::Path; File::Path::mkpath($dir); + open my $fh, '>>', $lock_path or + die "failed to open $lock_path: $!\n"; } else { die "$dir does not exist\n"; } @@ -57,6 +60,7 @@ sub new { xap_ro => undef, partitions => $nparts, transact_bytes => 0, + lock_path => "$dir/inbox.lock", # limit each repo to 1GB or so rotate_bytes => int((1024 * 1024 * 1024) / $PACKING_FACTOR), }; @@ -395,7 +399,7 @@ sub import_init { my $im = PublicInbox::Import->new($git, undef, undef, $self->{-inbox}); $im->{bytes_added} = int($packed_bytes / $PACKING_FACTOR); $im->{want_object_info} = 1; - $im->{ssoma_lock} = 0; + $im->{lock_path} = $self->{lock_path}; $im->{path_type} = 'v2'; $self->{im} = $im; } -- cgit v1.2.3-24-ge0c7