From 92dc8f72318cdb74911a59e61fc434c5658ed0f0 Mon Sep 17 00:00:00 2001 From: Catherine Date: Fri, 5 Dec 2025 22:59:20 +0000 Subject: [PATCH] Consolidate return values into `BlobMetadata`. NFC --- src/backend.go | 7 ++++++- src/backend_fs.go | 5 ++--- src/backend_s3.go | 6 +++--- src/collect.go | 12 +++++++----- src/main.go | 2 +- src/observe.go | 8 ++++---- src/pages.go | 4 +++- 7 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/backend.go b/src/backend.go index 3dbc759..f00b434 100644 --- a/src/backend.go +++ b/src/backend.go @@ -31,6 +31,11 @@ const ( FeatureCheckDomainMarker BackendFeature = "check-domain-marker" ) +type BlobMetadata struct { + Size int64 + LastModified time.Time +} + type GetManifestOptions struct { // If true and the manifest is past the cache `MaxAge`, `GetManifest` blocks and returns // a fresh object instead of revalidating in background and returning a stale object. @@ -77,7 +82,7 @@ type Backend interface { // Retrieve a blob. Returns `reader, size, mtime, err`. GetBlob(ctx context.Context, name string) ( - reader io.ReadSeeker, size uint64, mtime time.Time, err error, + reader io.ReadSeeker, metadata BlobMetadata, err error, ) // Store a blob. If a blob called `name` already exists, this function returns `nil` without diff --git a/src/backend_fs.go b/src/backend_fs.go index e26d13c..b7efe58 100644 --- a/src/backend_fs.go +++ b/src/backend_fs.go @@ -11,7 +11,6 @@ import ( "os" "path/filepath" "strings" - "time" ) type FSBackend struct { @@ -118,7 +117,7 @@ func (fs *FSBackend) EnableFeature(ctx context.Context, feature BackendFeature) func (fs *FSBackend) GetBlob( ctx context.Context, name string, ) ( - reader io.ReadSeeker, size uint64, mtime time.Time, err error, + reader io.ReadSeeker, metadata BlobMetadata, err error, ) { blobPath := filepath.Join(splitBlobName(name)...) stat, err := fs.blobRoot.Stat(blobPath) @@ -134,7 +133,7 @@ func (fs *FSBackend) GetBlob( err = fmt.Errorf("open: %w", err) return } - return file, uint64(stat.Size()), stat.ModTime(), nil + return file, BlobMetadata{int64(stat.Size()), stat.ModTime()}, nil } func (fs *FSBackend) PutBlob(ctx context.Context, name string, data []byte) error { diff --git a/src/backend_s3.go b/src/backend_s3.go index ef9a7ec..1def010 100644 --- a/src/backend_s3.go +++ b/src/backend_s3.go @@ -266,7 +266,7 @@ func (s3 *S3Backend) EnableFeature(ctx context.Context, feature BackendFeature) func (s3 *S3Backend) GetBlob( ctx context.Context, name string, ) ( - reader io.ReadSeeker, size uint64, mtime time.Time, err error, + reader io.ReadSeeker, metadata BlobMetadata, err error, ) { loader := func(ctx context.Context, name string) (*CachedBlob, error) { logc.Printf(ctx, "s3: get blob %s\n", name) @@ -316,8 +316,8 @@ func (s3 *S3Backend) GetBlob( } } else { reader = bytes.NewReader(cached.blob) - size = uint64(len(cached.blob)) - mtime = cached.mtime + metadata.Size = int64(len(cached.blob)) + metadata.LastModified = cached.mtime } return } diff --git a/src/collect.go b/src/collect.go index fec36cc..7cad534 100644 --- a/src/collect.go +++ b/src/collect.go @@ -5,7 +5,6 @@ import ( "context" "fmt" "io" - "time" ) type Flusher interface { @@ -66,16 +65,19 @@ func CollectTar( case Type_ExternalFile: var blobReader io.Reader - var blobMtime time.Time + var blobMetadata BlobMetadata var blobData []byte - blobReader, _, blobMtime, err = backend.GetBlob(context, string(entry.Data)) + blobReader, blobMetadata, err = backend.GetBlob(context, string(entry.Data)) + if err != nil { + return + } + blobData, err = io.ReadAll(blobReader) if err != nil { return } - blobData, _ = io.ReadAll(blobReader) header.Typeflag = tar.TypeReg header.Mode = 0644 - header.ModTime = blobMtime + header.ModTime = blobMetadata.LastModified err = appendFile(&header, blobData, entry.GetTransform()) case Type_Symlink: diff --git a/src/main.go b/src/main.go index f5c1b11..70bb478 100644 --- a/src/main.go +++ b/src/main.go @@ -287,7 +287,7 @@ func Main() { logc.Fatalln(ctx, err) } - reader, _, _, err := backend.GetBlob(ctx, *getBlob) + reader, _, err := backend.GetBlob(ctx, *getBlob) if err != nil { logc.Fatalln(ctx, err) } diff --git a/src/observe.go b/src/observe.go index 14781f7..352e643 100644 --- a/src/observe.go +++ b/src/observe.go @@ -344,13 +344,13 @@ func (backend *observedBackend) EnableFeature(ctx context.Context, feature Backe func (backend *observedBackend) GetBlob( ctx context.Context, name string, ) ( - reader io.ReadSeeker, size uint64, mtime time.Time, err error, + reader io.ReadSeeker, metadata BlobMetadata, err error, ) { span, ctx := ObserveFunction(ctx, "GetBlob", "blob.name", name) - if reader, size, mtime, err = backend.inner.GetBlob(ctx, name); err == nil { - ObserveData(ctx, "blob.size", size) + if reader, metadata, err = backend.inner.GetBlob(ctx, name); err == nil { + ObserveData(ctx, "blob.size", metadata.Size) blobsRetrievedCount.Inc() - blobsRetrievedBytes.Add(float64(size)) + blobsRetrievedBytes.Add(float64(metadata.Size)) } span.Finish() return diff --git a/src/pages.go b/src/pages.go index 4fcaea1..fb93d26 100644 --- a/src/pages.go +++ b/src/pages.go @@ -292,13 +292,15 @@ func getPage(w http.ResponseWriter, r *http.Request) error { w.WriteHeader(http.StatusNotModified) return nil } else { - reader, _, mtime, err = backend.GetBlob(r.Context(), string(entry.Data)) + var metadata BlobMetadata + reader, metadata, err = backend.GetBlob(r.Context(), string(entry.Data)) if err != nil { ObserveError(err) // all storage errors must be reported w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, "internal server error: %s\n", err) return err } + mtime = metadata.LastModified w.Header().Set("ETag", etag) } } else if entry.GetType() == Type_Directory {