From 6cfac34689143e4613369e4903cf10fb57d3fd4e Mon Sep 17 00:00:00 2001 From: benjamin <ben@elixxir.io> Date: Mon, 3 Oct 2022 13:52:54 -0700 Subject: [PATCH] fixed a bug when handling round updates from the network --- channels/adminListener.go | 2 +- channels/adminListener_test.go | 8 ++++---- channels/joinedChannel_test.go | 2 +- channels/sendTracker.go | 8 ++++++-- channels/sendTracker_test.go | 15 +++++++++++---- channels/userListener.go | 2 +- channels/userListener_test.go | 10 +++++----- 7 files changed, 29 insertions(+), 18 deletions(-) diff --git a/channels/adminListener.go b/channels/adminListener.go index 421b4ac9f..d9e203f1c 100644 --- a/channels/adminListener.go +++ b/channels/adminListener.go @@ -40,7 +40,7 @@ func (al *adminListener) Listen(payload []byte, } //check if we sent the message, ignore triggering if we sent - if al.checkSent(msgID) { + if al.checkSent(msgID, round) { return } diff --git a/channels/adminListener_test.go b/channels/adminListener_test.go index 1b6f06e8a..cb571d572 100644 --- a/channels/adminListener_test.go +++ b/channels/adminListener_test.go @@ -77,7 +77,7 @@ func TestAdminListener_Listen(t *testing.T) { al := adminListener{ chID: chID, trigger: dummy.triggerAdminEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } // Call the listener @@ -138,7 +138,7 @@ func TestAdminListener_Listen_BadRound(t *testing.T) { al := adminListener{ chID: chID, trigger: dummy.triggerAdminEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } // Call the listener @@ -170,7 +170,7 @@ func TestAdminListener_Listen_BadChannelMessage(t *testing.T) { al := adminListener{ chID: chID, trigger: dummy.triggerAdminEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } // Call the listener @@ -217,7 +217,7 @@ func TestAdminListener_Listen_BadSizedBroadcast(t *testing.T) { al := adminListener{ chID: chID, trigger: dummy.triggerAdminEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } // Call the listener diff --git a/channels/joinedChannel_test.go b/channels/joinedChannel_test.go index a8a21f666..e3bee24de 100644 --- a/channels/joinedChannel_test.go +++ b/channels/joinedChannel_test.go @@ -490,7 +490,7 @@ func Test_loadJoinedChannel(t *testing.T) { } loadedJc, err := loadJoinedChannel(ch.ReceptionID, m.kv, m.net, m.rng, - m.events, m.broadcastMaker, func(messageID cryptoChannel.MessageID) bool { + m.events, m.broadcastMaker, func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }) if err != nil { diff --git a/channels/sendTracker.go b/channels/sendTracker.go index ec366b1e6..0678993a7 100644 --- a/channels/sendTracker.go +++ b/channels/sendTracker.go @@ -70,7 +70,7 @@ type sendTracker struct { // messageReceiveFunc is a function type for sendTracker.MessageReceive so it // can be mocked for testing where used -type messageReceiveFunc func(messageID cryptoChannel.MessageID) bool +type messageReceiveFunc func(messageID cryptoChannel.MessageID, r rounds.Round) bool // loadSendTracker loads a sent tracker, restoring from disk. It will register a // function with the cmix client, delayed on when the network goes healthy, @@ -342,7 +342,7 @@ func (st *sendTracker) handleSend(uuid uint64, // was sent by this user. If it was, the correct signal is sent to the event // model and the function returns true, notifying the caller to not process // the message -func (st *sendTracker) MessageReceive(messageID cryptoChannel.MessageID) bool { +func (st *sendTracker) MessageReceive(messageID cryptoChannel.MessageID, round rounds.Round) bool { st.mux.RLock() //skip if already added @@ -374,6 +374,10 @@ func (st *sendTracker) MessageReceive(messageID cryptoChannel.MessageID) bool { st.byRound[msgData.RoundID] = newRoundList } + ts := mutateTimestamp(round.Timestamps[states.QUEUED], messageID) + go st.updateStatus(msgData.UUID, messageID, ts, + round, Delivered) + if err := st.storeSent(); err != nil { jww.FATAL.Panicf("failed to store the updated sent list: %+v", err) } diff --git a/channels/sendTracker_test.go b/channels/sendTracker_test.go index 305e9084f..a90926f33 100644 --- a/channels/sendTracker_test.go +++ b/channels/sendTracker_test.go @@ -8,6 +8,7 @@ import ( "gitlab.com/elixxir/client/storage/versioned" cryptoChannel "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/ekv" + "gitlab.com/elixxir/primitives/states" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" "gitlab.com/xx_network/primitives/netTime" @@ -45,6 +46,13 @@ func (mc *mockClient) RemoveHealthCallback(uint64) {} func TestSendTracker_MessageReceive(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) uuidNum := uint64(0) + rid := id.Round(2) + + r := rounds.Round{ + ID: rid, + Timestamps: make(map[states.Round]time.Time), + } + r.Timestamps[states.QUEUED] = time.Now() trigger := func(chID *id.ID, umi *userMessageInternal, ts time.Time, receptionID receptionID.EphemeralIdentity, round rounds.Round, status SentStatus) (uint64, error) { @@ -62,12 +70,11 @@ func TestSendTracker_MessageReceive(t *testing.T) { st := loadSendTracker(&mockClient{}, kv, trigger, nil, updateStatus) mid := cryptoChannel.MakeMessageID([]byte("hello"), cid) - process := st.MessageReceive(mid) + process := st.MessageReceive(mid, r) if process { t.Fatalf("Did not receive expected result from MessageReceive") } - rid := id.Round(2) uuid, err := st.denotePendingSend(cid, &userMessageInternal{ userMessage: &UserMessage{}, channelMessage: &ChannelMessage{ @@ -87,7 +94,7 @@ func TestSendTracker_MessageReceive(t *testing.T) { if err != nil { t.Fatalf(err.Error()) } - process = st.MessageReceive(mid) + process = st.MessageReceive(mid, r) if !process { t.Fatalf("Did not receive expected result from MessageReceive") } @@ -109,7 +116,7 @@ func TestSendTracker_MessageReceive(t *testing.T) { ID: rid, State: 1, }) - process = st.MessageReceive(mid) + process = st.MessageReceive(mid, r) if !process { t.Fatalf("Did not receive expected result from MessageReceive") } diff --git a/channels/userListener.go b/channels/userListener.go index 98bcffd47..dad5075fd 100644 --- a/channels/userListener.go +++ b/channels/userListener.go @@ -42,7 +42,7 @@ func (ul *userListener) Listen(payload []byte, msgID := umi.GetMessageID() //check if we sent the message, ignore triggering if we sent - if ul.checkSent(msgID) { + if ul.checkSent(msgID, round) { return } diff --git a/channels/userListener_test.go b/channels/userListener_test.go index fa0c53692..23d8ae8c1 100644 --- a/channels/userListener_test.go +++ b/channels/userListener_test.go @@ -99,7 +99,7 @@ func TestUserListener_Listen(t *testing.T) { chID: chID, name: ns, trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } //call the listener @@ -184,7 +184,7 @@ func TestUserListener_Listen_BadUserSig(t *testing.T) { chID: chID, name: ns, trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } //call the listener @@ -247,7 +247,7 @@ func TestUserListener_Listen_BadRound(t *testing.T) { chID: chID, name: ns, trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } //call the listener @@ -280,7 +280,7 @@ func TestUserListener_Listen_BadMessage(t *testing.T) { chID: chID, name: ns, trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } //call the listener @@ -345,7 +345,7 @@ func TestUserListener_Listen_BadSizedBroadcast(t *testing.T) { chID: chID, name: ns, trigger: dummy.triggerEvent, - checkSent: func(messageID cryptoChannel.MessageID) bool { return false }, + checkSent: func(messageID cryptoChannel.MessageID, r rounds.Round) bool { return false }, } //call the listener -- GitLab