Skip to content

feat(service): add content-addressed ModelStore with GC#37

Closed
chlins wants to merge 1 commit into
mainfrom
feat/store
Closed

feat(service): add content-addressed ModelStore with GC#37
chlins wants to merge 1 commit into
mainfrom
feat/store

Conversation

@chlins
Copy link
Copy Markdown
Member

@chlins chlins commented May 8, 2026

Fixes: #35

This pull request introduces a node-local, content-addressed shared cache for model artifacts, called ModelStore, and significantly refactors how volume directories are released and garbage collected. It also adds comprehensive tests for the new caching and GC behavior, ensuring robust integration with the worker logic. The changes improve deduplication of model pulls, minimize disk usage, and ensure that cached artifacts are garbage collected only when no longer referenced by any volume.

Key changes:

Model Caching and Deduplication

  • Introduced the ModelStore in pkg/service/model_store.go, a shared, content-addressed cache for model artifacts that deduplicates concurrent pulls and exposes payloads to volumes via hardlinks. It uses per-digest locking and filesystem reference counting for concurrency and GC.

Volume Release and Garbage Collection

  • Refactored volume unpublish logic in both dynamic and static inline volume paths (pkg/service/node_dynamic.go, pkg/service/node_static_inline.go) to use a new ReleaseVolumeTree method, which not only removes the volume directory but also triggers garbage collection of unreferenced cache entries. [1] [2]
  • Added comprehensive tests in pkg/service/pullmodel_test.go to verify that cached model artifacts are shared across volumes, garbage collected when no longer referenced, and robust against various error conditions.

Testing and Mocking Improvements

  • Enhanced the test setup by updating the mock puller to create placeholder files, allowing the model store logic to be fully exercised in tests. Digest resolution is now deterministic in tests to avoid real registry interactions. [1] [2]

Minor Cleanups

  • Removed an unused os import from pkg/service/node_static_inline.go for clarity.

These changes collectively provide a robust, efficient, and well-tested mechanism for model artifact caching, deduplication, and cleanup in the CSI driver.

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

github-actions Bot commented May 8, 2026

📊 Code Coverage Report

Metric Coverage Threshold Status
Overall 74.2% 70%
Changed lines 92% 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:                  68.0%
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:                  71.4%
github.com/modelpack/model-csi-driver/pkg/service/cache.go:135:                  85.7%
github.com/modelpack/model-csi-driver/pkg/service/cache.go:28:                   75.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/model_store.go:113:            100.0%
github.com/modelpack/model-csi-driver/pkg/service/model_store.go:144:            100.0%
github.com/modelpack/model-csi-driver/pkg/service/model_store.go:180:            85.7%
github.com/modelpack/model-csi-driver/pkg/service/model_store.go:214:            88.9%
github.com/modelpack/model-csi-driver/pkg/service/model_store.go:37:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/model_store.go:45:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/model_store.go:56:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/model_store.go:64:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/model_store.go:68:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/model_store.go:72:             100.0%
github.com/modelpack/model-csi-driver/pkg/service/model_store.go:81:             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:            73.7%
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:17:      0.0%
github.com/modelpack/model-csi-driver/pkg/service/node_static_inline.go:53:      71.4%
github.com/modelpack/model-csi-driver/pkg/service/puller.go:42:                  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:110:                 100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:127:                 87.5%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:152:                 82.1%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:203:                 100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:212:                 87.5%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:237:                 92.2%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:30:                  100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:355:                 77.1%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:36:                  100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:48:                  100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:59:                  100.0%
github.com/modelpack/model-csi-driver/pkg/service/worker.go:93:                  100.0%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:100:                    100.0%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:107:                    86.7%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:139:                    100.0%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:174:                    88.9%
github.com/modelpack/model-csi-driver/pkg/status/hook.go:195:                    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:                     100.0%
github.com/modelpack/model-csi-driver/pkg/status/status.go:113:                  87.5%
github.com/modelpack/model-csi-driver/pkg/status/status.go:128:                  83.3%
github.com/modelpack/model-csi-driver/pkg/status/status.go:139:                  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:71:                   100.0%
github.com/modelpack/model-csi-driver/pkg/status/status.go:77:                   66.7%
github.com/modelpack/model-csi-driver/pkg/status/status.go:95:                   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)				74.2%

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 introduces a node-local, content-addressed ModelStore to deduplicate model artifact pulls and reduce disk footprint using hardlinks. It also integrates this store into the Worker pull and delete logic, ensuring that cached data is reused across volumes and garbage collected when no longer referenced. Feedback highlights a critical compilation error due to a naming conflict between the standard library errors package and github.com/pkg/errors, specifically regarding the use of errors.Is. Additionally, it is suggested to initialize the modctlBackend once during Worker creation rather than on every digest resolution for better efficiency.

"syscall"

"github.com/containerd/containerd/pkg/kmutex"
"github.com/pkg/errors"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

high

There is a naming conflict between the standard library errors package and github.com/pkg/errors. The code uses errors.Is (from stdlib) at line 243, but only github.com/pkg/errors is imported as errors. This will cause a compilation error as github.com/pkg/errors does not contain the Is function. You should import the standard library errors package and alias github.com/pkg/errors to something like pkgerrors to avoid this conflict.

Comment thread pkg/service/worker.go

if pullErr != nil {
switch {
case errors.Is(pullErr, context.Canceled):
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

high

Similar to the issue in model_store.go, the use of errors.Is here will fail to compile because errors refers to github.com/pkg/errors, which does not implement Is. You must import the standard library errors package and alias the third-party one.

Comment thread pkg/service/worker.go Outdated
Comment on lines +55 to +80
type Worker struct {
cfg *config.Config
newPuller func(ctx context.Context, pullCfg *config.PullConfig, hook *status.Hook, diskQuotaChecker *DiskQuotaChecker) Puller
sm *status.StatusManager
inflight singleflight.Group
contextMap *ContextMap
kmutex kmutex.KeyedLocker
cfg *config.Config
newPuller func(ctx context.Context, pullCfg *config.PullConfig, hook *status.Hook, diskQuotaChecker *DiskQuotaChecker) Puller
sm *status.StatusManager
store *ModelStore
// resolveDigest returns the manifest digest of reference. Exposed as a
// field so tests can stub it without going through the network.
resolveDigest func(ctx context.Context, reference string) (string, error)
inflight singleflight.Group
contextMap *ContextMap
kmutex kmutex.KeyedLocker
}

func NewWorker(cfg *config.Config, sm *status.StatusManager) (*Worker, error) {
return &Worker{
w := &Worker{
cfg: cfg,
newPuller: NewPuller,
sm: sm,
store: NewModelStore(cfg.Get().RootDir),
inflight: singleflight.Group{},
contextMap: NewContextMap(),
kmutex: kmutex.New(),
}, nil
}
w.resolveDigest = w.defaultResolveDigest
return w, 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

The defaultResolveDigest method creates a new modctlBackend instance on every call. If this backend performs any significant initialization or resource allocation, it is more efficient to create it once during Worker initialization and reuse it. This also simplifies the defaultResolveDigest implementation.

type Worker struct {
	cfg       *config.Config
	newPuller func(ctx context.Context, pullCfg *config.PullConfig, hook *status.Hook, diskQuotaChecker *DiskQuotaChecker) Puller
	sm        *status.StatusManager
	store     *ModelStore
	backend   modctlBackend.Backend
	// resolveDigest returns the manifest digest of reference. Exposed as a
	// field so tests can stub it without going through the network.
	resolveDigest func(ctx context.Context, reference string) (string, error)
	inflight      singleflight.Group
	contextMap    *ContextMap
	kmutex        kmutex.KeyedLocker
}

func NewWorker(cfg *config.Config, sm *status.StatusManager) (*Worker, error) {
	b, err := modctlBackend.New("")
	if err != nil {
		return nil, errors.Wrap(err, "create modctl backend")
	}
	w := &Worker{
		cfg:        cfg,
		newPuller:  NewPuller,
		sm:         sm,
		store:      NewModelStore(cfg.Get().RootDir),
		backend:    b,
		inflight:   singleflight.Group{},
		contextMap: NewContextMap(),
		kmutex:     kmutex.New(),
	}
	w.resolveDigest = w.defaultResolveDigest
	return w, nil
}

@chlins chlins force-pushed the feat/store branch 7 times, most recently from aeedfe7 to 9b90531 Compare May 8, 2026 07:58
Signed-off-by: chlins <chlins.zhang@gmail.com>
@chlins chlins closed this May 8, 2026
@chlins chlins deleted the feat/store branch May 9, 2026 03:28
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.

Deduplicate concurrent pulls for identical model references across pods with node-level singleflight

1 participant