Skip to content

feat(cas): add node-local content-addressable store for model blobs#38

Closed
chlins wants to merge 1 commit into
mainfrom
refactor/storage
Closed

feat(cas): add node-local content-addressable store for model blobs#38
chlins wants to merge 1 commit into
mainfrom
refactor/storage

Conversation

@chlins
Copy link
Copy Markdown
Member

@chlins chlins commented May 9, 2026

This pull request introduces a new content-addressable storage (CAS) implementation for model layer blobs and upgrades the project to Go 1.25, along with a broad set of dependency updates. The new pkg/cas/cas.go file provides a robust, deduplicated, and reference-counted local blob store with concurrency-safe download deduplication. The Go version bump is reflected across the build, CI, and module files, and several dependencies are updated to more recent versions for improved compatibility and security.

Major features and improvements:

1. New Content-Addressable Store Implementation

  • Adds pkg/cas/cas.go, a new package implementing a local CAS for model layer blobs. Features include deduplication via hardlinks, per-owner reference counting, concurrency-safe download deduplication, and atomic publishing of blobs. The API supports claiming references, importing blobs, and releasing references, with careful handling of concurrent downloads and cleanup of stale temporary files.

2. Go Version Upgrade

  • Updates the Go version to 1.25 in go.mod, the Docker build file, and the GitHub Actions workflow for coverage. This ensures the project uses the latest language features and improvements. [1] [2] [3]

3. Dependency Updates

  • Upgrades various dependencies in go.mod to newer versions, including major libraries such as go-git, modctl, go.opentelemetry.io/otel, google.golang.org/grpc, and others. These updates improve security, compatibility, and performance. [1] [2] [3] [4]

4. Minor CI Cleanup

  • Removes a trailing blank line in the coverage workflow to tidy up the configuration.

@chlins chlins added the enhancement New feature or request label May 9, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 9, 2026

📊 Code Coverage Report

Metric Coverage Threshold Status
Overall 69.7% 70%
Changed lines 51% 90%
📦 Per-package breakdown
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:105:                        50.0%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:122:                        66.7%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:127:                        50.0%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:132:                        66.7%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:152:                        53.6%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:206:                        46.7%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:221:                        50.0%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:225:                        63.6%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:239:                        50.0%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:256:                        39.5%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:299:                        66.7%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:310:                        40.6%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:337:                        48.7%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:369:                        50.0%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:372:                        60.0%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:386:                        75.0%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:45:                         100.0%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:60:                         100.0%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:63:                         100.0%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:67:                         100.0%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:72:                         100.0%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:77:                         75.0%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:87:                         100.0%
github.com/modelpack/model-csi-driver/pkg/cas/cas.go:96:                         57.1%
github.com/modelpack/model-csi-driver/pkg/cas/hook.go:111:                       100.0%
github.com/modelpack/model-csi-driver/pkg/cas/hook.go:122:                       100.0%
github.com/modelpack/model-csi-driver/pkg/cas/hook.go:134:                       100.0%
github.com/modelpack/model-csi-driver/pkg/cas/hook.go:135:                       0.0%
github.com/modelpack/model-csi-driver/pkg/cas/hook.go:37:                        100.0%
github.com/modelpack/model-csi-driver/pkg/cas/hook.go:52:                        100.0%
github.com/modelpack/model-csi-driver/pkg/cas/hook.go:87:                        100.0%
github.com/modelpack/model-csi-driver/pkg/client/grpc.go:104:                    80.0%
github.com/modelpack/model-csi-driver/pkg/client/grpc.go:116:                    80.0%
github.com/modelpack/model-csi-driver/pkg/client/grpc.go:31:                     85.7%
github.com/modelpack/model-csi-driver/pkg/client/grpc.go:60:                     75.0%
github.com/modelpack/model-csi-driver/pkg/client/grpc.go:69:                     80.0%
github.com/modelpack/model-csi-driver/pkg/client/grpc.go:81:                     80.0%
github.com/modelpack/model-csi-driver/pkg/client/grpc.go:92:                     80.0%
github.com/modelpack/model-csi-driver/pkg/client/http.go:105:                    100.0%
github.com/modelpack/model-csi-driver/pkg/client/http.go:23:                     80.0%
github.com/modelpack/model-csi-driver/pkg/client/http.go:49:                     74.3%
github.com/modelpack/model-csi-driver/pkg/client/request.go:12:                  100.0%
github.com/modelpack/model-csi-driver/pkg/client/request.go:34:                  75.0%
github.com/modelpack/model-csi-driver/pkg/client/request.go:50:                  66.7%
github.com/modelpack/model-csi-driver/pkg/client/request.go:65:                  75.0%
github.com/modelpack/model-csi-driver/pkg/config/auth/docker.go:112:             87.5%
github.com/modelpack/model-csi-driver/pkg/config/auth/docker.go:26:              100.0%
github.com/modelpack/model-csi-driver/pkg/config/auth/docker.go:32:              100.0%
github.com/modelpack/model-csi-driver/pkg/config/auth/docker.go:55:              100.0%
github.com/modelpack/model-csi-driver/pkg/config/auth/docker.go:66:              92.9%
github.com/modelpack/model-csi-driver/pkg/config/auth/docker.go:88:              92.3%
github.com/modelpack/model-csi-driver/pkg/config/auth/keychain.go:20:            100.0%
github.com/modelpack/model-csi-driver/pkg/config/auth/keychain.go:31:            100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:102:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:107:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:112:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:117:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:122:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:127:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:132:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:137:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:142:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:147:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:152:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:156:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:160:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:164:                  58.5%
github.com/modelpack/model-csi-driver/pkg/config/config.go:17:                   87.5%
github.com/modelpack/model-csi-driver/pkg/config/config.go:241:                  83.3%
github.com/modelpack/model-csi-driver/pkg/config/config.go:254:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:262:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:266:                  75.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:70:                   100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:74:                   100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:78:                   100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:82:                   100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:86:                   100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:90:                   100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:94:                   100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:98:                   100.0%
github.com/modelpack/model-csi-driver/pkg/config/watcher.go:13:                  65.2%
github.com/modelpack/model-csi-driver/pkg/logger/logger.go:19:                   100.0%
github.com/modelpack/model-csi-driver/pkg/logger/logger.go:29:                   100.0%
github.com/modelpack/model-csi-driver/pkg/logger/logger.go:41:                   100.0%
github.com/modelpack/model-csi-driver/pkg/metrics/mount_collector.go:21:         100.0%
github.com/modelpack/model-csi-driver/pkg/metrics/mount_collector.go:34:         100.0%
github.com/modelpack/model-csi-driver/pkg/metrics/mount_collector.go:38:         100.0%
github.com/modelpack/model-csi-driver/pkg/metrics/mount_collector.go:42:         83.3%
github.com/modelpack/model-csi-driver/pkg/metrics/registry.go:117:               100.0%
github.com/modelpack/model-csi-driver/pkg/metrics/registry.go:126:               100.0%
github.com/modelpack/model-csi-driver/pkg/metrics/registry.go:135:               100.0%
github.com/modelpack/model-csi-driver/pkg/metrics/registry.go:146:               100.0%
github.com/modelpack/model-csi-driver/pkg/metrics/registry.go:24:                100.0%
github.com/modelpack/model-csi-driver/pkg/metrics/serve.go:26:                   100.0%
github.com/modelpack/model-csi-driver/pkg/metrics/serve.go:37:                   90.9%
github.com/modelpack/model-csi-driver/pkg/metrics/serve.go:59:                   83.3%
github.com/modelpack/model-csi-driver/pkg/mounter/builder.go:39:                 100.0%
github.com/modelpack/model-csi-driver/pkg/mounter/builder.go:50:                 100.0%
github.com/modelpack/model-csi-driver/pkg/mounter/builder.go:54:                 100.0%
github.com/modelpack/model-csi-driver/pkg/mounter/builder.go:59:                 100.0%
github.com/modelpack/model-csi-driver/pkg/mounter/builder.go:64:                 100.0%
github.com/modelpack/model-csi-driver/pkg/mounter/builder.go:69:                 100.0%
github.com/modelpack/model-csi-driver/pkg/mounter/builder.go:74:                 100.0%
github.com/modelpack/model-csi-driver/pkg/mounter/builder.go:82:                 100.0%
github.com/modelpack/model-csi-driver/pkg/mounter/builder.go:88:                 80.0%
github.com/modelpack/model-csi-driver/pkg/mounter/mounter.go:15:                 100.0%
github.com/modelpack/model-csi-driver/pkg/mounter/mounter.go:26:                 66.7%
github.com/modelpack/model-csi-driver/pkg/mounter/mounter.go:37:                 90.9%
github.com/modelpack/model-csi-driver/pkg/mounter/mounter.go:57:                 71.4%
github.com/modelpack/model-csi-driver/pkg/mounter/mounter.go:81:                 83.3%
github.com/modelpack/model-csi-driver/pkg/provider/provider.go:15:               100.0%
github.com/modelpack/model-csi-driver/pkg/service/artifact.go:11:                100.0%
github.com/modelpack/model-csi-driver/pkg/service/cache.go:119:                  85.7%
github.com/modelpack/model-csi-driver/pkg/service/cache.go:135:                  85.7%
github.com/modelpack/model-csi-driver/pkg/service/cache.go:28:                   100.0%
github.com/modelpack/model-csi-driver/pkg/service/cache.go:37:                   73.9%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:101:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:115:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:122:             76.2%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:157:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:164:             50.0%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:189:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:196:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:203:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:210:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:217:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:22:              84.0%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:249:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:256:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:263:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:270:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/controller.go:62:              91.3%
github.com/modelpack/model-csi-driver/pkg/service/controller_local.go:143:       79.3%
github.com/modelpack/model-csi-driver/pkg/service/controller_local.go:184:       28.1%
github.com/modelpack/model-csi-driver/pkg/service/controller_local.go:25:        57.3%
github.com/modelpack/model-csi-driver/pkg/service/controller_remote.go:134:      0.0%
github.com/modelpack/model-csi-driver/pkg/service/controller_remote.go:199:      0.0%
github.com/modelpack/model-csi-driver/pkg/service/controller_remote.go:34:       100.0%
github.com/modelpack/model-csi-driver/pkg/service/controller_remote.go:46:       0.0%
github.com/modelpack/model-csi-driver/pkg/service/controller_remote.go:60:       0.0%
github.com/modelpack/model-csi-driver/pkg/service/dynamic_server.go:107:         66.7%
github.com/modelpack/model-csi-driver/pkg/service/dynamic_server.go:151:         71.4%
github.com/modelpack/model-csi-driver/pkg/service/dynamic_server.go:190:         88.9%
github.com/modelpack/model-csi-driver/pkg/service/dynamic_server.go:46:          100.0%
github.com/modelpack/model-csi-driver/pkg/service/dynamic_server.go:54:          82.4%
github.com/modelpack/model-csi-driver/pkg/service/dynamic_server.go:84:          83.3%
github.com/modelpack/model-csi-driver/pkg/service/dynamic_server_handler.go:124: 83.3%
github.com/modelpack/model-csi-driver/pkg/service/dynamic_server_handler.go:156: 90.9%
github.com/modelpack/model-csi-driver/pkg/service/dynamic_server_handler.go:185: 85.7%
github.com/modelpack/model-csi-driver/pkg/service/dynamic_server_handler.go:203: 100.0%
github.com/modelpack/model-csi-driver/pkg/service/dynamic_server_handler.go:27:  83.3%
github.com/modelpack/model-csi-driver/pkg/service/dynamic_server_handler.go:38:  100.0%
github.com/modelpack/model-csi-driver/pkg/service/dynamic_server_handler.go:56:  80.0%
github.com/modelpack/model-csi-driver/pkg/service/identity.go:21:                100.0%
github.com/modelpack/model-csi-driver/pkg/service/identity.go:41:                100.0%
github.com/modelpack/model-csi-driver/pkg/service/identity.go:9:                 100.0%
github.com/modelpack/model-csi-driver/pkg/service/kube.go:14:                    0.0%
github.com/modelpack/model-csi-driver/pkg/service/kube.go:25:                    0.0%
github.com/modelpack/model-csi-driver/pkg/service/kube.go:34:                    0.0%
github.com/modelpack/model-csi-driver/pkg/service/model.go:114:                  89.5%
github.com/modelpack/model-csi-driver/pkg/service/model.go:157:                  91.7%
github.com/modelpack/model-csi-driver/pkg/service/model.go:177:                  100.0%
github.com/modelpack/model-csi-driver/pkg/service/model.go:27:                   80.0%
github.com/modelpack/model-csi-driver/pkg/service/model.go:48:                   100.0%
github.com/modelpack/model-csi-driver/pkg/service/model.go:60:                   100.0%
github.com/modelpack/model-csi-driver/pkg/service/model.go:68:                   100.0%
github.com/modelpack/model-csi-driver/pkg/service/model.go:96:                   100.0%
github.com/modelpack/model-csi-driver/pkg/service/node.go:123:                   94.4%
github.com/modelpack/model-csi-driver/pkg/service/node.go:154:                   66.7%
github.com/modelpack/model-csi-driver/pkg/service/node.go:202:                   94.4%
github.com/modelpack/model-csi-driver/pkg/service/node.go:233:                   100.0%
github.com/modelpack/model-csi-driver/pkg/service/node.go:241:                   100.0%
github.com/modelpack/model-csi-driver/pkg/service/node.go:249:                   100.0%
github.com/modelpack/model-csi-driver/pkg/service/node.go:269:                   100.0%
github.com/modelpack/model-csi-driver/pkg/service/node.go:26:                    100.0%
github.com/modelpack/model-csi-driver/pkg/service/node.go:34:                    100.0%
github.com/modelpack/model-csi-driver/pkg/service/node.go:42:                    100.0%
github.com/modelpack/model-csi-driver/pkg/service/node.go:46:                    100.0%
github.com/modelpack/model-csi-driver/pkg/service/node.go:50:                    48.8%
github.com/modelpack/model-csi-driver/pkg/service/node_dynamic.go:18:            73.3%
github.com/modelpack/model-csi-driver/pkg/service/node_dynamic.go:52:            76.0%
github.com/modelpack/model-csi-driver/pkg/service/node_static.go:16:             81.8%
github.com/modelpack/model-csi-driver/pkg/service/node_static.go:42:             69.2%
github.com/modelpack/model-csi-driver/pkg/service/node_static_inline.go:18:      0.0%
github.com/modelpack/model-csi-driver/pkg/service/node_static_inline.go:54:      62.5%
github.com/modelpack/model-csi-driver/pkg/service/puller.go:49:                  100.0%
github.com/modelpack/model-csi-driver/pkg/service/puller.go:56:                  26.9%
github.com/modelpack/model-csi-driver/pkg/service/quota.go:21:                   94.1%
github.com/modelpack/model-csi-driver/pkg/service/quota.go:49:                   100.0%
github.com/modelpack/model-csi-driver/pkg/service/quota.go:55:                   100.0%
github.com/modelpack/model-csi-driver/pkg/service/quota.go:67:                   84.2%
github.com/modelpack/model-csi-driver/pkg/service/service.go:41:                 100.0%
github.com/modelpack/model-csi-driver/pkg/service/service.go:45:                 0.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:129:                 100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:141:                 80.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:151:                 87.5%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:176:                 72.2%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:269:                 77.1%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:29:                  100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:35:                  100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:47:                  100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:64:                  100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:80:                  76.9%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:100:                    100.0%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:107:                    87.5%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:143:                    100.0%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:178:                    88.9%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:199:                    100.0%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:28:                     100.0%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:34:                     100.0%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:46:                     100.0%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:53:                     100.0%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:69:                     100.0%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:76:                     80.0%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:87:                     80.0%
github.com/modelpack/model-csi-driver/pkg/status/status.go:110:                  87.5%
github.com/modelpack/model-csi-driver/pkg/status/status.go:125:                  83.3%
github.com/modelpack/model-csi-driver/pkg/status/status.go:136:                  100.0%
github.com/modelpack/model-csi-driver/pkg/status/status.go:51:                   75.0%
github.com/modelpack/model-csi-driver/pkg/status/status.go:68:                   100.0%
github.com/modelpack/model-csi-driver/pkg/status/status.go:74:                   66.7%
github.com/modelpack/model-csi-driver/pkg/status/status.go:92:                   100.0%
github.com/modelpack/model-csi-driver/pkg/tracing/tracing.go:22:                 85.7%
github.com/modelpack/model-csi-driver/pkg/tracing/tracing.go:36:                 55.6%
github.com/modelpack/model-csi-driver/pkg/tracing/tracing.go:72:                 100.0%
github.com/modelpack/model-csi-driver/pkg/tracing/tracing.go:79:                 81.8%
github.com/modelpack/model-csi-driver/pkg/utils/utils.go:16:                     100.0%
github.com/modelpack/model-csi-driver/pkg/utils/utils.go:34:                     75.0%
github.com/modelpack/model-csi-driver/pkg/utils/utils.go:54:                     81.8%

total:											(statements)				69.7%

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request upgrades the project to Go 1.25, updates several dependencies, and introduces a node-local content-addressable store (CAS) for model layer blobs. The CAS implementation uses hardlinks for deduplication and reference counting to manage blob lifecycles. Integration hooks are added to the pull process to short-circuit downloads on cache hits. Review feedback recommends using standard library functions for hex validation, handling ignored errors during blob import and reference release, and utilizing error aggregation when releasing multiple layers.

Comment thread pkg/cas/cas.go Outdated
Comment on lines +101 to +106
for i := 0; i < len(trimmed); i++ {
c := trimmed[i]
if !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) {
return ""
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The manual validation for the hex-encoded digest can be simplified and made more robust by using hex.DecodeString from the standard library. This avoids manual character checking and is more idiomatic.

		if _, err := hex.DecodeString(trimmed); err != nil {
			return ""
		}

Comment thread pkg/cas/cas.go
Comment on lines +199 to +200
_ = s.ReleaseLayer(context.Background(), digest, ownerKey)
return false, ctx.Err()
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The error from s.ReleaseLayer is ignored. If releasing the layer fails, the reference will be leaked, which contradicts the intention of the comment on line 198. This error should be handled, for example by logging it or wrapping it with the context error, to aid in debugging.

				if releaseErr := s.ReleaseLayer(context.Background(), digest, ownerKey); releaseErr != nil {
					return false, errors.Wrapf(ctx.Err(), "while also failing to release ref: %v", releaseErr)
				}
				return false, ctx.Err()

Comment thread pkg/cas/cas.go
Comment on lines +354 to +371
var firstErr error
for _, e := range entries {
name := e.Name()
if !strings.HasSuffix(name, ".refs") {
continue
}
digest := decodeDigestFromRefsName(name)
if digest == "" {
continue
}
if _, err := os.Stat(filepath.Join(blobsRoot(s.root), name, ownerKey)); err != nil {
continue
}
if err := s.ReleaseLayer(ctx, digest, ownerKey); err != nil && firstErr == nil {
firstErr = err
}
}
return firstErr
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This function only returns the first error encountered during the loop. If multiple calls to ReleaseLayer fail, all but the first error will be silently ignored. It would be more robust to collect all errors and return them, for example by using errors.Join (available in Go 1.20+).

Suggested change
var firstErr error
for _, e := range entries {
name := e.Name()
if !strings.HasSuffix(name, ".refs") {
continue
}
digest := decodeDigestFromRefsName(name)
if digest == "" {
continue
}
if _, err := os.Stat(filepath.Join(blobsRoot(s.root), name, ownerKey)); err != nil {
continue
}
if err := s.ReleaseLayer(ctx, digest, ownerKey); err != nil && firstErr == nil {
firstErr = err
}
}
return firstErr
var errs []error
for _, e := range entries {
name := e.Name()
if !strings.HasSuffix(name, ".refs") {
continue
}
digest := decodeDigestFromRefsName(name)
if digest == "" {
continue
}
if _, err := os.Stat(filepath.Join(blobsRoot(s.root), name, ownerKey)); err != nil {
continue
}
if err := s.ReleaseLayer(ctx, digest, ownerKey); err != nil {
errs = append(errs, err)
}
}
return errors.Join(errs...)

Comment thread pkg/cas/hook.go
// Best-effort: an Import failure leaves the extracted file in place,
// so the volume still works; we just miss the cache opportunity.
// Import wakes followers internally on both paths.
_ = h.store.Import(h.ctx, desc.Digest.String(), dst)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The error from h.store.Import is ignored. While the comment states this is a best-effort operation, silently failing to import a blob into the cache can lead to missed optimization opportunities and makes debugging difficult. It would be beneficial to log this error to provide visibility into why a blob might not be cached.

@chlins chlins force-pushed the refactor/storage branch 4 times, most recently from ae66783 to dfdee47 Compare May 9, 2026 08:08
Signed-off-by: chlins <chlins.zhang@gmail.com>
@chlins chlins force-pushed the refactor/storage branch from dfdee47 to 6bf39b8 Compare May 9, 2026 08:28
@chlins chlins closed this May 9, 2026
@chlins chlins deleted the refactor/storage branch May 10, 2026 07:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant