Add lock for access repomd metadata release-20160615
authoryang.zhang <y0169.zhang@samsung.com>
Fri, 27 May 2016 05:44:17 +0000 (13:44 +0800)
committerSoonKyu Park <sk7.park@samsung.com>
Wed, 15 Jun 2016 05:23:31 +0000 (14:23 +0900)
Change-Id: I03f4b3ccb8e3da02989fb031c24634abcb4ca984

createrepomddeps

index 1e9f624d7f925b3a2383cc21f54ff85ee5d19eae..5c688af02c589094231fab7ed0200ec14203a72e 100755 (executable)
@@ -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";