From 58aa3061ffc26732fb559893d283e7ace8b9ca8b Mon Sep 17 00:00:00 2001 From: "yang.zhang" Date: Fri, 27 May 2016 13:44:17 +0800 Subject: [PATCH] Add lock for access repomd metadata Change-Id: I03f4b3ccb8e3da02989fb031c24634abcb4ca984 --- createrepomddeps | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/createrepomddeps b/createrepomddeps index 1e9f624..5c688af 100755 --- a/createrepomddeps +++ b/createrepomddeps @@ -33,7 +33,8 @@ use Build::Rpmmd; use Digest::MD5 (); use File::Path qw(mkpath rmtree); use File::Basename; -use Fcntl ':flock'; +use IPC::SysV qw(IPC_PRIVATE S_IRUSR S_IWUSR IPC_CREAT IPC_EXCL SEM_UNDO); +use IPC::Semaphore; Getopt::Long::Configure("no_ignore_case"); @@ -88,7 +89,20 @@ for my $url (@ARGV) { $dir = "$cachedir/$repoid/"; $baseurl .= '/' unless $baseurl =~ /\/$/; mkpath("${dir}repodata"); - system($INC[0].'/download', "${dir}repodata", "${baseurl}repodata/repomd.xml"); + my $sem; + my $key = IPC::SysV::ftok($dir, '1'); + if ($sem = IPC::Semaphore->new($key, 1, S_IRUSR | S_IWUSR | IPC_CREAT | IPC_EXCL)) { + $sem->setval(0, 1); + } else { + $sem = IPC::Semaphore->new($key, 1, S_IRUSR | S_IWUSR | IPC_CREAT); + } + + $sem->op(0, -1, SEM_UNDO); + if (!-f "${dir}repodata/repomd.xml") { + system($INC[0].'/download', "${dir}repodata", "${baseurl}repodata/repomd.xml"); + } + $sem->op(0, 1, SEM_UNDO); + $sem->remove(); } else { $dir = $url; } @@ -112,6 +126,14 @@ for my $url (@ARGV) { utf8::downgrade($u); } my $cached; + my $sem; + my $key = IPC::SysV::ftok("${dir}repodata/", '1'); + if ($sem = IPC::Semaphore->new($key, 1, S_IRUSR | S_IWUSR | IPC_CREAT | IPC_EXCL)) { + $sem->setval(0, 1); + } else { + $sem = IPC::Semaphore->new($key, 1, S_IRUSR | S_IWUSR | IPC_CREAT); + } + $sem->op(0, -1, SEM_UNDO); if (-e $u) { $cached = 1; $cached = 0 if exists($f->{'size'}) && $f->{'size'} != (-s _); @@ -127,6 +149,8 @@ for my $url (@ARGV) { die("inconsistent repodata in $url\n"); } } + $sem->op(0, 1, SEM_UNDO); + $sem->remove(); my $fh; open($fh, '<', $u) or die "Error opening $u: $!\n"; -- 2.34.1