From: Sergey Matveev Date: Sun, 15 Jan 2017 08:22:24 +0000 (+0300) Subject: Fail immediately if connection is already dead X-Git-Tag: 0.2^2~22 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=4238707a98d54b74e9a1732e6266f2d523c65f4c;p=nncp.git Fail immediately if connection is already dead --- diff --git a/src/cypherpunks.ru/nncp/sp.go b/src/cypherpunks.ru/nncp/sp.go index 27a62eb..3200ea4 100644 --- a/src/cypherpunks.ru/nncp/sp.go +++ b/src/cypherpunks.ru/nncp/sp.go @@ -179,12 +179,13 @@ type SPState struct { rxLock *os.File txLock *os.File xxOnly *TRxTx + isDead bool sync.RWMutex } -func (state *SPState) isDead() bool { +func (state *SPState) NotAlive() bool { now := time.Now() - return int(now.Sub(state.RxLastSeen).Seconds()) >= state.Node.OnlineDeadline && int(now.Sub(state.TxLastSeen).Seconds()) >= state.Node.OnlineDeadline + return state.isDead || (int(now.Sub(state.RxLastSeen).Seconds()) >= state.Node.OnlineDeadline && int(now.Sub(state.TxLastSeen).Seconds()) >= state.Node.OnlineDeadline) } func (state *SPState) dirUnlock() { @@ -505,9 +506,12 @@ func (state *SPState) StartWorkers(conn net.Conn, infosPayloads [][]byte, payloa state.wg.Add(1) go func() { - defer state.wg.Done() + defer func() { + state.isDead = true + state.wg.Done() + }() for { - if state.isDead() { + if state.NotAlive() { return } var payload []byte @@ -614,9 +618,12 @@ func (state *SPState) StartWorkers(conn net.Conn, infosPayloads [][]byte, payloa state.wg.Add(1) go func() { - defer state.wg.Done() + defer func() { + state.isDead = true + state.wg.Done() + }() for { - if state.isDead() { + if state.NotAlive() { return } state.ctx.LogD("sp-recv", sds, "waiting for payload") @@ -625,12 +632,14 @@ func (state *SPState) StartWorkers(conn net.Conn, infosPayloads [][]byte, payloa if err != nil { unmarshalErr := err.(*xdr.UnmarshalError) netErr, ok := unmarshalErr.Err.(net.Error) - if (ok && netErr.Timeout()) || unmarshalErr.ErrorCode == xdr.ErrIO { + if ok && netErr.Timeout() { continue - } else { - state.ctx.LogE("sp-recv", SdsAdd(sds, SDS{"err": err}), "") + } + if unmarshalErr.ErrorCode == xdr.ErrIO { break } + state.ctx.LogE("sp-recv", SdsAdd(sds, SDS{"err": err}), "") + break } state.ctx.LogD( "sp-recv",