Skip to content

Commit

Permalink
fix: packet delayed ack (#103)
Browse files Browse the repository at this point in the history
* fix: packet delayed ack

* fix: seperate write ack from dst packet
  • Loading branch information
viveksharmapoudel authored Jul 13, 2023
1 parent 7cc09d5 commit ceccd51
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 51 deletions.
100 changes: 58 additions & 42 deletions relayer/processor/path_processor_internal.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,21 +209,29 @@ func (pp *PathProcessor) unrelayedPacketFlowMessages(
for seq, info := range pathEndPacketFlowMessages.DstMsgRecvPacket {
deletePreInitIfMatches(info)
toDeleteSrc[chantypes.EventTypeSendPacket] = append(toDeleteSrc[chantypes.EventTypeSendPacket], seq)
}
// if len(info.Ack) == 0 {
// // have recv_packet but not write_acknowledgement yet. skip for now.
// continue
// }
// // msg is received by dst chain, but no ack yet. Need to relay ack from dst to src!
// ackMsg := packetIBCMessage{
// eventType: chantypes.EventTypeAcknowledgePacket,
// info: info,
// }
// msgs = append(msgs, ackMsg)
// }

if len(info.Ack) == 0 {
// have recv_packet but not write_acknowledgement yet. skip for now.
continue
}
// msg is received by dst chain, but no ack yet. Need to relay ack from dst to src!
processRemovals()

for _, info := range pathEndPacketFlowMessages.DstMsgWriteAcknowledgementPacket {
ackMsg := packetIBCMessage{
eventType: chantypes.EventTypeAcknowledgePacket,
info: info,
}
msgs = append(msgs, ackMsg)
}

processRemovals()

for seq, msgTimeoutRequest := range pathEndPacketFlowMessages.DstMsgRequestTimeout {
toDeleteSrc[chantypes.EventTypeSendPacket] = append(toDeleteSrc[chantypes.EventTypeSendPacket], seq)
toDeleteDst[common.EventTimeoutRequest] = append(toDeleteDst[common.EventTimeoutRequest], seq)
Expand Down Expand Up @@ -993,46 +1001,54 @@ func (pp *PathProcessor) processLatestMessages(ctx context.Context, cancel func(

for i, pair := range channelPairs {
// Append acks into recv packet info if present
pathEnd1DstMsgRecvPacket := pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeRecvPacket]
for seq, ackInfo := range pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeWriteAck] {
if recvPacketInfo, ok := pathEnd1DstMsgRecvPacket[seq]; ok {
recvPacketInfo.Ack = ackInfo.Ack
pathEnd1DstMsgRecvPacket[seq] = recvPacketInfo
}
}

pathEnd2DstMsgRecvPacket := pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeRecvPacket]
for seq, ackInfo := range pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeWriteAck] {
if recvPacketInfo, ok := pathEnd2DstMsgRecvPacket[seq]; ok {
recvPacketInfo.Ack = ackInfo.Ack
pathEnd2DstMsgRecvPacket[seq] = recvPacketInfo
}
}
// pathEnd1DstMsgRecvPacket :=
// for seq, ackInfo := range pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeWriteAck] {
// if recvPacketInfo, ok := pathEnd1DstMsgRecvPacket[seq]; ok {
// recvPacketInfo.Ack = ackInfo.Ack
// pathEnd1DstMsgRecvPacket[seq] = recvPacketInfo
// continue
// }
// pathEnd1DstMsgRecvPacket[seq] = ackInfo

// }

// pathEnd2DstMsgRecvPacket := pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeRecvPacket]
// for seq, ackInfo := range pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeWriteAck] {
// if recvPacketInfo, ok := pathEnd2DstMsgRecvPacket[seq]; ok {
// recvPacketInfo.Ack = ackInfo.Ack
// pathEnd2DstMsgRecvPacket[seq] = recvPacketInfo
// continue
// }

// pathEnd2DstMsgRecvPacket[seq] = ackInfo
// }

pathEnd1PacketFlowMessages := pathEndPacketFlowMessages{
Src: pp.pathEnd1,
Dst: pp.pathEnd2,
ChannelKey: pair.pathEnd1ChannelKey,
SrcPreTransfer: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][preInitKey],
SrcMsgTransfer: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeSendPacket],
DstMsgRecvPacket: pathEnd1DstMsgRecvPacket,
SrcMsgAcknowledgement: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeAcknowledgePacket],
SrcMsgTimeout: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeTimeoutPacket],
SrcMsgTimeoutOnClose: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeTimeoutPacketOnClose],
DstMsgRequestTimeout: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][common.EventTimeoutRequest],
Src: pp.pathEnd1,
Dst: pp.pathEnd2,
ChannelKey: pair.pathEnd1ChannelKey,
SrcPreTransfer: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][preInitKey],
SrcMsgTransfer: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeSendPacket],
DstMsgRecvPacket: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeRecvPacket],
DstMsgWriteAcknowledgementPacket: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeWriteAck],
SrcMsgAcknowledgement: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeAcknowledgePacket],
SrcMsgTimeout: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeTimeoutPacket],
SrcMsgTimeoutOnClose: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeTimeoutPacketOnClose],
DstMsgRequestTimeout: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][common.EventTimeoutRequest],
}

pathEnd2PacketFlowMessages := pathEndPacketFlowMessages{
Src: pp.pathEnd2,
Dst: pp.pathEnd1,
ChannelKey: pair.pathEnd2ChannelKey,
SrcPreTransfer: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd1ChannelKey][preInitKey],
SrcMsgTransfer: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeSendPacket],
DstMsgRecvPacket: pathEnd2DstMsgRecvPacket,
SrcMsgAcknowledgement: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeAcknowledgePacket],
SrcMsgTimeout: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeTimeoutPacket],
SrcMsgTimeoutOnClose: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeTimeoutPacketOnClose],
DstMsgRequestTimeout: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][common.EventTimeoutRequest],
Src: pp.pathEnd2,
Dst: pp.pathEnd1,
ChannelKey: pair.pathEnd2ChannelKey,
SrcPreTransfer: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd1ChannelKey][preInitKey],
SrcMsgTransfer: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeSendPacket],
DstMsgRecvPacket: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeRecvPacket],
DstMsgWriteAcknowledgementPacket: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeWriteAck],
SrcMsgAcknowledgement: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeAcknowledgePacket],
SrcMsgTimeout: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeTimeoutPacket],
SrcMsgTimeoutOnClose: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeTimeoutPacketOnClose],
DstMsgRequestTimeout: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][common.EventTimeoutRequest],
}

pathEnd1ProcessRes[i] = pp.unrelayedPacketFlowMessages(ctx, pathEnd1PacketFlowMessages)
Expand Down
19 changes: 10 additions & 9 deletions relayer/processor/types_internal.go
Original file line number Diff line number Diff line change
Expand Up @@ -393,15 +393,16 @@ type clientICQProcessingCache map[provider.ClientICQQueryID]processingMessage
// contains MsgRecvPacket from counterparty
// entire packet flow
type pathEndPacketFlowMessages struct {
Src *pathEndRuntime
Dst *pathEndRuntime
ChannelKey ChannelKey
SrcPreTransfer PacketSequenceCache
SrcMsgTransfer PacketSequenceCache
DstMsgRecvPacket PacketSequenceCache
SrcMsgAcknowledgement PacketSequenceCache
SrcMsgTimeout PacketSequenceCache
SrcMsgTimeoutOnClose PacketSequenceCache
Src *pathEndRuntime
Dst *pathEndRuntime
ChannelKey ChannelKey
SrcPreTransfer PacketSequenceCache
SrcMsgTransfer PacketSequenceCache
DstMsgRecvPacket PacketSequenceCache
DstMsgWriteAcknowledgementPacket PacketSequenceCache
SrcMsgAcknowledgement PacketSequenceCache
SrcMsgTimeout PacketSequenceCache
SrcMsgTimeoutOnClose PacketSequenceCache

// Adding for Icon chain
DstMsgRequestTimeout PacketSequenceCache
Expand Down

0 comments on commit ceccd51

Please sign in to comment.