@@ -98,19 +98,6 @@ internal final class GRPCIdleHandler: ChannelInboundHandler {
98
98
)
99
99
}
100
100
101
- private func sendGoAway( lastStreamID streamID: HTTP2StreamID ) {
102
- guard let context = self . context else {
103
- return
104
- }
105
-
106
- let frame = HTTP2Frame (
107
- streamID: . rootStream,
108
- payload: . goAway( lastStreamID: streamID, errorCode: . noError, opaqueData: nil )
109
- )
110
-
111
- context. writeAndFlush ( self . wrapOutboundOut ( frame) , promise: nil )
112
- }
113
-
114
101
private func perform( operations: GRPCIdleHandlerStateMachine . Operations ) {
115
102
// Prod the connection manager.
116
103
if let event = operations. connectionManagerEvent, let manager = self . mode. connectionManager {
@@ -137,11 +124,17 @@ internal final class GRPCIdleHandler: ChannelInboundHandler {
137
124
if let idleTask = operations. idleTask {
138
125
switch idleTask {
139
126
case let . cancel( task) :
127
+ self . stateMachine. logger. debug ( " idle timeout task cancelled " )
140
128
task. cancel ( )
141
129
142
130
case . schedule:
143
131
if self . idleTimeout != . nanoseconds( . max) , let context = self . context {
132
+ self . stateMachine. logger. debug (
133
+ " scheduling idle timeout task " ,
134
+ metadata: [ MetadataKey . delayMs: " \( self . idleTimeout. milliseconds) " ]
135
+ )
144
136
let task = context. eventLoop. scheduleTask ( in: self . idleTimeout) {
137
+ self . stateMachine. logger. debug ( " idle timeout task fired " )
145
138
self . idleTimeoutFired ( )
146
139
}
147
140
self . perform ( operations: self . stateMachine. scheduledIdleTimeoutTask ( task) )
@@ -151,6 +144,13 @@ internal final class GRPCIdleHandler: ChannelInboundHandler {
151
144
152
145
// Send a GOAWAY frame.
153
146
if let streamID = operations. sendGoAwayWithLastPeerInitiatedStreamID {
147
+ self . stateMachine. logger. debug (
148
+ " sending GOAWAY frame " ,
149
+ metadata: [
150
+ MetadataKey . h2GoAwayLastStreamID: " \( Int ( streamID) ) "
151
+ ]
152
+ )
153
+
154
154
let goAwayFrame = HTTP2Frame (
155
155
streamID: . rootStream,
156
156
payload: . goAway( lastStreamID: streamID, errorCode: . noError, opaqueData: nil )
@@ -175,6 +175,7 @@ internal final class GRPCIdleHandler: ChannelInboundHandler {
175
175
// Close on the next event-loop tick so we don't drop any events which are
176
176
// currently being processed.
177
177
context. eventLoop. execute {
178
+ self . stateMachine. logger. debug ( " closing connection " )
178
179
context. close ( mode: . all, promise: nil )
179
180
}
180
181
}
@@ -186,8 +187,12 @@ internal final class GRPCIdleHandler: ChannelInboundHandler {
186
187
( )
187
188
188
189
case . ack:
189
- // NIO's HTTP2 handler acks for us so this is a no-op.
190
- ( )
190
+ // NIO's HTTP2 handler acks for us so this is a no-op. Log so it doesn't appear that we are
191
+ // ignoring pings.
192
+ self . stateMachine. logger. debug (
193
+ " sending PING frame " ,
194
+ metadata: [ MetadataKey . h2PingAck: " true " ]
195
+ )
191
196
192
197
case . cancelScheduledTimeout:
193
198
self . scheduledClose? . cancel ( )
@@ -197,6 +202,15 @@ internal final class GRPCIdleHandler: ChannelInboundHandler {
197
202
self . schedulePing ( in: delay, timeout: timeout)
198
203
199
204
case let . reply( framePayload) :
205
+ switch framePayload {
206
+ case . ping( _, let ack) :
207
+ self . stateMachine. logger. debug (
208
+ " sending PING frame " ,
209
+ metadata: [ MetadataKey . h2PingAck: " \( ack) " ]
210
+ )
211
+ default :
212
+ ( )
213
+ }
200
214
let frame = HTTP2Frame ( streamID: . rootStream, payload: framePayload)
201
215
self . context? . writeAndFlush ( self . wrapOutboundOut ( frame) , promise: nil )
202
216
@@ -210,6 +224,11 @@ internal final class GRPCIdleHandler: ChannelInboundHandler {
210
224
return
211
225
}
212
226
227
+ self . stateMachine. logger. debug (
228
+ " scheduled keepalive pings " ,
229
+ metadata: [ MetadataKey . intervalMs: " \( delay. milliseconds) " ]
230
+ )
231
+
213
232
self . scheduledPing = self . context? . eventLoop. scheduleRepeatedTask (
214
233
initialDelay: delay,
215
234
delay: delay
@@ -226,6 +245,7 @@ internal final class GRPCIdleHandler: ChannelInboundHandler {
226
245
227
246
private func scheduleClose( in timeout: TimeAmount ) {
228
247
self . scheduledClose = self . context? . eventLoop. scheduleTask ( in: timeout) {
248
+ self . stateMachine. logger. debug ( " keepalive timer expired " )
229
249
self . perform ( operations: self . stateMachine. shutdownNow ( ) )
230
250
}
231
251
}
@@ -318,6 +338,10 @@ internal final class GRPCIdleHandler: ChannelInboundHandler {
318
338
case let . settings( . settings( settings) ) :
319
339
self . perform ( operations: self . stateMachine. receiveSettings ( settings) )
320
340
case let . ping( data, ack) :
341
+ self . stateMachine. logger. debug (
342
+ " received PING frame " ,
343
+ metadata: [ MetadataKey . h2PingAck: " \( ack) " ]
344
+ )
321
345
self . handlePingAction ( self . pingHandler. read ( pingData: data, ack: ack) )
322
346
default :
323
347
// We're not interested in other events.
@@ -350,3 +374,9 @@ extension HTTP2SettingsParameter {
350
374
}
351
375
}
352
376
}
377
+
378
+ extension TimeAmount {
379
+ fileprivate var milliseconds : Int64 {
380
+ self . nanoseconds / 1_000_000
381
+ }
382
+ }
0 commit comments