99 lines
3.4 KiB
Diff
99 lines
3.4 KiB
Diff
From 9e0e8bf226112195c93fa2493086353bd46bd001 Mon Sep 17 00:00:00 2001
|
|
From: Michael Schroeder <mls@suse.de>
|
|
Date: Wed, 17 Dec 2014 18:07:11 +0100
|
|
Subject: [PATCH 2/4] do not finish applydeltarpm jobs when in the middle of a
|
|
request
|
|
|
|
If applydeltarpm failed we start another request, this does not
|
|
mix well if re're in the middle of receiving another request...
|
|
---
|
|
drpmsync | 39 +++++++++++++++++++++++++++------------
|
|
1 file changed, 27 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/drpmsync b/drpmsync
|
|
index f629aad..2265b7e 100755
|
|
--- a/drpmsync
|
|
+++ b/drpmsync
|
|
@@ -2686,6 +2686,7 @@ sub opensock {
|
|
return if $sock_isopen;
|
|
my $tcpproto = getprotobyname('tcp');
|
|
socket(S, PF_INET, SOCK_STREAM, $tcpproto) || die("socket: $!\n");
|
|
+ setsockopt(S, SOL_SOCKET, SO_KEEPALIVE, pack("l",1)) || die("setsockopt: $!\n");
|
|
connect(S, sockaddr_in($syncport, $syncaddr)) || die("connect: $!\n");
|
|
$sock_isopen = 1;
|
|
}
|
|
@@ -2974,7 +2975,8 @@ sub drpmsync_get_update {
|
|
} elsif ($type eq 'FISO') {
|
|
$ans = copytofile(*S, "$tmpnam.fiso", $ans, $anssize, $ctx);
|
|
$ans = finishreq(*S, $ans, $ctx, $id);
|
|
- return 'FISO', [ $tmpnam, undef, substr($extra, 0, 12) ];
|
|
+ $d = [ $tmpnam, undef, substr($extra, 0, 12) ];
|
|
+ return ('FISO', $d);
|
|
} elsif ($type eq 'RPM ') {
|
|
$sabytes -= $anssize;
|
|
my $delta;
|
|
@@ -2982,36 +2984,49 @@ sub drpmsync_get_update {
|
|
die("nothing to do?\n") if $nrpm == 0 && $ndrpm == 0;
|
|
my @deltas;
|
|
my $dextra = substr($extra, 12 + 16);
|
|
+ my @renames;
|
|
while ($ndrpm > 0) {
|
|
$delta = $tmpnam;
|
|
$delta =~ s/[^\/]*$//;
|
|
$delta .= substr($dextra, 12, 32 * 3);
|
|
- # end old job if we have a delta conflict
|
|
- checkjob() if $runningjob && -e $delta;
|
|
my $size = hex(substr($dextra, 12 + 3 * 32, 8));
|
|
die("delta rpm bigger than answer? $size > $anssize\n") if $size > $anssize;
|
|
+ push @deltas, $delta;
|
|
+ # conflict with running job?
|
|
+ if ($runningjob && -e $delta) {
|
|
+ push @renames, $delta;
|
|
+ $delta .= ".tmp";
|
|
+ }
|
|
$ans = copytofile(*S, $delta, $ans, $size, $ctx);
|
|
$anssize -= $size;
|
|
fixmodetime($delta, substr($dextra, 0, 12));
|
|
$dextra = substr($dextra, 12 + 32 * 3 + 8);
|
|
- push @deltas, $delta;
|
|
$ndrpm--;
|
|
}
|
|
- if ($nrpm == 1) {
|
|
+ if ($nrpm) {
|
|
$ans = copytofile_seek(*S, $tmpnam, $extractoff, $ans, $anssize, $ctx);
|
|
- $ans = finishreq(*S, $ans, $ctx, $id);
|
|
- return 'RPM ', [ $dto->[0] ], @deltas if $rextract;
|
|
+ } else {
|
|
+ die("junk at end of answer\n") if $anssize;
|
|
+ }
|
|
+ $ans = finishreq(*S, $ans, $ctx, $id);
|
|
+ if (@renames) {
|
|
+ checkjob();
|
|
+ for (@renames) {
|
|
+ rename("$_.tmp", $_) || die("rename $_.tmp $_: $!\n");
|
|
+ }
|
|
+ }
|
|
+ if (!$nrpm) {
|
|
+ $d = [ undef, undef, substr($extra, 0, 12) ];
|
|
+ } elsif ($rextract) {
|
|
+ $d = [ $dto->[0] ];
|
|
+ } else {
|
|
fixmodetime($tmpnam, substr($extra, 0, 12));
|
|
my @s = stat($tmpnam);
|
|
die("$tmpnam: $!\n") unless @s;
|
|
$sabytes += $s[7];
|
|
$d = [ $dto->[0], "$s[9]/$s[7]/$s[1]", sprintf("1%03x%08x", ($s[2] & 07777), $s[9]), rpminfo($tmpnam) ];
|
|
- } else {
|
|
- die("junk at end of answer\n") if $anssize;
|
|
- $ans = finishreq(*S, $ans, $ctx, $id);
|
|
- $d = [ undef, undef, substr($extra, 0, 12) ];
|
|
}
|
|
- return 'RPM ', $d, @deltas;
|
|
+ return ('RPM ', $d, @deltas);
|
|
} else {
|
|
die("received strange answer type: $type\n");
|
|
}
|
|
--
|
|
2.1.0
|
|
|