Re: pread() over NFS (again) [1.5.5.4]
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jun 26, 2008, 20:56 UTC
- Message-ID
- <7vskuzq5ix.fsf@gitster.siamese.dyndns.org>
- In-Reply-To
- <20080626204606.GX11793@spearce.org>
"Shawn O. Pearce" <spearce@spearce.org> writes:
Show 45 quoted lines
> Christian Holtje <docwhat@gmail.com> wrote:
>> I have read all the threads on git having trouble with pread() and I
>> didn't see anything to help.
> ...
>> Receiving objects: 100% (253/253), 5.27 MiB | 9136 KiB/s, done.
>> fatal: cannot pread pack file: No such file or directory
>> fatal: index-pack failed
>>
>> The end of the strace looks like so:
>> pread(3, "", 205, 1373) = 0
>> write(2, "fatal: cannot pread pack file: N"..., 57) = 57
>
> Hmmph. So pread for a length of 205 can return 0 on NFS? Is this
> a transient error? If so, perhaps a patch like this might help:
>
> diff --git a/index-pack.c b/index-pack.c
> index 5ac91ba..737f757 100644
> --- a/index-pack.c
> +++ b/index-pack.c
> @@ -309,14 +309,19 @@ static void *get_data_from_pack(struct object_entry *obj)
> unsigned char *src, *data;
> z_stream stream;
> int st;
> + int attempts = 0;
>
> src = xmalloc(len);
> data = src;
> do {
> ssize_t n = pread(pack_fd, data + rdy, len - rdy, from + rdy);
> - if (n <= 0)
> + if (n <= 0) {
> + if (n == 0 && ++attempts < 10)
> + continue;
> die("cannot pread pack file: %s", strerror(errno));
> + }
> rdy += n;
> + attempts = 0;
> } while (rdy < len);
> data = xmalloc(obj->size);
> memset(&stream, 0, sizeof(stream));
>
>
> The file shouldn't be short unless someone truncated it, or there
> is a bug in index-pack. Neither is very likely, but I don't think
> we would want to retry pread'ing the same block forever.I don't think we would want to retry even once. Return value of 0 from pread is defined to be an EOF, isn't it?