diff --git a/pkg/storage/mongo/deleter.go b/pkg/storage/mongo/deleter.go index 73fac1fb..ed7f2068 100644 --- a/pkg/storage/mongo/deleter.go +++ b/pkg/storage/mongo/deleter.go @@ -4,12 +4,14 @@ import ( "context" "github.com/globalsign/mgo/bson" + "github.com/gomods/athens/pkg/errors" "github.com/gomods/athens/pkg/storage" opentracing "github.com/opentracing/opentracing-go" ) // Delete removes a specific version of a module func (s *ModuleStore) Delete(ctx context.Context, module, version string) error { + const op errors.Op = "mongo.Delete" sp, ctx := opentracing.StartSpanFromContext(ctx, "storage.mongo.Delete") defer sp.Finish() if !s.Exists(ctx, module, version) { @@ -18,6 +20,15 @@ func (s *ModuleStore) Delete(ctx context.Context, module, version string) error Version: version, } } - c := s.s.DB(s.d).C(s.c) - return c.Remove(bson.M{"module": module, "version": version}) + db := s.s.DB(s.d) + c := db.C(s.c) + err := db.GridFS("fs").Remove(s.gridFileName(module, version)) + if err != nil { + return errors.E(op, err) + } + err = c.Remove(bson.M{"module": module, "version": version}) + if err != nil { + return errors.E(op, err) + } + return nil } diff --git a/pkg/storage/mongo/getter.go b/pkg/storage/mongo/getter.go index 275707ce..00b16af2 100644 --- a/pkg/storage/mongo/getter.go +++ b/pkg/storage/mongo/getter.go @@ -1,19 +1,19 @@ package mongo import ( - "bytes" "context" - "io/ioutil" "strings" "github.com/globalsign/mgo/bson" + "github.com/gomods/athens/pkg/errors" "github.com/gomods/athens/pkg/storage" opentracing "github.com/opentracing/opentracing-go" ) // Get a specific version of a module func (s *ModuleStore) Get(ctx context.Context, module, vsn string) (*storage.Version, error) { - sp, ctx := opentracing.StartSpanFromContext(ctx, "storage.mongo.Get") + const op errors.Op = "mongo.Get" + sp, _ := opentracing.StartSpanFromContext(ctx, "storage.mongo.Get") defer sp.Finish() c := s.s.DB(s.d).C(s.c) result := &storage.Module{} @@ -24,9 +24,17 @@ func (s *ModuleStore) Get(ctx context.Context, module, vsn string) (*storage.Ver } return nil, err } + + zipName := s.gridFileName(module, vsn) + fs := s.s.DB(s.d).GridFS("fs") + f, err := fs.Open(zipName) + if err != nil { + return nil, errors.E(op, err) + } + return &storage.Version{ Mod: result.Mod, - Zip: ioutil.NopCloser(bytes.NewReader(result.Zip)), + Zip: f, Info: result.Info, }, nil } diff --git a/pkg/storage/mongo/mongo.go b/pkg/storage/mongo/mongo.go index fce17d06..e5611bd4 100644 --- a/pkg/storage/mongo/mongo.go +++ b/pkg/storage/mongo/mongo.go @@ -1,6 +1,8 @@ package mongo import ( + "strings" + "github.com/globalsign/mgo" ) @@ -41,3 +43,7 @@ func (m *ModuleStore) Connect() error { c := m.s.DB(m.d).C(m.c) return c.EnsureIndex(index) } + +func (m *ModuleStore) gridFileName(mod, ver string) string { + return strings.Replace(mod, "/", "_", -1) + "_" + ver + ".zip" +} diff --git a/pkg/storage/mongo/saver.go b/pkg/storage/mongo/saver.go index 43f5e1b1..d584e2f2 100644 --- a/pkg/storage/mongo/saver.go +++ b/pkg/storage/mongo/saver.go @@ -3,28 +3,43 @@ package mongo import ( "context" "io" - "io/ioutil" + "github.com/gomods/athens/pkg/errors" "github.com/gomods/athens/pkg/storage" opentracing "github.com/opentracing/opentracing-go" ) // Save stores a module in mongo storage. func (s *ModuleStore) Save(ctx context.Context, module, version string, mod []byte, zip io.Reader, info []byte) error { + const op errors.Op = "mongo.Save" sp, ctx := opentracing.StartSpanFromContext(ctx, "storage.mongo.Save") defer sp.Finish() - zipBytes, err := ioutil.ReadAll(zip) + + zipName := s.gridFileName(module, version) + fs := s.s.DB(s.d).GridFS("fs") + f, err := fs.Create(zipName) if err != nil { - return err + return errors.E(op, err) } + defer f.Close() + + _, err = io.Copy(f, zip) // check number of bytes written? + if err != nil { + return errors.E(op, err) + } + m := &storage.Module{ Module: module, Version: version, Mod: mod, - Zip: zipBytes, Info: info, } c := s.s.DB(s.d).C(s.c) - return c.Insert(m) + err = c.Insert(m) + if err != nil { + return errors.E(op, err) + } + + return nil }