chiark / gitweb /
Test suite: Test dgit-repos-policy-debian database retry
[dgit.git] / infra / dgit-repos-policy-debian
index 75b4737a84ed49035505eb4ebc64f15109e831ee..a770c55ec07d40e5858c2c782c41934a6ecab8f1 100755 (executable)
@@ -221,6 +221,7 @@ sub check_package () {
 
     if (good_suite_has_vsn_in_our_history) {
        chmod $publicmode, "." or die $!;
+       $pkg_secret = 0;
        return 0;
     }
 
@@ -260,6 +261,8 @@ sub action_push () {
     getpackage();
     getpushinfo();
 
+    check_package(); # might make package public, or might add taints
+
     return 0 unless $pkg_exists;
     return 0 unless $pkg_secret;
 
@@ -449,21 +452,38 @@ if (!$fn) {
 my $sleepy=0;
 my $rcode;
 
+my $db_busy_exception= 'Debian::Dgit::Policy::Debian::DB_BUSY';
+
+my @orgargv = @ARGV;
+
 for (;;) {
-    poldb_setup(poldb_path($repos));
-    $stderr = '';
+    @ARGV = @orgargv;
+    eval {
+       poldb_setup(poldb_path($repos));
+       $stderr = '';
+
+       eval ($ENV{'DGIT_DRS_RPD_TEST_DBLOOP_HOOK'}//'');
+       die $@ if length $@;
+       # used by tests/tests/debpolicy-dbretry
+
+       $poldbh->{HandleError} = sub {
+           return 0 unless $poldbh->err == 5; # SQLITE_BUSY, not in .pm :-(
+           die bless { }, $db_busy_exception;
+       };
 
-    $rcode = $fn->();
-    die unless defined $rcode;
+       $rcode = $fn->();
+       die unless defined $rcode;
 
-    eval { $poldbh->commit; };
+       $poldbh->commit;
+    };
     last unless length $@;
+    die $@ unless ref $@ eq $db_busy_exception;
 
     die if $sleepy >= 20;
-    print STDERR "[policy database busy, retrying]\n";
-    sleep ++$sleepy;
+    $sleepy++;
+    print STDERR "[policy database busy, retrying (${sleepy}s)]\n";
 
-    $poldbh->rollback;
+    eval { $poldbh->rollback; };
 }
 
 print STDERR $stderr or die $!;