Merge pull request #136 from Arceliar/dcfix

Mitigate connection cycling issue
This commit is contained in:
Arceliar 2018-06-16 16:12:29 -05:00 committed by GitHub
commit f0fd19b5e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -26,6 +26,7 @@ import (
) )
const tcp_msgSize = 2048 + 65535 // TODO figure out what makes sense const tcp_msgSize = 2048 + 65535 // TODO figure out what makes sense
const tcp_timeout = 6 * time.Second
// Wrapper function for non tcp/ip connections. // Wrapper function for non tcp/ip connections.
func setNoDelay(c net.Conn, delay bool) { func setNoDelay(c net.Conn, delay bool) {
@ -109,6 +110,8 @@ func (iface *tcpInterface) call(saddr string, socksaddr *string) {
} else { } else {
iface.calls[saddr] = struct{}{} iface.calls[saddr] = struct{}{}
defer func() { defer func() {
// Block new calls for a little while, to mitigate livelock scenarios
time.Sleep(tcp_timeout)
iface.mutex.Lock() iface.mutex.Lock()
delete(iface.calls, saddr) delete(iface.calls, saddr)
iface.mutex.Unlock() iface.mutex.Unlock()
@ -162,7 +165,7 @@ func (iface *tcpInterface) handler(sock net.Conn, incoming bool) {
if err != nil { if err != nil {
return return
} }
timeout := time.Now().Add(6 * time.Second) timeout := time.Now().Add(tcp_timeout)
sock.SetReadDeadline(timeout) sock.SetReadDeadline(timeout)
_, err = sock.Read(metaBytes) _, err = sock.Read(metaBytes)
if err != nil { if err != nil {
@ -257,7 +260,7 @@ func (iface *tcpInterface) handler(sock net.Conn, incoming bool) {
atomic.AddUint64(&p.bytesSent, uint64(len(tcp_msg)+len(msgLen)+len(msg))) atomic.AddUint64(&p.bytesSent, uint64(len(tcp_msg)+len(msgLen)+len(msg)))
util_putBytes(msg) util_putBytes(msg)
} }
timerInterval := 4 * time.Second timerInterval := tcp_timeout * 2 / 3
timer := time.NewTimer(timerInterval) timer := time.NewTimer(timerInterval)
defer timer.Stop() defer timer.Stop()
for { for {
@ -334,7 +337,7 @@ func (iface *tcpInterface) reader(sock net.Conn, in func([]byte)) {
bs := make([]byte, 2*tcp_msgSize) bs := make([]byte, 2*tcp_msgSize)
frag := bs[:0] frag := bs[:0]
for { for {
timeout := time.Now().Add(6 * time.Second) timeout := time.Now().Add(tcp_timeout)
sock.SetReadDeadline(timeout) sock.SetReadDeadline(timeout)
n, err := sock.Read(bs[len(frag):]) n, err := sock.Read(bs[len(frag):])
if err != nil || n == 0 { if err != nil || n == 0 {