@@ -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
@@ -152,7 +158,7 @@ func (r *relayItems) Entomb(id uint32, deleteAfter time.Duration) (relayItem, bo
152
158
153
159
// TODO: We should be clearing these out in batches, rather than creating
154
160
// individual timers for each item.
155
- time .AfterFunc (deleteAfter , func () { r .Delete (id ) })
161
+ r . wheel .AfterFunc (deleteAfter , func () { r .Delete (id ) })
156
162
return item , true
157
163
}
158
164
@@ -165,8 +171,10 @@ const (
165
171
166
172
// A Relayer forwards frames.
167
173
type Relayer struct {
168
- relayHost RelayHost
169
- maxTimeout time.Duration
174
+ relayHost RelayHost
175
+ maxTimeout time.Duration
176
+ timeoutTick time.Duration
177
+ wheel * timers.Wheel
170
178
171
179
// localHandlers is the set of service names that are handled by the local
172
180
// channel.
@@ -190,12 +198,15 @@ type Relayer struct {
190
198
191
199
// NewRelayer constructs a Relayer.
192
200
func NewRelayer (ch * Channel , conn * Connection ) * Relayer {
201
+ wheel := ch .relayTimeoutWheel
193
202
return & Relayer {
194
203
relayHost : ch .RelayHost (),
195
204
maxTimeout : ch .relayMaxTimeout ,
205
+ timeoutTick : ch .relayTimeoutTick ,
206
+ wheel : wheel ,
196
207
localHandler : ch .relayLocal ,
197
- outbound : newRelayItems (ch .Logger ().WithFields (LogField {"relay" , "outbound" })),
198
- inbound : newRelayItems (ch .Logger ().WithFields (LogField {"relay" , "inbound" })),
208
+ outbound : newRelayItems (wheel , ch .Logger ().WithFields (LogField {"relay" , "outbound" })),
209
+ inbound : newRelayItems (wheel , ch .Logger ().WithFields (LogField {"relay" , "inbound" })),
199
210
peers : ch .rootPeers (),
200
211
conn : conn ,
201
212
logger : conn .log ,
@@ -455,7 +466,7 @@ func (r *Relayer) addRelayItem(isOriginator bool, id, remapID uint32, destinatio
455
466
if isOriginator {
456
467
items = r .outbound
457
468
}
458
- item .Timer = time .AfterFunc (ttl , func () { r .timeoutRelayItem (isOriginator , items , id ) })
469
+ item .Timer = r . wheel .AfterFunc (ttl , func () { r .timeoutRelayItem (isOriginator , items , id ) })
459
470
items .Add (id , item )
460
471
return item
461
472
}
@@ -600,3 +611,17 @@ func validateRelayMaxTimeout(d time.Duration, logger Logger) time.Duration {
600
611
).Warn ("Configured RelayMaxTimeout is invalid, using default instead." )
601
612
return _defaultRelayMaxTimeout
602
613
}
614
+
615
+ func validateRelayTimeoutTick (d time.Duration , logger Logger ) time.Duration {
616
+ if d > 0 {
617
+ return d
618
+ }
619
+ if d == 0 {
620
+ return _defaultRelayTimeoutTick
621
+ }
622
+ logger .WithFields (
623
+ LogField {"configuredTimeoutTick" , d },
624
+ LogField {"defaultTimeoutTick" , _defaultRelayTimeoutTick },
625
+ ).Warn ("Configured RelayTimeoutTick is invalid, using default instead." )
626
+ return _defaultRelayTimeoutTick
627
+ }
0 commit comments