From 5fc54386b0eee8a58d180336da00c86cdd4ef132 Mon Sep 17 00:00:00 2001 From: Alex Vanin Date: Tue, 1 Dec 2020 10:46:52 +0300 Subject: [PATCH] [#222] Update Put method in shard Signed-off-by: Alex Vanin --- pkg/local_object_storage/shard/put.go | 41 ++++++++++++++++----------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/pkg/local_object_storage/shard/put.go b/pkg/local_object_storage/shard/put.go index 77081521ac..c1f58e58f5 100644 --- a/pkg/local_object_storage/shard/put.go +++ b/pkg/local_object_storage/shard/put.go @@ -28,28 +28,35 @@ func (p *PutPrm) WithObject(obj *object.Object) *PutPrm { // Returns any error encountered that // did not allow to completely save the object. func (s *Shard) Put(prm *PutPrm) (*PutRes, error) { - // check object existence - ex, err := s.objectExists(prm.obj.Address()) - if err != nil { - return nil, errors.Wrap(err, "could not check object existence") - } else if ex { - return nil, nil - } - - // try to put to WriteCache - // TODO: implement - - // form Put parameters - putPrm := new(blobstor.PutPrm) + putPrm := new(blobstor.PutPrm) // form Put parameters putPrm.SetObject(prm.obj) - // put to BlobStor - if _, err := s.blobStor.Put(putPrm); err != nil { - return nil, errors.Wrap(err, "could not put object to BLOB storage") + // exist check are not performed there, these checks should be executed + // ahead of `Put` by storage engine + + var ( + err error + res *blobstor.PutRes + ) + + if s.hasWriteCache() { + res, err = s.writeCache.Put(putPrm) + if err != nil { + s.log.Debug("can't put message to writeCache, trying to blobStor") + + res = nil // just in case + } + } + + // res == nil if there is no writeCache or writeCache.Put has been failed + if res == nil { + if res, err = s.blobStor.Put(putPrm); err != nil { + return nil, errors.Wrap(err, "could not put object to BLOB storage") + } } // put to metabase - if err := s.metaBase.Put(prm.obj, nil); err != nil { + if err := s.metaBase.Put(prm.obj, res.BlobovniczaID()); err != nil { // may we need to handle this case in a special way // since the object has been successfully written to BlobStor return nil, errors.Wrap(err, "could not put object to metabase")