diff --git a/codex/download.go b/codex/download.go index 5794849..73a89b6 100644 --- a/codex/download.go +++ b/codex/download.go @@ -30,6 +30,7 @@ import ( "encoding/json" "fmt" "io" + "sync/atomic" "unsafe" ) @@ -216,10 +217,12 @@ func (node CodexNode) DownloadStream(ctx context.Context, cid string, options Do defer close(done) channelError := make(chan error, 1) + var cancelled atomic.Bool go func() { select { case <-ctx.Done(): channelError <- node.DownloadCancel(cid) + cancelled.Store(true) case <-done: // Nothing to do, download finished } @@ -236,7 +239,11 @@ func (node CodexNode) DownloadStream(ctx context.Context, cid string, options Do if err != nil { if cancelError != nil { - return fmt.Errorf("download canceled: %v, but failed to cancel download session: %v", ctx.Err(), cancelError) + return fmt.Errorf("context canceled: %v, but failed to cancel download session: %v", ctx.Err(), cancelError) + } + + if cancelled.Load() { + return context.Canceled } return err diff --git a/codex/download_test.go b/codex/download_test.go index edfc2a5..66f873f 100644 --- a/codex/download_test.go +++ b/codex/download_test.go @@ -111,11 +111,11 @@ func TestDownloadStreamCancelled(t *testing.T) { err := <-channelError if err == nil { - t.Fatal("UploadFile should have been canceled") + t.Fatal("DownloadStream should have been canceled") } - if err.Error() != "Failed to stream file: Stream EOF!" { - t.Fatalf("UploadFile returned unexpected error: %v", err) + if err.Error() != context.Canceled.Error() { + t.Fatalf("DownloadStream returned unexpected error: %v", err) } } diff --git a/codex/upload.go b/codex/upload.go index 532879d..a14b876 100644 --- a/codex/upload.go +++ b/codex/upload.go @@ -28,10 +28,10 @@ import "C" import ( "bytes" "context" - "errors" "fmt" "io" "os" + "sync/atomic" "unsafe" ) @@ -187,7 +187,7 @@ func (node CodexNode) UploadReader(ctx context.Context, options UploadOptions, r if cancelErr := node.UploadCancel(sessionId); cancelErr != nil { return "", fmt.Errorf("upload canceled: %v, but failed to cancel upload session: %v", ctx.Err(), cancelErr) } - return "", errors.New("upload canceled") + return "", context.Canceled default: // continue } @@ -313,10 +313,12 @@ func (node CodexNode) UploadFile(ctx context.Context, options UploadOptions) (st defer close(done) channelError := make(chan error, 1) + var cancelled atomic.Bool go func() { select { case <-ctx.Done(): channelError <- node.UploadCancel(sessionId) + cancelled.Store(true) case <-done: // Nothing to do, upload finished } @@ -333,8 +335,13 @@ func (node CodexNode) UploadFile(ctx context.Context, options UploadOptions) (st if err != nil { if cancelErr != nil { - return "", fmt.Errorf("upload canceled: %v, but failed to cancel upload session: %v", ctx.Err(), cancelErr) + return "", fmt.Errorf("context canceled: %v, but failed to cancel upload session: %v", ctx.Err(), cancelErr) } + + if cancelled.Load() { + return "", context.Canceled + } + return "", err } diff --git a/codex/upload_test.go b/codex/upload_test.go index 857064e..e1f3805 100644 --- a/codex/upload_test.go +++ b/codex/upload_test.go @@ -62,8 +62,8 @@ func TestUploadReaderCancel(t *testing.T) { t.Fatal("UploadReader should have been canceled") } - if err.Error() != "upload canceled" { - t.Fatalf("UploadReader returned unexpected error: %v", err) + if err.Error() != context.Canceled.Error() { + t.Fatalf("UploadReader returned unexpected error: %v expected %v", err, context.Canceled) } } @@ -134,7 +134,7 @@ func TestUploadFileCancel(t *testing.T) { t.Fatal("UploadFile should have been canceled") } - if err.Error() != "Failed to upload the file: Failed to stream the file: Stream Closed!" { + if err.Error() != context.Canceled.Error() { t.Fatalf("UploadFile returned unexpected error: %v", err) } }