From 871a2b0f06f602899f8c928ce19d2737a3758e6c Mon Sep 17 00:00:00 2001 From: ahrav Date: Thu, 17 Oct 2024 12:53:40 -0700 Subject: [PATCH] fix timeout (#3460) --- pkg/sources/s3/s3.go | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/pkg/sources/s3/s3.go b/pkg/sources/s3/s3.go index ebd39a1028d4..1ef54391ba3b 100644 --- a/pkg/sources/s3/s3.go +++ b/pkg/sources/s3/s3.go @@ -326,14 +326,20 @@ func (s *Source) pageChunker(ctx context.Context, client *s3.S3, chunksChan chan return nil } - // files break with spaces, must replace with + - // objKey := strings.ReplaceAll(*obj.Key, " ", "+") - ctx, cancel := context.WithTimeout(ctx, time.Second*5) - defer cancel() - res, err := client.GetObjectWithContext(ctx, &s3.GetObjectInput{ - Bucket: &bucket, - Key: obj.Key, - }) + // Use an anonymous function to retrieve the S3 object with a dedicated timeout context. + // This ensures that the timeout is isolated and does not affect any downstream operations. (e.g. HandleFile) + getObject := func() (*s3.GetObjectOutput, error) { + const getObjectTimeout = 5 * time.Second + objCtx, cancel := context.WithTimeout(ctx, getObjectTimeout) + defer cancel() + + return client.GetObjectWithContext(objCtx, &s3.GetObjectInput{ + Bucket: &bucket, + Key: obj.Key, + }) + } + + res, err := getObject() if err != nil { if !strings.Contains(err.Error(), "AccessDenied") { s.log.Error(err, "could not get S3 object", "object", *obj.Key)