Re: pread() over NFS (again) [1.5.5.4]
- From
Shawn O. Pearce <spearce@spearce.org>
- Date
- Jun 26, 2008, 20:46 UTC
- Message-ID
- <20080626204606.GX11793@spearce.org>
- In-Reply-To
- <6F25C1B4-85DE-4559-9471-BCD453FEB174@gmail.com>
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.
...
Show 7 quoted lines
> 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.
-- Shawn.