Skip to content

feat(service): add layer cache for cross-mount dedup#40

Open
chlins wants to merge 1 commit into
mainfrom
feat/cache
Open

feat(service): add layer cache for cross-mount dedup#40
chlins wants to merge 1 commit into
mainfrom
feat/cache

Conversation

@chlins
Copy link
Copy Markdown
Member

@chlins chlins commented May 10, 2026

This pull request introduces a new layer cache hook system to improve layer deduplication and persistence in the model CSI driver, alongside several dependency and tooling updates. The most significant changes are the addition of the layercache_hook implementation and its comprehensive tests, as well as updates to Go versioning and dependencies to ensure compatibility and improved performance.

Layer cache hook implementation and testing:

  • Added pkg/service/layercache_hook.go, which implements a combinedHook and layerCacheHook to manage layer deduplication, cache hits, and persistence across volumes. This ensures that all volumes maintain accurate cache state, even after owner deletion or restarts.
  • Added pkg/service/layercache_hook_test.go with thorough unit tests for the new hook logic, covering cache hits, ownership transfer, deduplication persistence, and edge cases.

Go version and dependency upgrades:

  • Upgraded the Go version to 1.25 in go.mod, build/Dockerfile, and GitHub Actions workflows for both coverage and lint jobs, ensuring the project uses the latest language features and security updates. [1] [2] [3]
  • Updated multiple dependencies in go.mod, including go-git, modctl, go.opentelemetry.io/otel, and others, to newer versions for improved stability, performance, and compatibility. [1] [2] [3] [4]

CI/CD and tooling improvements:

  • Updated the golangci-lint-action version in .github/workflows/lint.yml for better linting performance and reliability.
  • Minor cleanup in workflow scripts, such as removing unnecessary trailing lines.

Test and interface adjustments:

  • Updated test mocks and function signatures in pkg/server/server_test.go to support the new layer cache hook interface and its additional parameters. [1] [2]

These changes collectively enhance the reliability, maintainability, and efficiency of layer handling in the driver, while keeping the codebase up-to-date with the latest Go ecosystem advancements.

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

github-actions Bot commented May 10, 2026

📊 Code Coverage Report

Metric Coverage Threshold Status
Overall 76.6% 70%
Changed lines 93% 90%
📦 Per-package breakdown
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:151:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:155:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:159:                  61.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:17:                   87.5%
github.com/modelpack/model-csi-driver/pkg/config/config.go:236:                  83.3%
github.com/modelpack/model-csi-driver/pkg/config/config.go:249:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:257:                  100.0%
github.com/modelpack/model-csi-driver/pkg/config/config.go:261:                  100.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/layercache.go:110:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:144:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:184:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:204:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:228:             95.8%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:269:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:299:             95.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:332:             90.9%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:351:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:366:             90.9%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:395:             81.2%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:420:             85.7%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:435:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:461:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:55:              100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:83:              100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache.go:93:              100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache_hook.go:116:        100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache_hook.go:130:        100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache_hook.go:136:        100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache_hook.go:27:         100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache_hook.go:39:         100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache_hook.go:60:         100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache_hook.go:69:         100.0%
github.com/modelpack/model-csi-driver/pkg/service/layercache_hook.go:94:         100.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:            68.4%
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:      57.1%
github.com/modelpack/model-csi-driver/pkg/service/puller.go:46:                  100.0%
github.com/modelpack/model-csi-driver/pkg/service/puller.go:54:                  88.5%
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:127:                 100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:136:                 87.5%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:161:                 71.7%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:250:                 77.1%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:28:                  100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:34:                  100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:46:                  100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:63:                  75.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:82:                  79.2%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:100:                    100.0%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:107:                    93.8%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:141:                    100.0%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:180:                    88.9%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:201:                    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)				76.6%

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 Go environment to version 1.25, updates several core dependencies, and introduces a new LayerCache system to optimize model pulls. The cache implements layer-level singleflighting and cross-volume deduplication using hardlinks, with state persisted via layers.json files. Review feedback identifies a critical path traversal vulnerability when resolving layer filepaths from OCI annotations. Additionally, there are concerns regarding the performance impact of frequent synchronous disk I/O for cache persistence, potential thundering herd issues in the concurrency model during context cancellation, and the functional limitations of hardlinking across different filesystems in CSI environments.

if rel == "" {
return ""
}
return filepath.Join(h.targetDir, rel)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

security-high high

The rel path from OCI annotations is untrusted. Joining it directly with h.targetDir is vulnerable to path traversal attacks (e.g., an image providing ../../etc/passwd). Validate that the resolved path remains within the intended target directory.

import (
"context"
"path/filepath"
"sync"
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

Add strings to imports for path traversal validation in targetForDesc.

Suggested change
"sync"
"strings"
"sync"

Comment thread pkg/service/layercache.go
return errors.Wrap(err, "remove stale hardlink target")
}
if err := os.Link(src, dst); err != nil {
return errors.Wrap(err, "create hardlink")
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

os.Link creates a hard link, which is restricted to the same filesystem. In CSI environments, volumes (PVCs) are often backed by different devices or filesystems. Hard linking across them will fail with EXDEV, causing the cache to fall back to a full pull. This significantly limits the effectiveness of cross-volume deduplication unless all volumes share the same underlying host filesystem.

Comment thread pkg/service/layercache.go
}
c.mu.Unlock()

if err := writeLayersFile(volDir, snapshot); err != nil {
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

writeLayersFile is called synchronously for every layer published (including cache hits). This results in frequent and redundant disk I/O for layers.json during a model pull. Consider batching these updates or persisting the mapping once after the entire pull operation is complete to improve performance.

Comment thread pkg/service/layercache.go
select {
case <-ctx.Done():
cond.L.Lock()
cond.Broadcast()
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

Calling cond.Broadcast() on context cancellation wakes up all pullers waiting for this digest, creating a thundering herd problem. Each puller will contend for the lock only to potentially go back to sleep if their own context is still active. A more efficient approach would be to use a per-waiter channel for targeted notification.

@chlins chlins force-pushed the feat/cache branch 2 times, most recently from 506c56c to d9fcc54 Compare May 11, 2026 13:13
Signed-off-by: chlins <chlins.zhang@gmail.com>
@imeoer imeoer self-requested a review May 12, 2026 11:40
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