@@ -3,6 +3,7 @@ package datagramsession
33import (
44 "context"
55 "io"
6+ "time"
67
78 "github.com/google/uuid"
89 "github.com/lucas-clemente/quic-go"
@@ -12,6 +13,7 @@ import (
1213
1314const (
1415 requestChanCapacity = 16
16+ defaultReqTimeout = time .Second * 5
1517)
1618
1719// Manager defines the APIs to manage sessions from the same transport.
@@ -31,9 +33,11 @@ type manager struct {
3133 transport transport
3234 sessions map [uuid.UUID ]* Session
3335 log * zerolog.Logger
36+ // timeout waiting for an API to finish. This can be overriden in test
37+ timeout time.Duration
3438}
3539
36- func NewManager (transport transport , log * zerolog.Logger ) Manager {
40+ func NewManager (transport transport , log * zerolog.Logger ) * manager {
3741 return & manager {
3842 registrationChan : make (chan * registerSessionEvent ),
3943 unregistrationChan : make (chan * unregisterSessionEvent ),
@@ -42,6 +46,7 @@ func NewManager(transport transport, log *zerolog.Logger) Manager {
4246 transport : transport ,
4347 sessions : make (map [uuid.UUID ]* Session ),
4448 log : log ,
49+ timeout : defaultReqTimeout ,
4550 }
4651}
4752
@@ -89,9 +94,12 @@ func (m *manager) Serve(ctx context.Context) error {
8994}
9095
9196func (m * manager ) RegisterSession (ctx context.Context , sessionID uuid.UUID , originProxy io.ReadWriteCloser ) (* Session , error ) {
97+ ctx , cancel := context .WithTimeout (ctx , m .timeout )
98+ defer cancel ()
9299 event := newRegisterSessionEvent (sessionID , originProxy )
93100 select {
94101 case <- ctx .Done ():
102+ m .log .Error ().Msg ("Datagram session registration timeout" )
95103 return nil , ctx .Err ()
96104 case m .registrationChan <- event :
97105 session := <- event .resultChan
@@ -106,6 +114,8 @@ func (m *manager) registerSession(ctx context.Context, registration *registerSes
106114}
107115
108116func (m * manager ) UnregisterSession (ctx context.Context , sessionID uuid.UUID , message string , byRemote bool ) error {
117+ ctx , cancel := context .WithTimeout (ctx , m .timeout )
118+ defer cancel ()
109119 event := & unregisterSessionEvent {
110120 sessionID : sessionID ,
111121 err : & errClosedSession {
@@ -115,6 +125,7 @@ func (m *manager) UnregisterSession(ctx context.Context, sessionID uuid.UUID, me
115125 }
116126 select {
117127 case <- ctx .Done ():
128+ m .log .Error ().Msg ("Datagram session unregistration timeout" )
118129 return ctx .Err ()
119130 case m .unregistrationChan <- event :
120131 return nil
0 commit comments