Skip to content

Commit d6240b1

Browse files
committed
[TE-5476] Thread context.Context through UploadToS3 for cancellation support
Add context.Context parameter to UploadToS3 and use http.NewRequestWithContext so the S3 upload can be cancelled or timed out externally. Also fixes tarball size output to use stderr instead of stdout for consistency with all other status messages.
1 parent 26e7b52 commit d6240b1

4 files changed

Lines changed: 11 additions & 9 deletions

File tree

internal/command/backfill_commit_metadata.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ func BackfillCommitMetadata(ctx context.Context, cfg *config.Config, runner git.
227227
return fmt.Errorf("presigning upload: %w", err)
228228
}
229229
fmt.Fprintln(os.Stderr, "Uploading to S3...")
230-
if err := upload.UploadToS3(tarPath, presigned.Form); err != nil {
230+
if err := upload.UploadToS3(ctx, tarPath, presigned.Form); err != nil {
231231
removeTarball = false
232232
fmt.Fprintf(os.Stderr, "Tarball retained at %s\n", tarPath)
233233
return fmt.Errorf("uploading to S3: %w", err)

internal/command/upload_commit_metadata.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func UploadCommitMetadata(ctx context.Context, cfg *config.Config) error {
4646

4747
// 5. Upload to S3
4848
fmt.Fprintln(os.Stderr, "Uploading to S3...")
49-
if err := upload.UploadToS3(cfg.UploadFile, presigned.Form); err != nil {
49+
if err := upload.UploadToS3(ctx, cfg.UploadFile, presigned.Form); err != nil {
5050
return fmt.Errorf("uploading to S3: %w", err)
5151
}
5252

internal/upload/s3.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package upload
22

33
import (
44
"bytes"
5+
"context"
56
"fmt"
67
"io"
78
"mime/multipart"
@@ -32,7 +33,7 @@ type PresignedUploadForm struct {
3233
//
3334
// The multipart body is buffered in memory so the HTTP client can set the
3435
// Content-Length header, which S3 requires for presigned POST uploads.
35-
func UploadToS3(filePath string, form PresignedUploadForm) error {
36+
func UploadToS3(ctx context.Context, filePath string, form PresignedUploadForm) error {
3637
debug.Printf("Uploading %s to %s", filePath, form.URL)
3738

3839
var buf bytes.Buffer
@@ -71,7 +72,7 @@ func UploadToS3(filePath string, form PresignedUploadForm) error {
7172
return fmt.Errorf("closing multipart writer: %w", err)
7273
}
7374

74-
req, err := http.NewRequest(form.Method, form.URL, &buf)
75+
req, err := http.NewRequestWithContext(ctx, form.Method, form.URL, &buf)
7576
if err != nil {
7677
return fmt.Errorf("creating upload request: %w", err)
7778
}

internal/upload/s3_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package upload
22

33
import (
4+
"context"
45
"io"
56
"mime"
67
"mime/multipart"
@@ -66,7 +67,7 @@ func TestUploadToS3_SendsFormFields(t *testing.T) {
6667
FileInput: "file",
6768
}
6869

69-
if err := UploadToS3(tmpFile, form); err != nil {
70+
if err := UploadToS3(context.Background(), tmpFile, form); err != nil {
7071
t.Fatalf("UploadToS3 error: %v", err)
7172
}
7273

@@ -113,7 +114,7 @@ func TestUploadToS3_SendsFile(t *testing.T) {
113114
FileInput: "file",
114115
}
115116

116-
if err := UploadToS3(tmpFile, form); err != nil {
117+
if err := UploadToS3(context.Background(), tmpFile, form); err != nil {
117118
t.Fatalf("UploadToS3 error: %v", err)
118119
}
119120

@@ -160,7 +161,7 @@ func TestUploadToS3_FieldOrder(t *testing.T) {
160161
FileInput: "file",
161162
}
162163

163-
if err := UploadToS3(tmpFile, form); err != nil {
164+
if err := UploadToS3(context.Background(), tmpFile, form); err != nil {
164165
t.Fatalf("UploadToS3 error: %v", err)
165166
}
166167

@@ -196,7 +197,7 @@ func TestUploadToS3_ServerError(t *testing.T) {
196197
FileInput: "file",
197198
}
198199

199-
err := UploadToS3(tmpFile, form)
200+
err := UploadToS3(context.Background(), tmpFile, form)
200201
if err == nil {
201202
t.Fatal("expected error, got nil")
202203
}
@@ -218,7 +219,7 @@ func TestUploadToS3_FileNotFound(t *testing.T) {
218219
FileInput: "file",
219220
}
220221

221-
err := UploadToS3("/nonexistent/file.tar.gz", form)
222+
err := UploadToS3(context.Background(), "/nonexistent/file.tar.gz", form)
222223
if err == nil {
223224
t.Fatal("expected error for missing file, got nil")
224225
}

0 commit comments

Comments
 (0)