Skip to content

Commit bf0c4a4

Browse files
authored
optimize: improve pull process and switch the sha256 library to simd (#103)
optimize: improve pull process and switch the sha256 library to sha256-simd Signed-off-by: chlins <[email protected]>
1 parent 85b3c2f commit bf0c4a4

File tree

12 files changed

+58
-37
lines changed

12 files changed

+58
-37
lines changed

cmd/root.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ package cmd
1818

1919
import (
2020
"os"
21+
"os/signal"
22+
"syscall"
2123

2224
"github.com/CloudNativeAI/modctl/pkg/config"
23-
"github.com/sirupsen/logrus"
25+
2426
"github.com/spf13/cobra"
2527
"github.com/spf13/viper"
2628
)
@@ -36,15 +38,21 @@ var rootCmd = &cobra.Command{
3638
SilenceUsage: true,
3739
FParseErrWhitelist: cobra.FParseErrWhitelist{UnknownFlags: true},
3840
RunE: func(cmd *cobra.Command, args []string) error {
39-
logrus.Debug("modctl is running")
40-
4141
return nil
4242
},
4343
}
4444

4545
// Execute adds all child commands to the root command and sets flags appropriately.
4646
// This is called by main.main(). It only needs to happen once to the rootCmd.
4747
func Execute() {
48+
sig := make(chan os.Signal, 1)
49+
signal.Notify(sig, os.Interrupt, syscall.SIGTERM)
50+
51+
go func() {
52+
<-sig
53+
os.Exit(1)
54+
}()
55+
4856
if err := rootCmd.Execute(); err != nil {
4957
os.Exit(1)
5058
}

go.mod

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ require (
99
github.com/distribution/reference v0.6.0
1010
github.com/dustin/go-humanize v1.0.1
1111
github.com/emirpasic/gods v1.18.1
12+
github.com/minio/sha256-simd v1.0.1
1213
github.com/opencontainers/go-digest v1.0.0
1314
github.com/opencontainers/image-spec v1.1.0
14-
github.com/sirupsen/logrus v1.9.3
1515
github.com/spf13/cobra v1.9.1
1616
github.com/spf13/viper v1.19.0
1717
github.com/stretchr/testify v1.10.0
@@ -40,6 +40,7 @@ require (
4040
github.com/hashicorp/hcl v1.0.1-vault-5 // indirect
4141
github.com/inconshreveable/mousetrap v1.1.0 // indirect
4242
github.com/klauspost/compress v1.17.11 // indirect
43+
github.com/klauspost/cpuid/v2 v2.2.3 // indirect
4344
github.com/magiconair/properties v1.8.7 // indirect
4445
github.com/mattn/go-colorable v0.1.14 // indirect
4546
github.com/mattn/go-isatty v0.0.20 // indirect
@@ -55,6 +56,7 @@ require (
5556
github.com/rivo/uniseg v0.4.7 // indirect
5657
github.com/sagikazarmark/locafero v0.6.0 // indirect
5758
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
59+
github.com/sirupsen/logrus v1.9.3 // indirect
5860
github.com/sourcegraph/conc v0.3.0 // indirect
5961
github.com/spf13/afero v1.11.0 // indirect
6062
github.com/spf13/cast v1.7.0 // indirect

go.sum

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u
7676
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
7777
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
7878
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
79+
github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU=
80+
github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
7981
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
8082
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
8183
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@@ -93,6 +95,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D
9395
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
9496
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
9597
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
98+
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
99+
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
96100
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
97101
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
98102
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -238,6 +242,7 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h
238242
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
239243
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
240244
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
245+
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
241246
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
242247
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
243248
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=

pkg/backend/build/build.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func BuildLayer(ctx context.Context, store storage.Storage, mediaType, workDir,
5656
return ocispec.Descriptor{}, fmt.Errorf("failed to tar file: %w", err)
5757
}
5858

59-
digest, size, err := store.PushBlob(ctx, repo, reader)
59+
digest, size, err := store.PushBlob(ctx, repo, reader, ocispec.Descriptor{})
6060
if err != nil {
6161
return ocispec.Descriptor{}, fmt.Errorf("failed to push blob to storage: %w", err)
6262
}
@@ -118,7 +118,7 @@ func BuildConfig(ctx context.Context, store storage.Storage, modelfile modelfile
118118
return ocispec.Descriptor{}, fmt.Errorf("failed to marshal config: %w", err)
119119
}
120120

121-
digest, size, err := store.PushBlob(ctx, repo, bytes.NewReader(configJSON))
121+
digest, size, err := store.PushBlob(ctx, repo, bytes.NewReader(configJSON), ocispec.Descriptor{})
122122
if err != nil {
123123
return ocispec.Descriptor{}, fmt.Errorf("failed to push config to storage: %w", err)
124124
}

pkg/backend/processor/code_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func (s *codeProcessorSuite) TestName() {
5454
func (s *codeProcessorSuite) TestProcess() {
5555
ctx := context.Background()
5656
repo := "test-repo"
57-
s.mockStore.On("PushBlob", ctx, repo, mock.Anything).Return("sha256:1234567890abcdef", int64(1024), nil)
57+
s.mockStore.On("PushBlob", ctx, repo, mock.Anything, mock.Anything).Return("sha256:1234567890abcdef", int64(1024), nil)
5858

5959
desc, err := s.processor.Process(ctx, s.workDir, repo)
6060
assert.NoError(s.Suite.T(), err)

pkg/backend/processor/doc_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func (s *docProcessorSuite) TestName() {
5454
func (s *docProcessorSuite) TestProcess() {
5555
ctx := context.Background()
5656
repo := "test-repo"
57-
s.mockStore.On("PushBlob", ctx, repo, mock.Anything).Return("sha256:1234567890abcdef", int64(1024), nil)
57+
s.mockStore.On("PushBlob", ctx, repo, mock.Anything, mock.Anything).Return("sha256:1234567890abcdef", int64(1024), nil)
5858

5959
desc, err := s.processor.Process(ctx, s.workDir, repo)
6060
assert.NoError(s.Suite.T(), err)

pkg/backend/processor/model_config_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func (s *modelConfigProcessorSuite) TestName() {
5454
func (s *modelConfigProcessorSuite) TestProcess() {
5555
ctx := context.Background()
5656
repo := "test-repo"
57-
s.mockStore.On("PushBlob", ctx, repo, mock.Anything).Return("sha256:1234567890abcdef", int64(1024), nil)
57+
s.mockStore.On("PushBlob", ctx, repo, mock.Anything, mock.Anything).Return("sha256:1234567890abcdef", int64(1024), nil)
5858

5959
desc, err := s.processor.Process(ctx, s.workDir, repo)
6060
assert.NoError(s.Suite.T(), err)

pkg/backend/processor/model_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func (s *modelProcessorSuite) TestName() {
5454
func (s *modelProcessorSuite) TestProcess() {
5555
ctx := context.Background()
5656
repo := "test-repo"
57-
s.mockStore.On("PushBlob", ctx, repo, mock.Anything).Return("sha256:1234567890abcdef", int64(1024), nil)
57+
s.mockStore.On("PushBlob", ctx, repo, mock.Anything, mock.Anything).Return("sha256:1234567890abcdef", int64(1024), nil)
5858

5959
desc, err := s.processor.Process(ctx, s.workDir, repo)
6060
assert.NoError(s.Suite.T(), err)

pkg/backend/pull.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ func pullIfNotExist(ctx context.Context, pb *ProgressBar, prompt string, src *re
172172
return err
173173
}
174174
} else {
175-
if _, _, err := dst.PushBlob(ctx, repo, pb.Add(prompt, desc, content)); err != nil {
175+
if _, _, err := dst.PushBlob(ctx, repo, pb.Add(prompt, desc, content), desc); err != nil {
176176
pb.Abort(desc)
177177
return err
178178
}

pkg/storage/distribution/distribution.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package distribution
1818

1919
import (
2020
"context"
21-
"crypto/sha256"
2221
"fmt"
2322
"io"
2423
"regexp"
@@ -28,6 +27,7 @@ import (
2827
"github.com/distribution/distribution/v3/registry/storage/driver"
2928
"github.com/distribution/distribution/v3/registry/storage/driver/filesystem"
3029
ref "github.com/distribution/reference"
30+
sha256 "github.com/minio/sha256-simd"
3131
godigest "github.com/opencontainers/go-digest"
3232
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
3333
)
@@ -172,30 +172,35 @@ func (s *storage) PullBlob(ctx context.Context, repo, digest string) (io.ReadClo
172172
}
173173

174174
// PushBlob pushes the blob to the storage.
175-
func (s *storage) PushBlob(ctx context.Context, repo string, blobReader io.Reader) (string, int64, error) {
175+
func (s *storage) PushBlob(ctx context.Context, repo string, blobReader io.Reader, provisional ocispec.Descriptor) (string, int64, error) {
176176
repository, err := s.repository(ctx, repo)
177177
if err != nil {
178178
return "", 0, err
179179
}
180180

181-
// use teeReader to calculate the digest.
182181
hash := sha256.New()
183-
teeReader := io.TeeReader(blobReader, hash)
182+
if provisional.Digest == "" {
183+
blobReader = io.TeeReader(blobReader, hash)
184+
}
184185

185186
blob, err := repository.Blobs(ctx).Create(ctx)
186187
if err != nil {
187188
return "", 0, err
188189
}
189190

190-
size, err := blob.ReadFrom(teeReader)
191+
size, err := blob.ReadFrom(blobReader)
191192
if err != nil {
192193
return "", 0, err
193194
}
194195

195-
desc, err := blob.Commit(ctx, ocispec.Descriptor{
196-
Digest: godigest.Digest(fmt.Sprintf("sha256:%x", hash.Sum(nil))),
197-
Size: size,
198-
})
196+
// if the provided provisional descriptor is not empty, we can just use it to commit,
197+
// otherwise we need to calculate the digest.
198+
if provisional.Digest == "" {
199+
provisional.Digest = godigest.Digest(fmt.Sprintf("sha256:%x", hash.Sum(nil)))
200+
provisional.Size = size
201+
}
202+
203+
desc, err := blob.Commit(ctx, provisional)
199204
if err != nil {
200205
return "", 0, nil
201206
}

0 commit comments

Comments
 (0)