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 4e176811..8b63ab49 100644 --- a/object/slicer/slicer.go +++ b/object/slicer/slicer.go @@ -232,6 +232,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, @@ -245,6 +253,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) @@ -283,6 +292,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 @@ -364,19 +374,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) } @@ -420,6 +425,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 {