@@ -201,7 +201,7 @@ func (st *NaiveStrategy) UnrelayedPackets(ctx context.Context, src, dst *Provabl
201201 }, nil
202202}
203203
204- func (st * NaiveStrategy ) ProcessTimeoutPackets (ctx context.Context , src , dst * ProvableChain , sh SyncHeaders , rp * RelayPackets ) ( * RelayPackets , error ) {
204+ func (st * NaiveStrategy ) ProcessTimeoutPackets (ctx context.Context , src , dst * ProvableChain , sh SyncHeaders , rp * RelayPackets ) error {
205205 logger := GetChannelPairLogger (src , dst )
206206 var (
207207 srcPackets PacketInfoList
@@ -219,44 +219,44 @@ func (st *NaiveStrategy) ProcessTimeoutPackets(ctx context.Context, src, dst *Pr
219219 if 0 < len (rp .Src ) {
220220 if h , err := dst .LatestHeight (ctx ); err != nil {
221221 logger .Error ("fail to get dst.LatestHeight" , err )
222- return nil , err
222+ return err
223223 } else {
224224 dstLatestHeight = h
225225 }
226226
227227 if t , err := dst .Timestamp (ctx , dstLatestHeight ); err != nil {
228228 logger .Error ("fail to get dst.Timestamp of latestHeight" , err )
229- return nil , err
229+ return err
230230 } else {
231231 dstLatestTimestamp = uint64 (t .UnixNano ())
232232 }
233233
234234 dstLatestFinalizedHeight = sh .GetLatestFinalizedHeader (dst .ChainID ()).GetHeight ()
235235 if t , err := dst .Timestamp (ctx , dstLatestFinalizedHeight ); err != nil {
236236 logger .Error ("fail to get dst.Timestamp of latestFinalizedHeight" , err )
237- return nil , err
237+ return err
238238 } else {
239239 dstLatestFinalizedTimestamp = uint64 (t .UnixNano ())
240240 }
241241 }
242242 if 0 < len (rp .Dst ) {
243243 if h , err := src .LatestHeight (ctx ); err != nil {
244244 logger .Error ("fail to get src.LatestHeight" , err )
245- return nil , err
245+ return err
246246 } else {
247247 srcLatestHeight = h
248248 }
249249 if t , err := src .Timestamp (ctx , srcLatestHeight ); err != nil {
250250 logger .Error ("fail to get src.Timestamp" , err )
251- return nil , err
251+ return err
252252 } else {
253253 srcLatestTimestamp = uint64 (t .UnixNano ())
254254 }
255255
256256 srcLatestFinalizedHeight = sh .GetLatestFinalizedHeader (src .ChainID ()).GetHeight ()
257257 if t , err := src .Timestamp (ctx , srcLatestFinalizedHeight ); err != nil {
258258 logger .Error ("fail to get src.Timestamp" , err )
259- return nil , err
259+ return err
260260 } else {
261261 srcLatestFinalizedTimestamp = uint64 (t .UnixNano ())
262262 }
@@ -267,16 +267,20 @@ func (st *NaiveStrategy) ProcessTimeoutPackets(ctx context.Context, src, dst *Pr
267267 (p .TimeoutTimestamp != 0 && p .TimeoutTimestamp <= timestamp )
268268 }
269269
270+ var srcTimeoutPacket , dstTimeoutPacket * PacketInfo
270271 for i , p := range rp .Src {
271272 if isTimeout (p , dstLatestFinalizedHeight , dstLatestFinalizedTimestamp ) {
272273 p .TimedOut = true
273274 if src .Path ().GetOrder () == chantypes .ORDERED {
275+ // For ordered channel, a timeout notification will cause the channel to be closed.
276+ // Packets proceeding the timeout packet is relayed first
277+ // so that they can be proceeded before the channel is closed.
274278 if i == 0 {
275- dstPackets = append ( dstPackets , p )
279+ srcTimeoutPacket = p
276280 }
277281 break
278282 } else {
279- dstPackets = append ( dstPackets , p )
283+ srcTimeoutPacket = p
280284 }
281285 } else if isTimeout (p , dstLatestHeight , dstLatestTimestamp ) {
282286 break
@@ -290,11 +294,11 @@ func (st *NaiveStrategy) ProcessTimeoutPackets(ctx context.Context, src, dst *Pr
290294 p .TimedOut = true
291295 if dst .Path ().GetOrder () == chantypes .ORDERED {
292296 if i == 0 {
293- srcPackets = append ( srcPackets , p )
297+ dstTimeoutPacket = p
294298 }
295299 break
296300 } else {
297- srcPackets = append ( srcPackets , p )
301+ dstTimeoutPacket = p
298302 }
299303 } else if (isTimeout (p , srcLatestHeight , srcLatestTimestamp )) {
300304 break
@@ -303,10 +307,15 @@ func (st *NaiveStrategy) ProcessTimeoutPackets(ctx context.Context, src, dst *Pr
303307 dstPackets = append (dstPackets , p )
304308 }
305309 }
306- return & RelayPackets {
307- Src : srcPackets ,
308- Dst : dstPackets ,
309- }, nil
310+ if srcTimeoutPacket != nil {
311+ dstPackets = append (dstPackets , srcTimeoutPacket )
312+ }
313+ if dstTimeoutPacket != nil {
314+ srcPackets = append (dstPackets , dstTimeoutPacket )
315+ }
316+ rp .Src = srcPackets
317+ rp .Dst = dstPackets
318+ return nil
310319}
311320
312321func (st * NaiveStrategy ) RelayPackets (ctx context.Context , src , dst * ProvableChain , rp * RelayPackets , sh SyncHeaders , doExecuteRelaySrc , doExecuteRelayDst bool ) (* RelayMsgs , error ) {
0 commit comments