Re: clone hang prevention / timeout?
- From
- Eric Wong <normalperson@yhbt.net>
- Date
- Apr 12, 2016, 08:01 UTC
- Message-ID
- <20160412080149.GA9087@dcvr.yhbt.net>
- In-Reply-To
- <CALyZvKwxE4T8-FmEYgPMgAFKLmeAY5f-y-mDL8S9twTb0umRaA@mail.gmail.com>
Jason Vas Dias <jason.vas.dias@gmail.com> wrote:
> It appears GIT has no way of specifying a timeout for a clone operation - > if the server decides not to complete a get request, the clone can > hang forever - > is this correct ?
git uses SO_KEEPALIVE for all connections it makes, so whatever your kernel TCP keepalive knobs are set at.
By default, it's very long (around 2 hours), but you can change them using the tcp_keepalive_* knobs in /proc/sys/net/ipv4/ under Linux.
I suppose we can do shorter timeouts (at least under Linux) via setsockopt(.. TCP_KEEP*) knobs, or we can call poll() ourselves to timeout connections. However, git packing operations on the server can take a long time; so it might be bad to timeout manually unless we know the connection is really dead.
Show 7 quoted lines
> This appears to be what I am seeing, in a script that is attempting to do many > successive clone operations, eg. of > git://anongit.freedesktop.org/xorg/* , the script > occasionally hangs in a clone - I can see with netstat + strace that the TCP > connection is open and GIT is trying to read . > Is there any option I can specify to get the clone to timeout, or do I manually > have to strace the git process and send it a signal after a hang is detected?
I added git:// support for SO_KEEPALIVE in commit e47a8583a202 ("enable SO_KEEPALIVE for connected TCP sockets") back in 2011 (v1.7.10), and http:// support later in 2013 (v1.8.5) with commit a15d069a1986 ("http: enable keepalive on TCP sockets")