test connection pools
This commit is contained in:
@@ -96,7 +96,7 @@ func (c *Connection) CallAsync(msg FrameType, payload []byte, ch chan<- FrameWit
|
||||
}(MakeFrameWithPayload(msg, 1, payload))
|
||||
|
||||
c.count++
|
||||
return conn, nil
|
||||
return conn, err
|
||||
}
|
||||
|
||||
func (c *Connection) Call(msg FrameType, data []byte) (*FrameWithPayload, error) {
|
||||
@@ -107,14 +107,14 @@ func (c *Connection) Call(msg FrameType, data []byte) (*FrameWithPayload, error)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
defer c.pool.Put(conn, nil) // conn.Close()
|
||||
defer c.pool.Put(conn, err) // conn.Close()
|
||||
defer close(ch)
|
||||
|
||||
select {
|
||||
case ret := <-ch:
|
||||
return &ret, nil
|
||||
case <-time.After(MaxCallDuration):
|
||||
return nil, fmt.Errorf("timeout")
|
||||
return nil, fmt.Errorf("timeout waiting for frame")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,22 +169,21 @@ func (c *Connection) Listen() (*GenericListener, error) {
|
||||
}
|
||||
|
||||
const (
|
||||
MaxCallDuration = 500 * time.Millisecond
|
||||
MaxCallDuration = 300 * time.Millisecond
|
||||
ListenerKeepalive = 5 * time.Second
|
||||
)
|
||||
|
||||
func (l *GenericListener) HandleConnection(conn net.Conn) {
|
||||
ch := make(chan FrameWithPayload, 1)
|
||||
conn.SetReadDeadline(time.Now().Add(MaxCallDuration))
|
||||
go WaitForFrame(conn, ch)
|
||||
select {
|
||||
case frame := <-ch:
|
||||
for !l.StopListener {
|
||||
ch := make(chan FrameWithPayload, 1)
|
||||
//conn.SetReadDeadline(time.Now().Add(MaxCallDuration))
|
||||
go WaitForFrame(conn, ch)
|
||||
frame := <-ch
|
||||
err := l.HandleFrame(conn, &frame)
|
||||
if err != nil {
|
||||
log.Fatalf("Error in handler: %v\n", err)
|
||||
}
|
||||
case <-time.After(MaxCallDuration):
|
||||
close(ch)
|
||||
log.Printf("Timeout waiting for frame\n")
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -200,13 +199,15 @@ func (l *GenericListener) HandleFrame(conn net.Conn, frame *FrameWithPayload) er
|
||||
defer close(resultChan)
|
||||
err := handler(frame, resultChan)
|
||||
if err != nil {
|
||||
resultChan <- MakeFrameWithPayload(frame.Type, 500, []byte(err.Error()))
|
||||
errFrame := MakeFrameWithPayload(frame.Type, 500, []byte(err.Error()))
|
||||
SendFrame(conn, &errFrame)
|
||||
log.Printf("Handler returned error: %s", err)
|
||||
return
|
||||
}
|
||||
result := <-resultChan
|
||||
err = SendFrame(conn, &result)
|
||||
if err != nil {
|
||||
log.Fatalf("Error sending frame: %s\n", err)
|
||||
log.Printf("Error sending frame: %s", err)
|
||||
}
|
||||
}()
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user