mirror of
https://github.com/dogkeeper886/ollama37.git
synced 2025-12-10 07:46:59 +00:00
This commit replaces the old pull implementation in the server package with the new, faster, more robust pull implementation in the registry package. The new endpoint, and now the remove endpoint too, are behind the feature gate "client2" enabled only by setting the OLLAMA_EXPERIMENT environment variable include "client2". Currently, the progress indication is wired to perform the same as the previous implementation to avoid making changes to the CLI, and because the status reports happen at the start of the download, and the end of the write to disk, the progress indication is not as smooth as it could be. This is a known issue and will be addressed in a future change. This implementation may be ~0.5-1.0% slower in rare cases, depending on network and disk speed, but is generally MUCH faster and more robust than the its predecessor in all other cases.
56 lines
1.7 KiB
Go
56 lines
1.7 KiB
Go
package ollama
|
|
|
|
import (
|
|
"context"
|
|
)
|
|
|
|
// Trace is a set of functions that are called to report progress during blob
|
|
// downloads and uploads.
|
|
//
|
|
// Use [WithTrace] to attach a Trace to a context for use with [Registry.Push]
|
|
// and [Registry.Pull].
|
|
type Trace struct {
|
|
// Update is called during [Registry.Push] and [Registry.Pull] to
|
|
// report the progress of blob uploads and downloads.
|
|
//
|
|
// The n argument is the number of bytes transferred so far, and err is
|
|
// any error that has occurred. If n == 0, and err is nil, the download
|
|
// or upload has just started. If err is [ErrCached], the download or
|
|
// upload has been skipped because the blob is already present in the
|
|
// local cache or remote registry, respectively. Otherwise, if err is
|
|
// non-nil, the download or upload has failed. When l.Size == n, and
|
|
// err is nil, the download or upload has completed.
|
|
//
|
|
// A function assigned must be safe for concurrent use. The function is
|
|
// called synchronously and so should not block or take long to run.
|
|
Update func(_ *Layer, n int64, _ error)
|
|
}
|
|
|
|
func (t *Trace) update(l *Layer, n int64, err error) {
|
|
if t.Update != nil {
|
|
t.Update(l, n, err)
|
|
}
|
|
}
|
|
|
|
type traceKey struct{}
|
|
|
|
// WithTrace returns a context derived from ctx that uses t to report trace
|
|
// events.
|
|
func WithTrace(ctx context.Context, t *Trace) context.Context {
|
|
return context.WithValue(ctx, traceKey{}, t)
|
|
}
|
|
|
|
var emptyTrace = &Trace{}
|
|
|
|
// traceFromContext returns the Trace associated with ctx, or an empty Trace if
|
|
// none is found.
|
|
//
|
|
// It never returns nil.
|
|
func traceFromContext(ctx context.Context) *Trace {
|
|
t, _ := ctx.Value(traceKey{}).(*Trace)
|
|
if t == nil {
|
|
return emptyTrace
|
|
}
|
|
return t
|
|
}
|