From 4a5f2ee492b938832c34819f768da2770788a64d Mon Sep 17 00:00:00 2001 From: Evgenii Baidakov Date: Thu, 27 Jul 2023 15:57:52 +0400 Subject: [PATCH] slicer: Reuse stub object Updated after benchmark. During object slicing we recreate object on each part, we may reuse it, just reset some fields. Signed-off-by: Evgenii Baidakov --- object/object.go | 17 +++++++++++++++++ object/slicer/slicer.go | 32 ++++++++++++++++++++------------ 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/object/object.go b/object/object.go index c956bad6..db0fe1e0 100644 --- a/object/object.go +++ b/object/object.go @@ -111,6 +111,14 @@ func (o *Object) SetID(v oid.ID) { SetObjectID(&v2) } +// ResetID removes object identifier. +// +// See also [Object.SetID]. +func (o *Object) ResetID() { + (*object.Object)(o). + SetObjectID(nil) +} + // Signature returns signature of the object identifier. // // See also [Object.SetSignature]. @@ -536,6 +544,15 @@ func (o *Object) SetParentID(v oid.ID) { }) } +// ResetParentID removes identifier of the parent object. +// +// See also [Object.SetParentID]. +func (o *Object) ResetParentID() { + o.setSplitFields(func(split *object.SplitHeader) { + split.SetParent(nil) + }) +} + // Parent returns parent object w/o payload. // // See also [Object.SetParent]. diff --git a/object/slicer/slicer.go b/object/slicer/slicer.go index f560950a..46daa76e 100644 --- a/object/slicer/slicer.go +++ b/object/slicer/slicer.go @@ -233,6 +233,14 @@ func initPayloadStream(ctx context.Context, ow ObjectWriter, header object.Objec currentVersion := version.Current() header.SetVersion(¤tVersion) + var stubObject object.Object + stubObject.SetVersion(¤tVersion) + stubObject.SetContainerID(containerID) + stubObject.SetCreationEpoch(opts.currentNeoFSEpoch) + stubObject.SetType(object.TypeRegular) + stubObject.SetOwnerID(&owner) + stubObject.SetSessionToken(opts.sessionToken) + res := &PayloadWriter{ ctx: ctx, isHeaderWriteStep: true, @@ -246,6 +254,7 @@ func initPayloadStream(ctx context.Context, ow ObjectWriter, header object.Objec rootMeta: newDynamicObjectMetadata(opts.withHomoChecksum), childMeta: newDynamicObjectMetadata(opts.withHomoChecksum), prmObjectPutInit: prm, + stubObject: &stubObject, } maxObjSize := childPayloadSizeLimit(opts) @@ -284,6 +293,7 @@ type PayloadWriter struct { writtenChildren []oid.ID prmObjectPutInit client.PrmObjectPutInit + stubObject *object.Object } // Write writes next chunk of the object data. Concatenation of all chunks forms @@ -365,19 +375,14 @@ func (x *PayloadWriter) writeLastChild(ctx context.Context, meta dynamicObjectMe } func (x *PayloadWriter) _writeChild(ctx context.Context, meta dynamicObjectMetadata, last bool, rootIDHandler func(id oid.ID)) error { - currentVersion := version.Current() - - fCommon := func(obj *object.Object) { - obj.SetVersion(¤tVersion) - obj.SetContainerID(x.container) - obj.SetCreationEpoch(x.currentEpoch) - obj.SetType(object.TypeRegular) - obj.SetOwnerID(&x.owner) - obj.SetSessionToken(x.sessionToken) - } + obj := *x.stubObject + obj.SetSplitID(nil) + obj.ResetPreviousID() + obj.SetParent(nil) + obj.ResetParentID() + obj.SetSignature(nil) + obj.ResetID() - var obj object.Object - fCommon(&obj) if x.withSplit { obj.SetSplitID(x.splitID) } @@ -421,6 +426,9 @@ func (x *PayloadWriter) _writeChild(ctx context.Context, meta dynamicObjectMetad meta.reset() obj.ResetPreviousID() obj.SetChildren(x.writtenChildren...) + // we reuse already written object, we should reset these fields, to eval them one more time in writeInMemObject. + obj.ResetID() + obj.SetSignature(nil) _, err = writeInMemObject(ctx, x.signer, x.stream, obj, nil, meta, x.prmObjectPutInit) if err != nil {