Skip to content

Commit 8931e01

Browse files
Handle data-sent and data-queued events in the TransferFinished state (#233)
* handle data-sent and data-queued events in the TransferFinished state * go fmt
1 parent 0e3b2a1 commit 8931e01

File tree

2 files changed

+49
-8
lines changed

2 files changed

+49
-8
lines changed

channels/channels_fsm.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,29 @@ var ChannelEvents = fsm.Events{
6060
chst.AddLog("received data")
6161
return nil
6262
}),
63-
fsm.Event(datatransfer.DataSent).FromMany(transferringStates...).ToNoChange().Action(func(chst *internal.ChannelState) error {
64-
chst.AddLog("")
65-
return nil
66-
}),
63+
64+
fsm.Event(datatransfer.DataSent).
65+
FromMany(transferringStates...).ToNoChange().
66+
From(datatransfer.TransferFinished).ToNoChange().
67+
Action(func(chst *internal.ChannelState) error {
68+
chst.AddLog("")
69+
return nil
70+
}),
71+
6772
fsm.Event(datatransfer.DataSentProgress).FromMany(transferringStates...).ToNoChange().
6873
Action(func(chst *internal.ChannelState, delta uint64) error {
6974
chst.Sent += delta
7075
chst.AddLog("sending data")
7176
return nil
7277
}),
73-
fsm.Event(datatransfer.DataQueued).FromMany(transferringStates...).ToNoChange().Action(func(chst *internal.ChannelState) error {
74-
chst.AddLog("")
75-
return nil
76-
}),
78+
79+
fsm.Event(datatransfer.DataQueued).
80+
FromMany(transferringStates...).ToNoChange().
81+
From(datatransfer.TransferFinished).ToNoChange().
82+
Action(func(chst *internal.ChannelState) error {
83+
chst.AddLog("")
84+
return nil
85+
}),
7786
fsm.Event(datatransfer.DataQueuedProgress).FromMany(transferringStates...).ToNoChange().
7887
Action(func(chst *internal.ChannelState, delta uint64) error {
7988
chst.Queued += delta

channels/channels_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,38 @@ func TestChannels(t *testing.T) {
138138
require.Equal(t, state.Status(), datatransfer.Ongoing)
139139
})
140140

141+
t.Run("datasent/queued when transfer is already finished", func(t *testing.T) {
142+
ds := dss.MutexWrap(datastore.NewMapDatastore())
143+
dir := os.TempDir()
144+
cidLists, err := cidlists.NewCIDLists(dir)
145+
require.NoError(t, err)
146+
channelList, err := channels.New(ds, cidLists, notifier, decoderByType, decoderByType, &fakeEnv{}, peers[0])
147+
require.NoError(t, err)
148+
err = channelList.Start(ctx)
149+
require.NoError(t, err)
150+
151+
chid, err := channelList.CreateNew(peers[0], tid1, cids[0], selector, fv1, peers[0], peers[0], peers[1])
152+
require.NoError(t, err)
153+
checkEvent(ctx, t, received, datatransfer.Open)
154+
155+
// move the channel to `TransferFinished` state.
156+
require.NoError(t, channelList.FinishTransfer(chid))
157+
state := checkEvent(ctx, t, received, datatransfer.FinishTransfer)
158+
require.Equal(t, datatransfer.TransferFinished, state.Status())
159+
160+
// send a data-sent event and ensure it's a no-op
161+
_, err = channelList.DataSent(chid, cids[1], 1)
162+
require.NoError(t, err)
163+
state = checkEvent(ctx, t, received, datatransfer.DataSent)
164+
require.Equal(t, datatransfer.TransferFinished, state.Status())
165+
166+
// send a data-queued event and ensure it's a no-op.
167+
_, err = channelList.DataQueued(chid, cids[1], 1)
168+
require.NoError(t, err)
169+
state = checkEvent(ctx, t, received, datatransfer.DataQueued)
170+
require.Equal(t, datatransfer.TransferFinished, state.Status())
171+
})
172+
141173
t.Run("updating send/receive values", func(t *testing.T) {
142174
ds := dss.MutexWrap(datastore.NewMapDatastore())
143175
dir := os.TempDir()

0 commit comments

Comments
 (0)