Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
ollama
Commits
553fa39f
Commit
553fa39f
authored
Jul 18, 2023
by
Michael Yang
Browse files
fix memory leak in create
parent
3e10f902
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
27 additions
and
30 deletions
+27
-30
server/images.go
server/images.go
+27
-30
No files found.
server/images.go
View file @
553fa39f
...
...
@@ -3,7 +3,6 @@ package server
import
(
"bytes"
"crypto/sha256"
"encoding/hex"
"encoding/json"
"errors"
"fmt"
...
...
@@ -42,10 +41,9 @@ type Layer struct {
Size
int
`json:"size"`
}
type
Layer
WithBuff
er
struct
{
type
Layer
Read
er
struct
{
Layer
Buffer
*
bytes
.
Buffer
io
.
Reader
}
type
ConfigV2
struct
{
...
...
@@ -161,7 +159,7 @@ func CreateModel(name string, mf io.Reader, fn func(status string)) error {
return
err
}
var
layers
[]
*
Layer
WithBuff
er
var
layers
[]
*
Layer
Read
er
params
:=
make
(
map
[
string
]
string
)
for
_
,
c
:=
range
commands
{
...
...
@@ -274,7 +272,7 @@ func CreateModel(name string, mf io.Reader, fn func(status string)) error {
return
nil
}
func
removeLayerFromLayers
(
layers
[]
*
Layer
WithBuff
er
,
mediaType
string
)
[]
*
Layer
WithBuff
er
{
func
removeLayerFromLayers
(
layers
[]
*
Layer
Read
er
,
mediaType
string
)
[]
*
Layer
Read
er
{
j
:=
0
for
_
,
l
:=
range
layers
{
if
l
.
MediaType
!=
mediaType
{
...
...
@@ -285,7 +283,7 @@ func removeLayerFromLayers(layers []*LayerWithBuffer, mediaType string) []*Layer
return
layers
[
:
j
]
}
func
SaveLayers
(
layers
[]
*
Layer
WithBuff
er
,
fn
func
(
status
string
),
force
bool
)
error
{
func
SaveLayers
(
layers
[]
*
Layer
Read
er
,
fn
func
(
status
string
),
force
bool
)
error
{
// Write each of the layers to disk
for
_
,
layer
:=
range
layers
{
fp
,
err
:=
GetBlobsPath
(
layer
.
Digest
)
...
...
@@ -303,10 +301,10 @@ func SaveLayers(layers []*LayerWithBuffer, fn func(status string), force bool) e
}
defer
out
.
Close
()
_
,
err
=
io
.
Copy
(
out
,
layer
.
Buffer
)
if
err
!=
nil
{
if
_
,
err
=
io
.
Copy
(
out
,
layer
.
Reader
);
err
!=
nil
{
return
err
}
}
else
{
fn
(
fmt
.
Sprintf
(
"using already created layer %s"
,
layer
.
Digest
))
}
...
...
@@ -315,7 +313,7 @@ func SaveLayers(layers []*LayerWithBuffer, fn func(status string), force bool) e
return
nil
}
func
CreateManifest
(
name
string
,
cfg
*
Layer
WithBuff
er
,
layers
[]
*
Layer
)
error
{
func
CreateManifest
(
name
string
,
cfg
*
Layer
Read
er
,
layers
[]
*
Layer
)
error
{
mp
:=
ParseModelPath
(
name
)
manifest
:=
ManifestV2
{
...
...
@@ -341,7 +339,7 @@ func CreateManifest(name string, cfg *LayerWithBuffer, layers []*Layer) error {
return
os
.
WriteFile
(
fp
,
manifestJSON
,
0
o644
)
}
func
GetLayerWithBufferFromLayer
(
layer
*
Layer
)
(
*
Layer
WithBuff
er
,
error
)
{
func
GetLayerWithBufferFromLayer
(
layer
*
Layer
)
(
*
Layer
Read
er
,
error
)
{
fp
,
err
:=
GetBlobsPath
(
layer
.
Digest
)
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -361,7 +359,7 @@ func GetLayerWithBufferFromLayer(layer *Layer) (*LayerWithBuffer, error) {
return
newLayer
,
nil
}
func
paramsToReader
(
params
map
[
string
]
string
)
(
io
.
Reader
,
error
)
{
func
paramsToReader
(
params
map
[
string
]
string
)
(
io
.
Read
Seek
er
,
error
)
{
opts
:=
api
.
DefaultOptions
()
typeOpts
:=
reflect
.
TypeOf
(
opts
)
...
...
@@ -419,7 +417,7 @@ func paramsToReader(params map[string]string) (io.Reader, error) {
return
bytes
.
NewReader
(
bts
),
nil
}
func
getLayerDigests
(
layers
[]
*
Layer
WithBuff
er
)
([]
string
,
error
)
{
func
getLayerDigests
(
layers
[]
*
Layer
Read
er
)
([]
string
,
error
)
{
var
digests
[]
string
for
_
,
l
:=
range
layers
{
if
l
.
Digest
==
""
{
...
...
@@ -431,22 +429,17 @@ func getLayerDigests(layers []*LayerWithBuffer) ([]string, error) {
}
// CreateLayer creates a Layer object from a given file
func
CreateLayer
(
f
io
.
Reader
)
(
*
LayerWithBuffer
,
error
)
{
buf
:=
new
(
bytes
.
Buffer
)
_
,
err
:=
io
.
Copy
(
buf
,
f
)
if
err
!=
nil
{
return
nil
,
err
}
func
CreateLayer
(
f
io
.
ReadSeeker
)
(
*
LayerReader
,
error
)
{
digest
,
size
:=
GetSHA256Digest
(
f
)
f
.
Seek
(
0
,
0
)
digest
,
size
:=
GetSHA256Digest
(
buf
)
layer
:=
&
LayerWithBuffer
{
layer
:=
&
LayerReader
{
Layer
:
Layer
{
MediaType
:
"application/vnd.docker.image.rootfs.diff.tar"
,
Digest
:
digest
,
Size
:
size
,
},
Buff
er
:
bu
f
,
Read
er
:
f
,
}
return
layer
,
nil
...
...
@@ -609,7 +602,7 @@ func pullModelManifest(mp ModelPath, username, password string) (*ManifestV2, er
return
m
,
err
}
func
createConfigLayer
(
layers
[]
string
)
(
*
Layer
WithBuff
er
,
error
)
{
func
createConfigLayer
(
layers
[]
string
)
(
*
Layer
Read
er
,
error
)
{
// TODO change architecture and OS
config
:=
ConfigV2
{
Architecture
:
"arm64"
,
...
...
@@ -628,22 +621,26 @@ func createConfigLayer(layers []string) (*LayerWithBuffer, error) {
buf
:=
bytes
.
NewBuffer
(
configJSON
)
digest
,
size
:=
GetSHA256Digest
(
buf
)
layer
:=
&
Layer
WithBuff
er
{
layer
:=
&
Layer
Read
er
{
Layer
:
Layer
{
MediaType
:
"application/vnd.docker.container.image.v1+json"
,
Digest
:
digest
,
Size
:
size
,
},
Buff
er
:
buf
,
Read
er
:
buf
,
}
return
layer
,
nil
}
// GetSHA256Digest returns the SHA256 hash of a given buffer and returns it, and the size of buffer
func
GetSHA256Digest
(
data
*
bytes
.
Buffer
)
(
string
,
int
)
{
layerBytes
:=
data
.
Bytes
()
hash
:=
sha256
.
Sum256
(
layerBytes
)
return
"sha256:"
+
hex
.
EncodeToString
(
hash
[
:
]),
len
(
layerBytes
)
func
GetSHA256Digest
(
r
io
.
Reader
)
(
string
,
int
)
{
h
:=
sha256
.
New
()
n
,
err
:=
io
.
Copy
(
h
,
r
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
return
fmt
.
Sprintf
(
"sha256:%x"
,
h
.
Sum
(
nil
)),
int
(
n
)
}
func
startUpload
(
mp
ModelPath
,
username
string
,
password
string
)
(
string
,
error
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment