From 5ff82ff04f673f728ee7b9a081d9a79809681c2c Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Tue, 10 Jan 2023 15:10:54 +0300 Subject: [PATCH] [#6] services/object: Simplify local/remote targets We do not use the return result from Close() and we always execute both methods in succession. It makes sense to unite them. Signed-off-by: Evgenii Stratonikov --- pkg/services/object/put/distributed.go | 8 ++--- pkg/services/object/put/local.go | 34 ++++++--------------- pkg/services/object/put/remote.go | 41 +++++++++----------------- pkg/services/object/put/streamer.go | 2 +- 4 files changed, 27 insertions(+), 58 deletions(-) diff --git a/pkg/services/object/put/distributed.go b/pkg/services/object/put/distributed.go index 408ee099c..cf5cc558e 100644 --- a/pkg/services/object/put/distributed.go +++ b/pkg/services/object/put/distributed.go @@ -18,8 +18,7 @@ import ( ) type preparedObjectTarget interface { - WriteObject(*objectSDK.Object, object.ContentMeta) error - Close(ctx context.Context) (*transformer.AccessIdentifiers, error) + WriteObject(context.Context, *objectSDK.Object, object.ContentMeta) error } type distributedTarget struct { @@ -170,10 +169,9 @@ func (t *distributedTarget) sendObject(ctx context.Context, node nodeDesc) error target := t.nodeTargetInitializer(node) - if err := target.WriteObject(t.obj, t.objMeta); err != nil { + err := target.WriteObject(ctx, t.obj, t.objMeta) + if err != nil { return fmt.Errorf("could not write header: %w", err) - } else if _, err := target.Close(ctx); err != nil { - return fmt.Errorf("could not close object stream: %w", err) } return nil } diff --git a/pkg/services/object/put/local.go b/pkg/services/object/put/local.go index be202892a..54649adc7 100644 --- a/pkg/services/object/put/local.go +++ b/pkg/services/object/put/local.go @@ -7,7 +7,6 @@ import ( objectCore "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/object" objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id" - "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/transformer" ) // ObjectStorage is an object storage interface. @@ -27,41 +26,26 @@ type ObjectStorage interface { type localTarget struct { storage ObjectStorage - - obj *objectSDK.Object - meta objectCore.ContentMeta } -func (t *localTarget) WriteObject(obj *objectSDK.Object, meta objectCore.ContentMeta) error { - t.obj = obj - t.meta = meta - - return nil -} - -func (t *localTarget) Close(ctx context.Context) (*transformer.AccessIdentifiers, error) { - switch t.meta.Type() { +func (t localTarget) WriteObject(ctx context.Context, obj *objectSDK.Object, meta objectCore.ContentMeta) error { + switch meta.Type() { case objectSDK.TypeTombstone: - err := t.storage.Delete(ctx, objectCore.AddressOf(t.obj), t.meta.Objects()) + err := t.storage.Delete(ctx, objectCore.AddressOf(obj), meta.Objects()) if err != nil { - return nil, fmt.Errorf("could not delete objects from tombstone locally: %w", err) + return fmt.Errorf("could not delete objects from tombstone locally: %w", err) } case objectSDK.TypeLock: - err := t.storage.Lock(ctx, objectCore.AddressOf(t.obj), t.meta.Objects()) + err := t.storage.Lock(ctx, objectCore.AddressOf(obj), meta.Objects()) if err != nil { - return nil, fmt.Errorf("could not lock object from lock objects locally: %w", err) + return fmt.Errorf("could not lock object from lock objects locally: %w", err) } default: // objects that do not change meta storage } - if err := t.storage.Put(ctx, t.obj); err != nil { //TODO - return nil, fmt.Errorf("(%T) could not put object to local storage: %w", t, err) + if err := t.storage.Put(ctx, obj); err != nil { + return fmt.Errorf("(%T) could not put object to local storage: %w", t, err) } - - id, _ := t.obj.ID() - - return &transformer.AccessIdentifiers{ - SelfID: id, - }, nil + return nil } diff --git a/pkg/services/object/put/remote.go b/pkg/services/object/put/remote.go index 8116243ec..ee8d64e7a 100644 --- a/pkg/services/object/put/remote.go +++ b/pkg/services/object/put/remote.go @@ -12,7 +12,6 @@ import ( "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object/util" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap" objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" - "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/transformer" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) @@ -24,8 +23,6 @@ type remoteTarget struct { nodeInfo clientcore.NodeInfo - obj *objectSDK.Object - clientConstructor ClientConstructor } @@ -44,16 +41,10 @@ type RemotePutPrm struct { obj *objectSDK.Object } -func (t *remoteTarget) WriteObject(obj *objectSDK.Object, _ objectcore.ContentMeta) error { - t.obj = obj - - return nil -} - -func (t *remoteTarget) Close(ctx context.Context) (*transformer.AccessIdentifiers, error) { +func (t *remoteTarget) WriteObject(ctx context.Context, obj *objectSDK.Object, _ objectcore.ContentMeta) error { c, err := t.clientConstructor.Get(t.nodeInfo) if err != nil { - return nil, fmt.Errorf("(%T) could not create SDK client %s: %w", t, t.nodeInfo, err) + return fmt.Errorf("(%T) could not create SDK client %s: %w", t, t.nodeInfo, err) } var prm internalclient.PutObjectPrm @@ -63,32 +54,30 @@ func (t *remoteTarget) Close(ctx context.Context) (*transformer.AccessIdentifier prm.SetSessionToken(t.commonPrm.SessionToken()) prm.SetBearerToken(t.commonPrm.BearerToken()) prm.SetXHeaders(t.commonPrm.XHeaders()) - prm.SetObject(t.obj) + prm.SetObject(obj) - res, err := t.putSingle(ctx, prm) + err = t.putSingle(ctx, prm) if status.Code(err) != codes.Unimplemented { - return res, err + return err } return t.putStream(ctx, prm) } -func (t *remoteTarget) putStream(ctx context.Context, prm internalclient.PutObjectPrm) (*transformer.AccessIdentifiers, error) { - res, err := internalclient.PutObject(ctx, prm) +func (t *remoteTarget) putStream(ctx context.Context, prm internalclient.PutObjectPrm) error { + _, err := internalclient.PutObject(ctx, prm) if err != nil { - return nil, fmt.Errorf("(%T) could not put object to %s: %w", t, t.nodeInfo.AddressGroup(), err) + return fmt.Errorf("(%T) could not put object to %s: %w", t, t.nodeInfo.AddressGroup(), err) } - - return &transformer.AccessIdentifiers{SelfID: res.ID()}, nil + return nil } -func (t *remoteTarget) putSingle(ctx context.Context, prm internalclient.PutObjectPrm) (*transformer.AccessIdentifiers, error) { - res, err := internalclient.PutObjectSingle(ctx, prm) +func (t *remoteTarget) putSingle(ctx context.Context, prm internalclient.PutObjectPrm) error { + _, err := internalclient.PutObjectSingle(ctx, prm) if err != nil { - return nil, fmt.Errorf("(%T) could not put single object to %s: %w", t, t.nodeInfo.AddressGroup(), err) + return fmt.Errorf("(%T) could not put single object to %s: %w", t, t.nodeInfo.AddressGroup(), err) } - - return &transformer.AccessIdentifiers{SelfID: res.ID()}, nil + return nil } // NewRemoteSender creates, initializes and returns new RemoteSender instance. @@ -134,9 +123,7 @@ func (s *RemoteSender) PutObject(ctx context.Context, p *RemotePutPrm) error { return fmt.Errorf("parse client node info: %w", err) } - if err := t.WriteObject(p.obj, objectcore.ContentMeta{}); err != nil { - return fmt.Errorf("(%T) could not send object header: %w", s, err) - } else if _, err := t.Close(ctx); err != nil { + if err := t.WriteObject(ctx, p.obj, objectcore.ContentMeta{}); err != nil { return fmt.Errorf("(%T) could not send object: %w", s, err) } diff --git a/pkg/services/object/put/streamer.go b/pkg/services/object/put/streamer.go index 2dccafa47..80b1c2541 100644 --- a/pkg/services/object/put/streamer.go +++ b/pkg/services/object/put/streamer.go @@ -224,7 +224,7 @@ func (p *Streamer) newCommonTarget(prm *PutInitPrm) *distributedTarget { getWorkerPool: p.getWorkerPool, nodeTargetInitializer: func(node nodeDesc) preparedObjectTarget { if node.local { - return &localTarget{ + return localTarget{ storage: p.localStore, } }