*** transport.go 2011-11-17 19:31:04.548895414 +0900 --- /home/ykanno/tmp/transport.go 2011-12-25 08:53:09.000000000 +0900 *************** *** 166,172 **** } for _, conns := range t.idleConn { for _, pconn := range conns { ! pconn.close() } } t.idleConn = nil --- 166,172 ---- } for _, conns := range t.idleConn { for _, pconn := range conns { ! pconn.close(false) } } t.idleConn = nil *************** *** 215,221 **** t.lk.Lock() defer t.lk.Unlock() if t.DisableKeepAlives || t.MaxIdleConnsPerHost < 0 { ! pconn.close() return } if pconn.isBroken() { --- 215,221 ---- t.lk.Lock() defer t.lk.Unlock() if t.DisableKeepAlives || t.MaxIdleConnsPerHost < 0 { ! pconn.close(false) return } if pconn.isBroken() { *************** *** 227,233 **** max = DefaultMaxIdleConnsPerHost } if len(t.idleConn[key]) >= max { ! pconn.close() return } t.idleConn[key] = append(t.idleConn[key], pconn) --- 227,233 ---- max = DefaultMaxIdleConnsPerHost } if len(t.idleConn[key]) >= max { ! pconn.close(false) return } t.idleConn[key] = append(t.idleConn[key], pconn) *************** *** 481,508 **** return pc.broken } func (pc *persistConn) expectingResponse() bool { pc.lk.Lock() defer pc.lk.Unlock() return pc.numExpectedResponses > 0 } func (pc *persistConn) readLoop() { alive := true for alive { pb, err := pc.br.Peek(1) if err != nil { ! if (err == os.EOF || err == os.EINVAL) && !pc.expectingResponse() { // Remote side closed on us. (We probably hit their // max idle timeout) ! pc.close() return } } ! if !pc.expectingResponse() { log.Printf("Unsolicited response received on idle HTTP channel starting with %q; err=%v", string(pb), err) ! pc.close() return } --- 481,518 ---- return pc.broken } + /* func (pc *persistConn) expectingResponse() bool { pc.lk.Lock() defer pc.lk.Unlock() return pc.numExpectedResponses > 0 } + */ + func (pc *persistConn) expectingResponseOrClose() (ret bool) { + pc.lk.Lock() + defer pc.lk.Unlock() + if ret = pc.numExpectedResponses > 0; !ret { + pc.close(true) + } + return ret + } func (pc *persistConn) readLoop() { alive := true for alive { pb, err := pc.br.Peek(1) if err != nil { ! if (err == os.EOF || err == os.EINVAL) && !pc.expectingResponseOrClose() { // Remote side closed on us. (We probably hit their // max idle timeout) ! // pc.close() return } } ! if !pc.expectingResponseOrClose() { log.Printf("Unsolicited response received on idle HTTP channel starting with %q; err=%v", string(pb), err) ! //pc.close() return } *************** *** 521,527 **** resp.ContentLength = -1 gzReader, err := gzip.NewReader(resp.Body) if err != nil { ! pc.close() return nil, err } resp.Body = &readFirstCloseBoth{&discardOnCloseReadCloser{gzReader}, resp.Body} --- 531,537 ---- resp.ContentLength = -1 gzReader, err := gzip.NewReader(resp.Body) if err != nil { ! pc.close(false) return nil, err } resp.Body = &readFirstCloseBoth{&discardOnCloseReadCloser{gzReader}, resp.Body} *************** *** 614,620 **** err = pc.cc.Write(req) if err != nil { ! pc.close() return } --- 624,630 ---- err = pc.cc.Write(req) if err != nil { ! pc.close(false) return } *************** *** 628,636 **** return re.res, re.err } ! func (pc *persistConn) close() { ! pc.lk.Lock() ! defer pc.lk.Unlock() pc.broken = true pc.cc.Close() pc.conn.Close() --- 638,648 ---- return re.res, re.err } ! func (pc *persistConn) close(hasLock bool) { ! if !hasLock { ! pc.lk.Lock() ! defer pc.lk.Unlock() ! } pc.broken = true pc.cc.Close() pc.conn.Close()