From ceccd519e3bf6fb5ccf307734632f91aad73e865 Mon Sep 17 00:00:00 2001 From: viveksharmapoudel Date: Thu, 13 Jul 2023 07:19:39 +0545 Subject: [PATCH] fix: packet delayed ack (#103) * fix: packet delayed ack * fix: seperate write ack from dst packet --- relayer/processor/path_processor_internal.go | 100 +++++++++++-------- relayer/processor/types_internal.go | 19 ++-- 2 files changed, 68 insertions(+), 51 deletions(-) diff --git a/relayer/processor/path_processor_internal.go b/relayer/processor/path_processor_internal.go index 8cf2c711a..70d48386a 100644 --- a/relayer/processor/path_processor_internal.go +++ b/relayer/processor/path_processor_internal.go @@ -209,12 +209,22 @@ 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, @@ -222,8 +232,6 @@ func (pp *PathProcessor) unrelayedPacketFlowMessages( 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) @@ -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) diff --git a/relayer/processor/types_internal.go b/relayer/processor/types_internal.go index 5af8336ad..54ab3ada8 100644 --- a/relayer/processor/types_internal.go +++ b/relayer/processor/types_internal.go @@ -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