Skip to content

Commit

Permalink
rpcenc: Fix double read at eof
Browse files Browse the repository at this point in the history
  • Loading branch information
magik6k committed Apr 28, 2022
1 parent 779e923 commit 43436f7
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 7 deletions.
14 changes: 7 additions & 7 deletions itests/worker_test.go
Expand Up @@ -49,14 +49,14 @@ func TestWorkerDataCid(t *testing.T) {
e, err := worker.Enabled(ctx)
require.NoError(t, err)
require.True(t, e)

pi, err := miner.ComputeDataCid(ctx, 1016, strings.NewReader(strings.Repeat("a", 1016)))
require.NoError(t, err)
require.Equal(t, abi.PaddedPieceSize(1024), pi.Size)
require.Equal(t, "baga6ea4seaqlhznlutptgfwhffupyer6txswamerq5fc2jlwf2lys2mm5jtiaeq", pi.PieceCID.String())

/*
pi, err := miner.ComputeDataCid(ctx, 1016, strings.NewReader(strings.Repeat("a", 1016)))
require.NoError(t, err)
require.Equal(t, abi.PaddedPieceSize(1024), pi.Size)
require.Equal(t, "baga6ea4seaqlhznlutptgfwhffupyer6txswamerq5fc2jlwf2lys2mm5jtiaeq", pi.PieceCID.String())
*/
bigPiece := abi.PaddedPieceSize(16 << 20).Unpadded()
pi, err = miner.ComputeDataCid(ctx, bigPiece, strings.NewReader(strings.Repeat("a", int(bigPiece))))
pi, err := miner.ComputeDataCid(ctx, bigPiece, strings.NewReader(strings.Repeat("a", int(bigPiece))))
require.NoError(t, err)
require.Equal(t, bigPiece.Padded(), pi.Size)
require.Equal(t, "baga6ea4seaqmhoxl2ybw5m2wyd3pt3h4zmp7j52yumzu2rar26twns3uocq7yfa", pi.PieceCID.String())
Expand Down
8 changes: 8 additions & 0 deletions lib/rpcenc/reader.go
Expand Up @@ -211,6 +211,7 @@ type RpcReader struct {
postBody io.ReadCloser // nil on initial head request
next chan *RpcReader // on head will get us the postBody after sending resStart
mustRedirect bool
eof bool

res chan readRes
beginOnce *sync.Once
Expand Down Expand Up @@ -266,6 +267,10 @@ func (w *RpcReader) Read(p []byte) (int, error) {
w.beginPost()
})

if w.eof {
return 0, io.EOF
}

if w.mustRedirect {
return 0, ErrMustRedirect
}
Expand All @@ -276,6 +281,9 @@ func (w *RpcReader) Read(p []byte) (int, error) {

n, err := w.postBody.Read(p)
if err != nil {
if err == io.EOF {
w.eof = true
}
w.closeOnce.Do(func() {
close(w.res)
})
Expand Down

0 comments on commit 43436f7

Please sign in to comment.