|
|
|
@ -161,6 +161,11 @@ type udpConn struct {
|
|
|
|
|
done *done.Instance |
|
|
|
|
uplink stats.Counter |
|
|
|
|
downlink stats.Counter |
|
|
|
|
inactive bool |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (c *udpConn) setInactive() { |
|
|
|
|
c.inactive = true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (c *udpConn) updateActivity() { |
|
|
|
@ -328,7 +333,11 @@ func (w *udpWorker) callback(b *buf.Buffer, source net.Destination, originalDest
|
|
|
|
|
newError("connection ends").Base(err).WriteToLog(session.ExportIDToError(ctx)) |
|
|
|
|
} |
|
|
|
|
conn.Close() |
|
|
|
|
w.removeConn(id) |
|
|
|
|
// conn not removed by checker TODO may be lock worker here is better
|
|
|
|
|
if !conn.inactive { |
|
|
|
|
conn.setInactive() |
|
|
|
|
w.removeConn(id) |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -356,8 +365,11 @@ func (w *udpWorker) clean() error {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for addr, conn := range w.activeConn { |
|
|
|
|
if nowSec-atomic.LoadInt64(&conn.lastActivityTime) > 300 { |
|
|
|
|
delete(w.activeConn, addr) |
|
|
|
|
if nowSec-atomic.LoadInt64(&conn.lastActivityTime) > 5*60 { // TODO Timeout too small
|
|
|
|
|
if !conn.inactive { |
|
|
|
|
conn.setInactive() |
|
|
|
|
delete(w.activeConn, addr) |
|
|
|
|
} |
|
|
|
|
conn.Close() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|