I had much difficulty in attempting to use 'trickle', a bandwidth
constraining utility, to limit the upload speed of flickr_upload,
which uses the Flickr::API modules, which in turn use
LWP::Protocol::http. An error response from LWP::Protocol::http was
being propogated back upward and causing the upload to abort.

I traced the problem to this segment of code in LWP/Protocol/http.pm:

            if (defined($wbits) && $wbits =~ /[^\0]/) {
                my $n = $socket->syswrite($$wbuf, length($$wbuf), $woffset);
                unless ($n) {
                    die "syswrite: $!" unless defined $n;
                    die "syswrite: no bytes written";
                }
                $woffset += $n;

After the syswrite, the error response is not checked for a temporary
error like "Resource temporarily unavailable" and just fails outright.
I modified the code in my personal copy to:
  - retry if the error response is "Resource temporarily unavailable"
  - make smaller writes (makes for smoother rate shaping with 'trickle')
  - use Time::HiRes and sleep for a short period of time between attempts

            if (defined($wbits) && $wbits =~ /[^\0]/) {
                my $n;
                do {
                    $n = $socket->syswrite($$wbuf, 2048, $woffset);
                } while ($! eq 'Resource temporarily unavailable' &&
sleep(0.005));
                unless ($n) {
                    die "syswrite: $!" unless defined $n;
                    die "syswrite: no bytes written";
                }
                $woffset += $n;

That's probably not the most ideal general-purpose remedy, but it
worked great in getting it to not fail outright when run with trickle.

In any case, I thought I would point out this problem so that it could
perhaps be addressed in a future release of LWP.

   Thanks!
   -jrs

Reply via email to