|
@@ -36,7 +36,6 @@ import (
|
|
"golang.org/x/sync/errgroup"
|
|
"golang.org/x/sync/errgroup"
|
|
|
|
|
|
"github.com/ollama/ollama/server/internal/cache/blob"
|
|
"github.com/ollama/ollama/server/internal/cache/blob"
|
|
- "github.com/ollama/ollama/server/internal/chunks"
|
|
|
|
"github.com/ollama/ollama/server/internal/internal/backoff"
|
|
"github.com/ollama/ollama/server/internal/internal/backoff"
|
|
"github.com/ollama/ollama/server/internal/internal/names"
|
|
"github.com/ollama/ollama/server/internal/internal/names"
|
|
|
|
|
|
@@ -500,7 +499,7 @@ func (r *Registry) Pull(ctx context.Context, name string) error {
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
- req.Header.Set("Range", fmt.Sprintf("bytes=%s", cs.Chunk))
|
|
|
|
|
|
+ req.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", cs.Chunk.Start, cs.Chunk.End))
|
|
res, err := sendRequest(r.client(), req)
|
|
res, err := sendRequest(r.client(), req)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
@@ -794,7 +793,7 @@ func (r *Registry) chunksums(ctx context.Context, name string, l *Layer) iter.Se
|
|
yield(chunksum{}, err)
|
|
yield(chunksum{}, err)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- chunk, err := chunks.Parse(s.Bytes())
|
|
|
|
|
|
+ chunk, err := parseChunk(s.Bytes())
|
|
if err != nil {
|
|
if err != nil {
|
|
yield(chunksum{}, fmt.Errorf("invalid chunk range for digest %s: %q", d, s.Bytes()))
|
|
yield(chunksum{}, fmt.Errorf("invalid chunk range for digest %s: %q", d, s.Bytes()))
|
|
return
|
|
return
|
|
@@ -1059,3 +1058,23 @@ func splitExtended(s string) (scheme, name, digest string) {
|
|
}
|
|
}
|
|
return scheme, s, digest
|
|
return scheme, s, digest
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+// parseChunk parses a string in the form "start-end" and returns the Chunk.
|
|
|
|
+func parseChunk[S ~string | ~[]byte](s S) (blob.Chunk, error) {
|
|
|
|
+ startPart, endPart, found := strings.Cut(string(s), "-")
|
|
|
|
+ if !found {
|
|
|
|
+ return blob.Chunk{}, fmt.Errorf("chunks: invalid range %q: missing '-'", s)
|
|
|
|
+ }
|
|
|
|
+ start, err := strconv.ParseInt(startPart, 10, 64)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return blob.Chunk{}, fmt.Errorf("chunks: invalid start to %q: %v", s, err)
|
|
|
|
+ }
|
|
|
|
+ end, err := strconv.ParseInt(endPart, 10, 64)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return blob.Chunk{}, fmt.Errorf("chunks: invalid end to %q: %v", s, err)
|
|
|
|
+ }
|
|
|
|
+ if start > end {
|
|
|
|
+ return blob.Chunk{}, fmt.Errorf("chunks: invalid range %q: start > end", s)
|
|
|
|
+ }
|
|
|
|
+ return blob.Chunk{Start: start, End: end}, nil
|
|
|
|
+}
|