@@ -28,6 +28,7 @@ import (
28
28
"time"
29
29
30
30
"github.com/uber/tchannel-go/relay"
31
+ "github.com/uber/tchannel-go/timers"
31
32
32
33
"github.com/uber-go/atomic"
33
34
)
@@ -40,6 +41,9 @@ const (
40
41
_relayTombTTL = 3 * time .Second
41
42
// _defaultRelayMaxTimeout is the default max TTL for relayed calls.
42
43
_defaultRelayMaxTimeout = 2 * time .Minute
44
+ // _defaultRelayTimeoutTick is the default tick duration for processing
45
+ // relay timeouts.
46
+ _defaultRelayTimeoutTick = 5 * time .Millisecond
43
47
)
44
48
45
49
var (
53
57
type relayConn Connection
54
58
55
59
type relayItem struct {
56
- * time .Timer
60
+ * timers .Timer
57
61
58
62
remapID uint32
59
63
tomb bool
@@ -67,14 +71,16 @@ type relayItems struct {
67
71
sync.RWMutex
68
72
69
73
logger Logger
74
+ wheel * timers.Wheel
70
75
tombs uint64
71
76
items map [uint32 ]relayItem
72
77
}
73
78
74
- func newRelayItems (logger Logger ) * relayItems {
79
+ func newRelayItems (wheel * timers. Wheel , logger Logger ) * relayItems {
75
80
return & relayItems {
76
81
items : make (map [uint32 ]relayItem ),
77
82
logger : logger ,
83
+ wheel : wheel ,
78
84
}
79
85
}
80
86
@@ -150,9 +156,7 @@ func (r *relayItems) Entomb(id uint32, deleteAfter time.Duration) (relayItem, bo
150
156
r .items [id ] = item
151
157
r .Unlock ()
152
158
153
- // TODO: We should be clearing these out in batches, rather than creating
154
- // individual timers for each item.
155
- time .AfterFunc (deleteAfter , func () { r .Delete (id ) })
159
+ r .wheel .AfterFunc (deleteAfter , func () { r .Delete (id ) })
156
160
return item , true
157
161
}
158
162
@@ -165,8 +169,10 @@ const (
165
169
166
170
// A Relayer forwards frames.
167
171
type Relayer struct {
168
- relayHost RelayHost
169
- maxTimeout time.Duration
172
+ relayHost RelayHost
173
+ maxTimeout time.Duration
174
+ timeoutTick time.Duration
175
+ wheel * timers.Wheel
170
176
171
177
// localHandlers is the set of service names that are handled by the local
172
178
// channel.
@@ -190,12 +196,15 @@ type Relayer struct {
190
196
191
197
// NewRelayer constructs a Relayer.
192
198
func NewRelayer (ch * Channel , conn * Connection ) * Relayer {
199
+ wheel := ch .relayTimeoutWheel
193
200
return & Relayer {
194
201
relayHost : ch .RelayHost (),
195
202
maxTimeout : ch .relayMaxTimeout ,
203
+ timeoutTick : ch .relayTimeoutTick ,
204
+ wheel : wheel ,
196
205
localHandler : ch .relayLocal ,
197
- outbound : newRelayItems (ch .Logger ().WithFields (LogField {"relay" , "outbound" })),
198
- inbound : newRelayItems (ch .Logger ().WithFields (LogField {"relay" , "inbound" })),
206
+ outbound : newRelayItems (wheel , ch .Logger ().WithFields (LogField {"relay" , "outbound" })),
207
+ inbound : newRelayItems (wheel , ch .Logger ().WithFields (LogField {"relay" , "inbound" })),
199
208
peers : ch .rootPeers (),
200
209
conn : conn ,
201
210
logger : conn .log ,
@@ -455,7 +464,7 @@ func (r *Relayer) addRelayItem(isOriginator bool, id, remapID uint32, destinatio
455
464
if isOriginator {
456
465
items = r .outbound
457
466
}
458
- item .Timer = time .AfterFunc (ttl , func () { r .timeoutRelayItem (isOriginator , items , id ) })
467
+ item .Timer = r . wheel .AfterFunc (ttl , func () { r .timeoutRelayItem (isOriginator , items , id ) })
459
468
items .Add (id , item )
460
469
return item
461
470
}
@@ -600,3 +609,17 @@ func validateRelayMaxTimeout(d time.Duration, logger Logger) time.Duration {
600
609
).Warn ("Configured RelayMaxTimeout is invalid, using default instead." )
601
610
return _defaultRelayMaxTimeout
602
611
}
612
+
613
+ func validateRelayTimeoutTick (d time.Duration , logger Logger ) time.Duration {
614
+ if d > 0 {
615
+ return d
616
+ }
617
+ if d == 0 {
618
+ return _defaultRelayTimeoutTick
619
+ }
620
+ logger .WithFields (
621
+ LogField {"configuredTimeoutTick" , d },
622
+ LogField {"defaultTimeoutTick" , _defaultRelayTimeoutTick },
623
+ ).Warn ("Configured RelayTimeoutTick is invalid, using default instead." )
624
+ return _defaultRelayTimeoutTick
625
+ }
0 commit comments