[#1377] oid, cid: Upgrade SDK package

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
Leonard Lyubich 2022-05-12 19:37:46 +03:00 committed by LeL
parent f65898a354
commit f15e6e888f
118 changed files with 1455 additions and 886 deletions

View file

@ -168,8 +168,8 @@ func (c *Checker) CheckEACL(msg interface{}, reqInfo v2.RequestInfo) error {
hdrSrcOpts := make([]eaclV2.Option, 0, 3)
addr := addressSDK.NewAddress()
addr.SetContainerID(reqInfo.ContainerID())
addr.SetObjectID(reqInfo.ObjectID())
addr.SetContainerID(*reqInfo.ContainerID())
addr.SetObjectID(*reqInfo.ObjectID())
hdrSrcOpts = append(hdrSrcOpts,
eaclV2.WithLocalObjectStorage(c.localStorage),

View file

@ -2,18 +2,15 @@ package v2
import (
"crypto/ecdsa"
"crypto/rand"
"crypto/sha256"
"testing"
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
objectV2 "github.com/nspcc-dev/neofs-api-go/v2/object"
"github.com/nspcc-dev/neofs-api-go/v2/session"
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
eaclSDK "github.com/nspcc-dev/neofs-sdk-go/eacl"
"github.com/nspcc-dev/neofs-sdk-go/object"
objectSDKAddress "github.com/nspcc-dev/neofs-sdk-go/object/address"
objectSDKID "github.com/nspcc-dev/neofs-sdk-go/object/id"
objecttest "github.com/nspcc-dev/neofs-sdk-go/object/address/test"
"github.com/stretchr/testify/require"
)
@ -26,31 +23,25 @@ type testLocalStorage struct {
}
func (s *testLocalStorage) Head(addr *objectSDKAddress.Address) (*object.Object, error) {
require.True(s.t, addr.ContainerID().Equal(addr.ContainerID()) && addr.ObjectID().Equal(addr.ObjectID()))
cnr1, ok := s.expAddr.ContainerID()
require.True(s.t, ok)
cnr2, ok := addr.ContainerID()
require.True(s.t, ok)
require.True(s.t, cnr1.Equals(cnr2))
id1, ok := s.expAddr.ObjectID()
require.True(s.t, ok)
id2, ok := addr.ObjectID()
require.True(s.t, ok)
require.True(s.t, id1.Equals(id2))
return s.obj, nil
}
func testID(t *testing.T) *objectSDKID.ID {
cs := [sha256.Size]byte{}
_, err := rand.Read(cs[:])
require.NoError(t, err)
id := objectSDKID.NewID()
id.SetSHA256(cs)
return id
}
func testAddress(t *testing.T) *objectSDKAddress.Address {
addr := objectSDKAddress.NewAddress()
addr.SetObjectID(testID(t))
addr.SetContainerID(cidtest.ID())
return addr
}
func testXHeaders(strs ...string) []session.XHeader {
res := make([]session.XHeader, len(strs)/2)
@ -71,7 +62,7 @@ func TestHeadRequest(t *testing.T) {
body := new(objectV2.HeadRequestBody)
req.SetBody(body)
addr := testAddress(t)
addr := objecttest.Address()
body.SetAddress(addr.ToV2())
xKey := "x-key"
@ -112,15 +103,16 @@ func TestHeadRequest(t *testing.T) {
obj: obj,
}
cid := addr.ContainerID()
cnr, _ := addr.ContainerID()
unit := new(eaclSDK.ValidationUnit).
WithContainerID(cid).
WithContainerID(&cnr).
WithOperation(eaclSDK.OperationHead).
WithSenderKey(senderKey.Bytes()).
WithHeaderSource(
NewMessageHeaderSource(
WithObjectStorage(lStorage),
WithServiceRequest(req),
WithAddress(addr),
),
).
WithEACLTable(table)

View file

@ -5,6 +5,7 @@ import (
"github.com/nspcc-dev/neofs-api-go/v2/acl"
objectV2 "github.com/nspcc-dev/neofs-api-go/v2/object"
refsV2 "github.com/nspcc-dev/neofs-api-go/v2/refs"
"github.com/nspcc-dev/neofs-api-go/v2/session"
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
eaclSDK "github.com/nspcc-dev/neofs-sdk-go/eacl"
@ -103,9 +104,25 @@ func (h *headerSource) objectHeaders() ([]eaclSDK.Header, bool) {
oV2.SetHeader(v.GetHeader())
if h.addr == nil {
addr := objectSDKAddress.NewAddress()
addr.SetContainerID(cid.NewFromV2(v.GetHeader().GetContainerID()))
addr.SetObjectID(objectSDKID.NewIDFromV2(v.GetObjectID()))
idV2 := v.GetObjectID()
var id objectSDKID.ID
if idV2 == nil {
// FIXME(@cthulhu-rider): #1386 we need to either return error or check it earlier
_ = id.ReadFromV2(*idV2)
}
cnrV2 := v.GetHeader().GetContainerID()
var cnr cid.ID
if cnrV2 != nil {
// FIXME(@cthulhu-rider): #1386 we need to either return error or check it earlier
_ = cnr.ReadFromV2(*cnrV2)
}
h.addr = new(objectSDKAddress.Address)
h.addr.SetContainerID(cnr)
h.addr.SetObjectID(id)
}
hs := headersFromObject(object.NewFromV2(oV2), h.addr)
@ -113,10 +130,15 @@ func (h *headerSource) objectHeaders() ([]eaclSDK.Header, bool) {
return hs, true
}
case *objectV2.SearchRequest:
return []eaclSDK.Header{cidHeader(
cid.NewFromV2(
req.GetBody().GetContainerID()),
)}, true
cnrV2 := req.GetBody().GetContainerID()
var cnr cid.ID
if cnrV2 != nil {
// FIXME(@cthulhu-rider): #1386 we need to either return error or check it earlier
_ = cnr.ReadFromV2(*cnrV2)
}
return []eaclSDK.Header{cidHeader(&cnr)}, true
}
case *responseXHeaderSource:
switch resp := m.resp.(type) {
@ -140,7 +162,12 @@ func (h *headerSource) objectHeaders() ([]eaclSDK.Header, bool) {
case *objectV2.ShortHeader:
hdr = new(objectV2.Header)
hdr.SetContainerID(h.addr.ContainerID().ToV2())
id, _ := h.addr.ContainerID()
var idV2 refsV2.ContainerID
id.WriteToV2(&idV2)
hdr.SetContainerID(&idV2)
hdr.SetVersion(v.GetVersion())
hdr.SetCreationEpoch(v.GetCreationEpoch())
hdr.SetOwnerID(v.GetOwnerID())
@ -183,11 +210,13 @@ func oidHeader(oid *objectSDKID.ID) eaclSDK.Header {
}
func addressHeaders(addr *objectSDKAddress.Address) []eaclSDK.Header {
res := make([]eaclSDK.Header, 1, 2)
res[0] = cidHeader(addr.ContainerID())
cnr, _ := addr.ContainerID()
if oid := addr.ObjectID(); oid != nil {
res = append(res, oidHeader(oid))
res := make([]eaclSDK.Header, 1, 2)
res[0] = cidHeader(&cnr)
if oid, ok := addr.ObjectID(); ok {
res = append(res, oidHeader(&oid))
}
return res

View file

@ -48,8 +48,11 @@ func headersFromObject(obj *object.Object, addr *objectSDKAddress.Address) []eac
res := make([]eaclSDK.Header, 0, count)
for ; obj != nil; obj = obj.Parent() {
cnr, _ := addr.ContainerID()
id, _ := addr.ObjectID()
res = append(res,
cidHeader(addr.ContainerID()),
cidHeader(&cnr),
// owner ID
&sysObjHdr{
k: acl.FilterObjectOwnerID,
@ -65,7 +68,7 @@ func headersFromObject(obj *object.Object, addr *objectSDKAddress.Address) []eac
k: acl.FilterObjectPayloadLength,
v: u64Value(obj.PayloadSize()),
},
oidHeader(addr.ObjectID()),
oidHeader(&id),
// object version
&sysObjHdr{
k: acl.FilterObjectVersion,

View file

@ -2,6 +2,7 @@ package v2
import (
"bytes"
"crypto/sha256"
"errors"
core "github.com/nspcc-dev/neofs-node/pkg/core/netmap"
@ -65,7 +66,10 @@ func (c senderClassifier) classify(
}, nil
}
isContainerNode, err := c.isContainerKey(ownerKeyInBytes, idCnr.ToV2().GetValue(), cnr)
binCnr := make([]byte, sha256.Size)
idCnr.Encode(binCnr)
isContainerNode, err := c.isContainerKey(ownerKeyInBytes, binCnr, cnr)
if err != nil {
// error might happen if request has `RoleOther` key and placement
// is not possible for previous epoch, so

View file

@ -126,7 +126,11 @@ func (b Service) Get(request *objectV2.GetRequest, stream object.GetObjectStream
return err
}
reqInfo.oid = getObjectIDFromRequestBody(request.GetBody())
reqInfo.oid, err = getObjectIDFromRequestBody(request.GetBody())
if err != nil {
return err
}
useObjectIDFromSession(&reqInfo, sTok)
if !b.checker.CheckBasicACL(reqInfo) {
@ -173,7 +177,11 @@ func (b Service) Head(
return nil, err
}
reqInfo.oid = getObjectIDFromRequestBody(request.GetBody())
reqInfo.oid, err = getObjectIDFromRequestBody(request.GetBody())
if err != nil {
return nil, err
}
useObjectIDFromSession(&reqInfo, sTok)
if !b.checker.CheckBasicACL(reqInfo) {
@ -212,7 +220,10 @@ func (b Service) Search(request *objectV2.SearchRequest, stream object.SearchStr
return err
}
reqInfo.oid = getObjectIDFromRequestBody(request.GetBody())
reqInfo.oid, err = getObjectIDFromRequestBody(request.GetBody())
if err != nil {
return err
}
if !b.checker.CheckBasicACL(reqInfo) {
return basicACLErr(reqInfo)
@ -249,7 +260,11 @@ func (b Service) Delete(
return nil, err
}
reqInfo.oid = getObjectIDFromRequestBody(request.GetBody())
reqInfo.oid, err = getObjectIDFromRequestBody(request.GetBody())
if err != nil {
return nil, err
}
useObjectIDFromSession(&reqInfo, sTok)
if !b.checker.CheckBasicACL(reqInfo) {
@ -281,7 +296,10 @@ func (b Service) GetRange(request *objectV2.GetRangeRequest, stream object.GetOb
return err
}
reqInfo.oid = getObjectIDFromRequestBody(request.GetBody())
reqInfo.oid, err = getObjectIDFromRequestBody(request.GetBody())
if err != nil {
return err
}
useObjectIDFromSession(&reqInfo, sTok)
if !b.checker.CheckBasicACL(reqInfo) {
@ -319,7 +337,11 @@ func (b Service) GetRangeHash(
return nil, err
}
reqInfo.oid = getObjectIDFromRequestBody(request.GetBody())
reqInfo.oid, err = getObjectIDFromRequestBody(request.GetBody())
if err != nil {
return nil, err
}
useObjectIDFromSession(&reqInfo, sTok)
if !b.checker.CheckBasicACL(reqInfo) {
@ -363,7 +385,11 @@ func (p putStreamBasicChecker) Send(request *objectV2.PutRequest) error {
return err
}
reqInfo.oid = getObjectIDFromRequestBody(part)
reqInfo.oid, err = getObjectIDFromRequestBody(part)
if err != nil {
return err
}
useObjectIDFromSession(&reqInfo, sTok)
if !p.source.checker.CheckBasicACL(reqInfo) || !p.source.checker.StickyBitCheck(reqInfo, ownerID) {

View file

@ -19,30 +19,41 @@ import (
"github.com/nspcc-dev/neofs-sdk-go/signature"
)
func getContainerIDFromRequest(req interface{}) (id *containerIDSDK.ID, err error) {
var errMissingContainerID = errors.New("missing container ID")
func getContainerIDFromRequest(req interface{}) (*containerIDSDK.ID, error) {
var idV2 *refsV2.ContainerID
id := new(containerIDSDK.ID)
switch v := req.(type) {
case *objectV2.GetRequest:
return containerIDSDK.NewFromV2(v.GetBody().GetAddress().GetContainerID()), nil
idV2 = v.GetBody().GetAddress().GetContainerID()
case *objectV2.PutRequest:
objPart := v.GetBody().GetObjectPart()
if part, ok := objPart.(*objectV2.PutObjectPartInit); ok {
return containerIDSDK.NewFromV2(part.GetHeader().GetContainerID()), nil
part, ok := v.GetBody().GetObjectPart().(*objectV2.PutObjectPartInit)
if !ok {
return nil, errors.New("can't get container ID in chunk")
}
return nil, errors.New("can't get container ID in chunk")
idV2 = part.GetHeader().GetContainerID()
case *objectV2.HeadRequest:
return containerIDSDK.NewFromV2(v.GetBody().GetAddress().GetContainerID()), nil
idV2 = v.GetBody().GetAddress().GetContainerID()
case *objectV2.SearchRequest:
return containerIDSDK.NewFromV2(v.GetBody().GetContainerID()), nil
idV2 = v.GetBody().GetContainerID()
case *objectV2.DeleteRequest:
return containerIDSDK.NewFromV2(v.GetBody().GetAddress().GetContainerID()), nil
idV2 = v.GetBody().GetAddress().GetContainerID()
case *objectV2.GetRangeRequest:
return containerIDSDK.NewFromV2(v.GetBody().GetAddress().GetContainerID()), nil
idV2 = v.GetBody().GetAddress().GetContainerID()
case *objectV2.GetRangeHashRequest:
return containerIDSDK.NewFromV2(v.GetBody().GetAddress().GetContainerID()), nil
idV2 = v.GetBody().GetAddress().GetContainerID()
default:
return nil, errors.New("unknown request type")
}
if idV2 == nil {
return nil, errMissingContainerID
}
return id, id.ReadFromV2(*idV2)
}
// originalBearerToken goes down to original request meta header and fetches
@ -73,19 +84,34 @@ func originalSessionToken(header *sessionV2.RequestMetaHeader) *sessionSDK.Token
return sessionSDK.NewTokenFromV2(header.GetSessionToken())
}
func getObjectIDFromRequestBody(body interface{}) *oidSDK.ID {
func getObjectIDFromRequestBody(body interface{}) (*oidSDK.ID, error) {
var idV2 *refsV2.ObjectID
switch v := body.(type) {
default:
return nil
return nil, nil
case interface {
GetObjectID() *refsV2.ObjectID
}:
return oidSDK.NewIDFromV2(v.GetObjectID())
idV2 = v.GetObjectID()
case interface {
GetAddress() *refsV2.Address
}:
return oidSDK.NewIDFromV2(v.GetAddress().GetObjectID())
idV2 = v.GetAddress().GetObjectID()
}
if idV2 == nil {
return nil, nil
}
var id oidSDK.ID
err := id.ReadFromV2(*idV2)
if err != nil {
return nil, err
}
return &id, nil
}
func getObjectOwnerFromMessage(req interface{}) (id *owner.ID, err error) {
@ -133,7 +159,10 @@ func useObjectIDFromSession(req *RequestInfo, token *sessionSDK.Token) {
return
}
req.oid = objCtx.Address().ObjectID()
id, ok := objCtx.Address().ObjectID()
if ok {
req.oid = &id
}
}
func tokenVerbToOperation(ctx *sessionSDK.ObjectContext) eaclSDK.Operation {

View file

@ -65,7 +65,12 @@ func (exec *execCtx) address() *addressSDK.Address {
}
func (exec *execCtx) containerID() *cid.ID {
return exec.prm.addr.ContainerID()
id, ok := exec.prm.addr.ContainerID()
if ok {
return &id
}
return nil
}
func (exec *execCtx) commonParameters() *util.CommonPrm {
@ -74,8 +79,8 @@ func (exec *execCtx) commonParameters() *util.CommonPrm {
func (exec *execCtx) newAddress(id *oidSDK.ID) *addressSDK.Address {
a := addressSDK.NewAddress()
a.SetObjectID(id)
a.SetContainerID(exec.containerID())
a.SetObjectID(*id)
a.SetContainerID(*exec.containerID())
return a
}
@ -107,14 +112,16 @@ func (exec *execCtx) collectMembers() (ok bool) {
return true
}
if exec.splitInfo.Link() != nil {
if _, withLink := exec.splitInfo.Link(); withLink {
ok = exec.collectChildren()
}
if !ok && exec.splitInfo.LastPart() != nil {
ok = exec.collectChain()
if !ok {
return
if !ok {
if _, withLast := exec.splitInfo.LastPart(); withLast {
ok = exec.collectChain()
if !ok {
return
}
}
} // may be fail if neither right nor linking ID is set?
@ -122,16 +129,14 @@ func (exec *execCtx) collectMembers() (ok bool) {
}
func (exec *execCtx) collectChain() bool {
var (
err error
chain []oidSDK.ID
)
var chain []oidSDK.ID
exec.log.Debug("assembling chain...")
for prev := exec.splitInfo.LastPart(); prev != nil; {
chain = append(chain, *prev)
prev, err = exec.svc.header.previous(exec, prev)
for prev, withPrev := exec.splitInfo.LastPart(); withPrev; {
chain = append(chain, prev)
p, err := exec.svc.header.previous(exec, &prev)
switch {
default:
@ -147,6 +152,9 @@ func (exec *execCtx) collectChain() bool {
case err == nil:
exec.status = statusOK
exec.err = nil
withPrev = true
prev = *p
}
}
@ -174,7 +182,9 @@ func (exec *execCtx) collectChildren() bool {
exec.status = statusOK
exec.err = nil
exec.addMembers(append(children, *exec.splitInfo.Link()))
link, _ := exec.splitInfo.Link()
exec.addMembers(append(children, link))
return true
}
@ -210,7 +220,7 @@ func (exec *execCtx) addMembers(incoming []oidSDK.ID) {
for i := range members {
for j := 0; j < len(incoming); j++ { // don't use range, slice mutates in body
if members[i].Equal(&incoming[j]) {
if members[i].Equals(incoming[j]) {
incoming = append(incoming[:j], incoming[j+1:]...)
j--
}
@ -240,7 +250,7 @@ func (exec *execCtx) initTombstoneObject() bool {
}
exec.tombstoneObj = object.New()
exec.tombstoneObj.SetContainerID(exec.containerID())
exec.tombstoneObj.SetContainerID(*exec.containerID())
exec.tombstoneObj.SetOwnerID(tombOwnerID)
exec.tombstoneObj.SetType(object.TypeTombstone)
exec.tombstoneObj.SetPayload(payload)

View file

@ -32,11 +32,13 @@ func (exec *execCtx) formTombstone() (ok bool) {
return false
}
id, _ := exec.address().ObjectID()
exec.tombstone = object.NewTombstone()
exec.tombstone.SetExpirationEpoch(
exec.svc.netInfo.CurrentEpoch() + tsLifetime,
)
exec.addMembers([]oidSDK.ID{*exec.address().ObjectID()})
exec.addMembers([]oidSDK.ID{id})
exec.log.Debug("forming split info...")

View file

@ -54,7 +54,9 @@ func (w *headSvcWrapper) splitInfo(exec *execCtx) (*object.SplitInfo, error) {
}
func (w *headSvcWrapper) children(exec *execCtx) ([]oidSDK.ID, error) {
a := exec.newAddress(exec.splitInfo.Link())
link, _ := exec.splitInfo.Link()
a := exec.newAddress(&link)
linking, err := w.headAddress(exec, a)
if err != nil {
@ -72,7 +74,12 @@ func (w *headSvcWrapper) previous(exec *execCtx, id *oidSDK.ID) (*oidSDK.ID, err
return nil, err
}
return h.PreviousID(), nil
prev, ok := h.PreviousID()
if ok {
return &prev, nil
}
return nil, nil
}
func (w *searchSvcWrapper) splitMembers(exec *execCtx) ([]oidSDK.ID, error) {

View file

@ -23,12 +23,12 @@ func (exec *execCtx) assemble() {
splitInfo := exec.splitInfo()
childID := splitInfo.Link()
if childID == nil {
childID = splitInfo.LastPart()
childID, ok := splitInfo.Link()
if !ok {
childID, _ = splitInfo.LastPart()
}
prev, children := exec.initFromChild(childID)
prev, children := exec.initFromChild(&childID)
if len(children) > 0 {
if exec.ctxRange() == nil {
@ -40,7 +40,7 @@ func (exec *execCtx) assemble() {
// * if size > MAX => go right-to-left with HEAD and back with GET
// * else go right-to-left with GET and compose in single object before writing
if ok := exec.overtakePayloadInReverse(&children[len(children)-1]); ok {
if ok := exec.overtakePayloadInReverse(children[len(children)-1]); ok {
// payload of all children except the last are written, write last payload
exec.writeObjectPayload(exec.collectedObject)
}
@ -51,7 +51,7 @@ func (exec *execCtx) assemble() {
// * if size > MAX => go right-to-left with HEAD and back with GET
// * else go right-to-left with GET and compose in single object before writing
if ok := exec.overtakePayloadInReverse(prev); ok {
if ok := exec.overtakePayloadInReverse(*prev); ok {
// payload of all children except the last are written, write last payloa
exec.writeObjectPayload(exec.collectedObject)
}
@ -117,7 +117,12 @@ func (exec *execCtx) initFromChild(id *oidSDK.ID) (prev *oidSDK.ID, children []o
exec.collectedObject.SetPayload(payload)
return child.PreviousID(), child.Children()
idPrev, ok := child.PreviousID()
if ok {
return &idPrev, child.Children()
}
return nil, child.Children()
}
func (exec *execCtx) overtakePayloadDirectly(children []oidSDK.ID, rngs []objectSDK.Range, checkRight bool) {
@ -143,7 +148,7 @@ func (exec *execCtx) overtakePayloadDirectly(children []oidSDK.ID, rngs []object
exec.err = nil
}
func (exec *execCtx) overtakePayloadInReverse(prev *oidSDK.ID) bool {
func (exec *execCtx) overtakePayloadInReverse(prev oidSDK.ID) bool {
chain, rngs, ok := exec.buildChainInReverse(prev)
if !ok {
return false
@ -165,22 +170,24 @@ func (exec *execCtx) overtakePayloadInReverse(prev *oidSDK.ID) bool {
return exec.status == statusOK
}
func (exec *execCtx) buildChainInReverse(prev *oidSDK.ID) ([]oidSDK.ID, []objectSDK.Range, bool) {
func (exec *execCtx) buildChainInReverse(prev oidSDK.ID) ([]oidSDK.ID, []objectSDK.Range, bool) {
var (
chain = make([]oidSDK.ID, 0)
rngs = make([]objectSDK.Range, 0)
seekRng = exec.ctxRange()
from = seekRng.GetOffset()
to = from + seekRng.GetLength()
withPrev = true
)
// fill the chain end-to-start
for prev != nil {
for withPrev {
if exec.curOff < from {
break
}
head, ok := exec.headChild(prev)
head, ok := exec.headChild(&prev)
if !ok {
return nil, nil, false
}
@ -206,19 +213,41 @@ func (exec *execCtx) buildChainInReverse(prev *oidSDK.ID) ([]oidSDK.ID, []object
rngs[index].SetOffset(off)
rngs[index].SetLength(sz)
chain = append(chain, *head.ID())
id, _ := head.ID()
chain = append(chain, id)
}
} else {
chain = append(chain, *head.ID())
id, _ := head.ID()
chain = append(chain, id)
}
prev = head.PreviousID()
prev, withPrev = head.PreviousID()
}
return chain, rngs, true
}
func equalAddresses(a, b *addressSDK.Address) bool {
return a.ContainerID().Equal(b.ContainerID()) &&
a.ObjectID().Equal(b.ObjectID())
cnr1, ok := a.ContainerID()
if !ok {
return false
}
cnr2, ok := b.ContainerID()
if !ok {
return false
}
if !cnr1.Equals(cnr2) {
return false
}
id1, ok := a.ObjectID()
if !ok {
return false
}
id2, ok := a.ObjectID()
return ok && id1.Equals(id2)
}

View file

@ -117,7 +117,12 @@ func (exec *execCtx) splitInfo() *objectSDK.SplitInfo {
}
func (exec *execCtx) containerID() *cid.ID {
return exec.address().ContainerID()
cnr, ok := exec.address().ContainerID()
if ok {
return &cnr
}
return nil
}
func (exec *execCtx) ctxRange() *objectSDK.Range {
@ -186,9 +191,11 @@ func (exec *execCtx) getChild(id *oidSDK.ID, rng *objectSDK.Range, withHdr bool)
p.objWriter = w
p.SetRange(rng)
cnr, _ := exec.address().ContainerID()
addr := addressSDK.NewAddress()
addr.SetContainerID(exec.address().ContainerID())
addr.SetObjectID(id)
addr.SetContainerID(cnr)
addr.SetObjectID(*id)
p.addr = addr
@ -209,8 +216,8 @@ func (exec *execCtx) getChild(id *oidSDK.ID, rng *objectSDK.Range, withHdr bool)
func (exec *execCtx) headChild(id *oidSDK.ID) (*objectSDK.Object, bool) {
childAddr := addressSDK.NewAddress()
childAddr.SetContainerID(exec.containerID())
childAddr.SetObjectID(id)
childAddr.SetContainerID(*exec.containerID())
childAddr.SetObjectID(*id)
p := exec.prm
p.common = p.common.WithLocalOnly(false)
@ -239,7 +246,7 @@ func (exec *execCtx) headChild(id *oidSDK.ID) (*objectSDK.Object, bool) {
case err == nil:
child := w.Object()
if child.ParentID() != nil && !exec.isChild(child) {
if _, ok := child.ParentID(); ok && !exec.isChild(child) {
exec.status = statusUndefined
exec.log.Debug("parent address in child object differs")
@ -269,11 +276,11 @@ func (exec execCtx) remoteClient(info clientcore.NodeInfo) (getClient, bool) {
}
func mergeSplitInfo(dst, src *objectSDK.SplitInfo) {
if last := src.LastPart(); last != nil {
if last, ok := src.LastPart(); ok {
dst.SetLastPart(last)
}
if link := src.Link(); link != nil {
if link, ok := src.Link(); ok {
dst.SetLink(link)
}

View file

@ -3,7 +3,6 @@ package getsvc
import (
"context"
"crypto/rand"
"crypto/sha256"
"errors"
"fmt"
"strconv"
@ -18,11 +17,12 @@ import (
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
"github.com/nspcc-dev/neofs-sdk-go/container"
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
"github.com/nspcc-dev/neofs-sdk-go/netmap"
objectSDK "github.com/nspcc-dev/neofs-sdk-go/object"
addressSDK "github.com/nspcc-dev/neofs-sdk-go/object/address"
objecttest "github.com/nspcc-dev/neofs-sdk-go/object/address/test"
oidSDK "github.com/nspcc-dev/neofs-sdk-go/object/id"
oidtest "github.com/nspcc-dev/neofs-sdk-go/object/id/test"
"github.com/stretchr/testify/require"
)
@ -69,9 +69,18 @@ func newTestStorage() *testStorage {
}
func (g *testTraverserGenerator) GenerateTraverser(addr *addressSDK.Address, e uint64) (*placement.Traverser, error) {
id, ok := addr.ObjectID()
var optObj placement.Option
if ok {
optObj = placement.ForObject(&id)
} else {
optObj = placement.ForObject(nil)
}
return placement.NewTraverser(
placement.ForContainer(g.c),
placement.ForObject(addr.ObjectID()),
optObj,
placement.UseBuilder(g.b[e]),
placement.SuccessAfter(1),
)
@ -180,34 +189,18 @@ func (s *testStorage) inhume(addr *addressSDK.Address) {
s.inhumed[addr.String()] = struct{}{}
}
func testSHA256() (cs [sha256.Size]byte) {
rand.Read(cs[:])
return cs
}
func generateID() *oidSDK.ID {
id := oidSDK.NewID()
id.SetSHA256(testSHA256())
return id
}
func generateAddress() *addressSDK.Address {
addr := addressSDK.NewAddress()
addr.SetObjectID(generateID())
addr.SetContainerID(cidtest.ID())
return addr
}
func generateObject(addr *addressSDK.Address, prev *oidSDK.ID, payload []byte, children ...oidSDK.ID) *objectSDK.Object {
cnr, _ := addr.ContainerID()
id, _ := addr.ObjectID()
obj := objectSDK.New()
obj.SetContainerID(addr.ContainerID())
obj.SetID(addr.ObjectID())
obj.SetContainerID(cnr)
obj.SetID(id)
obj.SetPayload(payload)
obj.SetPayloadSize(uint64(len(payload)))
obj.SetPreviousID(prev)
if prev != nil {
obj.SetPreviousID(*prev)
}
obj.SetChildren(children...)
return obj
@ -269,7 +262,7 @@ func TestGetLocalOnly(t *testing.T) {
payload := make([]byte, payloadSz)
rand.Read(payload)
addr := generateAddress()
addr := objecttest.Address()
obj := generateObject(addr, nil, payload)
storage.addPhy(addr, obj)
@ -308,7 +301,7 @@ func TestGetLocalOnly(t *testing.T) {
p := newPrm(false, nil)
addr := generateAddress()
addr := objecttest.Address()
storage.inhume(addr)
@ -337,7 +330,7 @@ func TestGetLocalOnly(t *testing.T) {
p := newPrm(false, nil)
addr := generateAddress()
addr := objecttest.Address()
p.WithAddress(addr)
@ -365,12 +358,12 @@ func TestGetLocalOnly(t *testing.T) {
p := newPrm(true, nil)
addr := generateAddress()
addr := objecttest.Address()
splitInfo := objectSDK.NewSplitInfo()
splitInfo.SetSplitID(objectSDK.NewSplitID())
splitInfo.SetLink(generateID())
splitInfo.SetLastPart(generateID())
splitInfo.SetLink(oidtest.ID())
splitInfo.SetLastPart(oidtest.ID())
p.WithAddress(addr)
@ -434,19 +427,19 @@ func testNodeMatrix(t testing.TB, dim []int) ([]netmap.Nodes, [][]string) {
return mNodes, mAddr
}
func generateChain(ln int, cid *cid.ID) ([]*objectSDK.Object, []oidSDK.ID, []byte) {
curID := generateID()
func generateChain(ln int, cnr cid.ID) ([]*objectSDK.Object, []oidSDK.ID, []byte) {
curID := oidtest.ID()
var prevID *oidSDK.ID
addr := addressSDK.NewAddress()
addr.SetContainerID(cid)
addr.SetContainerID(cnr)
res := make([]*objectSDK.Object, 0, ln)
ids := make([]oidSDK.ID, 0, ln)
payload := make([]byte, 0, ln*10)
for i := 0; i < ln; i++ {
ids = append(ids, *curID)
ids = append(ids, curID)
addr.SetObjectID(curID)
payloadPart := make([]byte, 10)
@ -461,8 +454,9 @@ func generateChain(ln int, cid *cid.ID) ([]*objectSDK.Object, []oidSDK.ID, []byt
res = append(res, o)
prevID = curID
curID = generateID()
cpCurID := curID
prevID = &cpCurID
curID = oidtest.ID()
}
return res, ids, payload
@ -472,7 +466,7 @@ func TestGetRemoteSmall(t *testing.T) {
ctx := context.Background()
cnr := container.New(container.WithPolicy(new(netmap.PlacementPolicy)))
cid := container.CalculateID(cnr)
idCnr := container.CalculateID(cnr)
newSvc := func(b *testPlacementBuilder, c *testClientCache) *Service {
svc := &Service{cfg: new(cfg)}
@ -528,8 +522,8 @@ func TestGetRemoteSmall(t *testing.T) {
}
t.Run("OK", func(t *testing.T) {
addr := generateAddress()
addr.SetContainerID(cid)
addr := objecttest.Address()
addr.SetContainerID(idCnr)
ns, as := testNodeMatrix(t, []int{2})
@ -591,8 +585,8 @@ func TestGetRemoteSmall(t *testing.T) {
})
t.Run("INHUMED", func(t *testing.T) {
addr := generateAddress()
addr.SetContainerID(cid)
addr := objecttest.Address()
addr.SetContainerID(idCnr)
ns, as := testNodeMatrix(t, []int{2})
@ -635,8 +629,8 @@ func TestGetRemoteSmall(t *testing.T) {
})
t.Run("404", func(t *testing.T) {
addr := generateAddress()
addr.SetContainerID(cid)
addr := objecttest.Address()
addr.SetContainerID(idCnr)
ns, as := testNodeMatrix(t, []int{2})
@ -692,18 +686,19 @@ func TestGetRemoteSmall(t *testing.T) {
t.Run("linking", func(t *testing.T) {
t.Run("get linking failure", func(t *testing.T) {
addr := generateAddress()
addr.SetContainerID(cid)
addr.SetObjectID(generateID())
addr := objecttest.Address()
addr.SetContainerID(idCnr)
addr.SetObjectID(oidtest.ID())
ns, as := testNodeMatrix(t, []int{2})
splitInfo := objectSDK.NewSplitInfo()
splitInfo.SetLink(generateID())
splitInfo.SetLink(oidtest.ID())
splitAddr := addressSDK.NewAddress()
splitAddr.SetContainerID(cid)
splitAddr.SetObjectID(splitInfo.Link())
splitAddr.SetContainerID(idCnr)
idLink, _ := splitInfo.Link()
splitAddr.SetObjectID(idLink)
c1 := newTestClient()
c1.addResult(addr, nil, errors.New("any error"))
@ -743,9 +738,9 @@ func TestGetRemoteSmall(t *testing.T) {
})
t.Run("get chain element failure", func(t *testing.T) {
addr := generateAddress()
addr.SetContainerID(cid)
addr.SetObjectID(generateID())
addr := objecttest.Address()
addr.SetContainerID(idCnr)
addr.SetObjectID(oidtest.ID())
srcObj := generateObject(addr, nil, nil)
srcObj.SetPayloadSize(10)
@ -753,25 +748,27 @@ func TestGetRemoteSmall(t *testing.T) {
ns, as := testNodeMatrix(t, []int{2})
splitInfo := objectSDK.NewSplitInfo()
splitInfo.SetLink(generateID())
splitInfo.SetLink(oidtest.ID())
children, childIDs, _ := generateChain(2, cid)
children, childIDs, _ := generateChain(2, idCnr)
linkAddr := addressSDK.NewAddress()
linkAddr.SetContainerID(cid)
linkAddr.SetObjectID(splitInfo.Link())
linkAddr.SetContainerID(idCnr)
idLink, _ := splitInfo.Link()
linkAddr.SetObjectID(idLink)
linkingObj := generateObject(linkAddr, nil, nil, childIDs...)
linkingObj.SetParentID(addr.ObjectID())
id, _ := addr.ObjectID()
linkingObj.SetParentID(id)
linkingObj.SetParent(srcObj)
child1Addr := addressSDK.NewAddress()
child1Addr.SetContainerID(cid)
child1Addr.SetObjectID(&childIDs[0])
child1Addr.SetContainerID(idCnr)
child1Addr.SetObjectID(childIDs[0])
child2Addr := addressSDK.NewAddress()
child2Addr.SetContainerID(cid)
child2Addr.SetObjectID(&childIDs[1])
child2Addr.SetContainerID(idCnr)
child2Addr.SetObjectID(childIDs[1])
c1 := newTestClient()
c1.addResult(addr, nil, errors.New("any error"))
@ -817,37 +814,39 @@ func TestGetRemoteSmall(t *testing.T) {
})
t.Run("OK", func(t *testing.T) {
addr := generateAddress()
addr.SetContainerID(cid)
addr.SetObjectID(generateID())
addr := objecttest.Address()
addr.SetContainerID(idCnr)
addr.SetObjectID(oidtest.ID())
srcObj := generateObject(addr, nil, nil)
ns, as := testNodeMatrix(t, []int{2})
splitInfo := objectSDK.NewSplitInfo()
splitInfo.SetLink(generateID())
splitInfo.SetLink(oidtest.ID())
children, childIDs, payload := generateChain(2, cid)
children, childIDs, payload := generateChain(2, idCnr)
srcObj.SetPayload(payload)
srcObj.SetPayloadSize(uint64(len(payload)))
children[len(children)-1].SetParent(srcObj)
linkAddr := addressSDK.NewAddress()
linkAddr.SetContainerID(cid)
linkAddr.SetObjectID(splitInfo.Link())
linkAddr.SetContainerID(idCnr)
idLink, _ := splitInfo.Link()
linkAddr.SetObjectID(idLink)
linkingObj := generateObject(linkAddr, nil, nil, childIDs...)
linkingObj.SetParentID(addr.ObjectID())
id, _ := addr.ObjectID()
linkingObj.SetParentID(id)
linkingObj.SetParent(srcObj)
child1Addr := addressSDK.NewAddress()
child1Addr.SetContainerID(cid)
child1Addr.SetObjectID(&childIDs[0])
child1Addr.SetContainerID(idCnr)
child1Addr.SetObjectID(childIDs[0])
child2Addr := addressSDK.NewAddress()
child2Addr.SetContainerID(cid)
child2Addr.SetObjectID(&childIDs[1])
child2Addr.SetContainerID(idCnr)
child2Addr.SetObjectID(childIDs[1])
c1 := newTestClient()
c1.addResult(addr, nil, errors.New("any error"))
@ -905,18 +904,19 @@ func TestGetRemoteSmall(t *testing.T) {
t.Run("right child", func(t *testing.T) {
t.Run("get right child failure", func(t *testing.T) {
addr := generateAddress()
addr.SetContainerID(cid)
addr.SetObjectID(generateID())
addr := objecttest.Address()
addr.SetContainerID(idCnr)
addr.SetObjectID(oidtest.ID())
ns, as := testNodeMatrix(t, []int{2})
splitInfo := objectSDK.NewSplitInfo()
splitInfo.SetLastPart(generateID())
splitInfo.SetLastPart(oidtest.ID())
splitAddr := addressSDK.NewAddress()
splitAddr.SetContainerID(cid)
splitAddr.SetObjectID(splitInfo.LastPart())
splitAddr.SetContainerID(idCnr)
idLast, _ := splitInfo.LastPart()
splitAddr.SetObjectID(idLast)
c1 := newTestClient()
c1.addResult(addr, nil, errors.New("any error"))
@ -956,9 +956,9 @@ func TestGetRemoteSmall(t *testing.T) {
})
t.Run("get chain element failure", func(t *testing.T) {
addr := generateAddress()
addr.SetContainerID(cid)
addr.SetObjectID(generateID())
addr := objecttest.Address()
addr.SetContainerID(idCnr)
addr.SetObjectID(oidtest.ID())
srcObj := generateObject(addr, nil, nil)
srcObj.SetPayloadSize(10)
@ -966,17 +966,19 @@ func TestGetRemoteSmall(t *testing.T) {
ns, as := testNodeMatrix(t, []int{2})
splitInfo := objectSDK.NewSplitInfo()
splitInfo.SetLastPart(generateID())
splitInfo.SetLastPart(oidtest.ID())
children, _, _ := generateChain(2, cid)
children, _, _ := generateChain(2, idCnr)
rightAddr := addressSDK.NewAddress()
rightAddr.SetContainerID(cid)
rightAddr.SetObjectID(splitInfo.LastPart())
rightAddr.SetContainerID(idCnr)
idLast, _ := splitInfo.LastPart()
rightAddr.SetObjectID(idLast)
rightObj := children[len(children)-1]
rightObj.SetParentID(addr.ObjectID())
id, _ := addr.ObjectID()
rightObj.SetParentID(id)
rightObj.SetParent(srcObj)
preRightAddr := object.AddressOf(children[len(children)-2])
@ -1023,25 +1025,27 @@ func TestGetRemoteSmall(t *testing.T) {
})
t.Run("OK", func(t *testing.T) {
addr := generateAddress()
addr.SetContainerID(cid)
addr.SetObjectID(generateID())
addr := objecttest.Address()
addr.SetContainerID(idCnr)
addr.SetObjectID(oidtest.ID())
srcObj := generateObject(addr, nil, nil)
ns, as := testNodeMatrix(t, []int{2})
splitInfo := objectSDK.NewSplitInfo()
splitInfo.SetLastPart(generateID())
splitInfo.SetLastPart(oidtest.ID())
children, _, payload := generateChain(2, cid)
children, _, payload := generateChain(2, idCnr)
srcObj.SetPayloadSize(uint64(len(payload)))
srcObj.SetPayload(payload)
rightObj := children[len(children)-1]
rightObj.SetID(splitInfo.LastPart())
rightObj.SetParentID(addr.ObjectID())
idLast, _ := splitInfo.LastPart()
rightObj.SetID(idLast)
id, _ := addr.ObjectID()
rightObj.SetParentID(id)
rightObj.SetParent(srcObj)
c1 := newTestClient()
@ -1118,10 +1122,10 @@ func TestGetFromPastEpoch(t *testing.T) {
ctx := context.Background()
cnr := container.New(container.WithPolicy(new(netmap.PlacementPolicy)))
cid := container.CalculateID(cnr)
idCnr := container.CalculateID(cnr)
addr := generateAddress()
addr.SetContainerID(cid)
addr := objecttest.Address()
addr.SetContainerID(idCnr)
payloadSz := uint64(10)
payload := make([]byte, payloadSz)

View file

@ -429,9 +429,17 @@ func (s *Service) toHeadPrm(ctx context.Context, req *objectV2.HeadRequest, resp
hdr = hdrWithSig.GetHeader()
idSig = hdrWithSig.GetSignature()
id, ok := objAddr.ObjectID()
if !ok {
return nil, errors.New("missing object ID")
}
var idV2 refs.ObjectID
id.WriteToV2(&idV2)
if err := signature2.VerifyDataWithSource(
signature.StableMarshalerWrapper{
SM: objAddr.ObjectID().ToV2(),
SM: &idV2,
},
func() (key, sig []byte) {
return idSig.GetKey(), idSig.GetSign()
@ -449,8 +457,10 @@ func (s *Service) toHeadPrm(ctx context.Context, req *objectV2.HeadRequest, resp
objv2.SetHeader(hdr)
objv2.SetSignature(idSig)
id, _ := objAddr.ObjectID()
obj := object.NewFromV2(objv2)
obj.SetID(objAddr.ObjectID())
obj.SetID(id)
// convert the object
return obj, nil

View file

@ -123,12 +123,12 @@ func (x *GetObjectPrm) SetRawFlag() {
//
// Required parameter.
func (x *GetObjectPrm) SetAddress(addr *addressSDK.Address) {
if id := addr.ContainerID(); id != nil {
x.cliPrm.FromContainer(*id)
if id, ok := addr.ContainerID(); ok {
x.cliPrm.FromContainer(id)
}
if id := addr.ObjectID(); id != nil {
x.cliPrm.ByID(*id)
if id, ok := addr.ObjectID(); ok {
x.cliPrm.ByID(id)
}
}
@ -218,12 +218,12 @@ func (x *HeadObjectPrm) SetRawFlag() {
//
// Required parameter.
func (x *HeadObjectPrm) SetAddress(addr *addressSDK.Address) {
if id := addr.ContainerID(); id != nil {
x.cliPrm.FromContainer(*id)
if id, ok := addr.ContainerID(); ok {
x.cliPrm.FromContainer(id)
}
if id := addr.ObjectID(); id != nil {
x.cliPrm.ByID(*id)
if id, ok := addr.ObjectID(); ok {
x.cliPrm.ByID(id)
}
}
@ -301,12 +301,12 @@ func (x *PayloadRangePrm) SetRawFlag() {
//
// Required parameter.
func (x *PayloadRangePrm) SetAddress(addr *addressSDK.Address) {
if id := addr.ContainerID(); id != nil {
x.cliPrm.FromContainer(*id)
if id, ok := addr.ContainerID(); ok {
x.cliPrm.FromContainer(id)
}
if id := addr.ObjectID(); id != nil {
x.cliPrm.ByID(*id)
if id, ok := addr.ObjectID(); ok {
x.cliPrm.ByID(id)
}
}

View file

@ -143,8 +143,10 @@ func (t *distributedTarget) sendObject(node nodeDesc) error {
}
func (t *distributedTarget) iteratePlacement(f func(nodeDesc) error) (*transformer.AccessIdentifiers, error) {
id, _ := t.obj.ID()
traverser, err := placement.NewTraverser(
append(t.traversal.opts, placement.ForObject(t.obj.ID()))...,
append(t.traversal.opts, placement.ForObject(&id))...,
)
if err != nil {
return nil, fmt.Errorf("(%T) could not create object placement traverser: %w", t, err)
@ -231,6 +233,8 @@ loop:
}
}
id, _ = t.obj.ID()
return new(transformer.AccessIdentifiers).
WithSelfID(t.obj.ID()), nil
WithSelfID(&id), nil
}

View file

@ -32,6 +32,8 @@ func (t *localTarget) Close() (*transformer.AccessIdentifiers, error) {
return nil, fmt.Errorf("(%T) could not put object to local storage: %w", t, err)
}
id, _ := t.obj.ID()
return new(transformer.AccessIdentifiers).
WithSelfID(t.obj.ID()), nil
WithSelfID(&id), nil
}

View file

@ -122,8 +122,13 @@ func (p *Streamer) preparePrm(prm *PutInitPrm) error {
return fmt.Errorf("(%T) could not get latest network map: %w", p, err)
}
idCnr, ok := prm.hdr.ContainerID()
if !ok {
return errors.New("missing container ID")
}
// get container to store the object
cnr, err := p.cnrSrc.Get(prm.hdr.ContainerID())
cnr, err := p.cnrSrc.Get(&idCnr)
if err != nil {
return fmt.Errorf("(%T) could not get container by ID: %w", p, err)
}
@ -132,11 +137,15 @@ func (p *Streamer) preparePrm(prm *PutInitPrm) error {
prm.traverseOpts = append(prm.traverseOpts,
// set processing container
placement.ForContainer(cnr),
// set identifier of the processing object
placement.ForObject(prm.hdr.ID()),
)
if id, ok := prm.hdr.ID(); ok {
prm.traverseOpts = append(prm.traverseOpts,
// set identifier of the processing object
placement.ForObject(&id),
)
}
// create placement builder from network map
builder := placement.NewNetworkMapBuilder(nm)

View file

@ -2,6 +2,7 @@ package putsvc
import (
objectV2 "github.com/nspcc-dev/neofs-api-go/v2/object"
refsV2 "github.com/nspcc-dev/neofs-api-go/v2/refs"
putsvc "github.com/nspcc-dev/neofs-node/pkg/services/object/put"
"github.com/nspcc-dev/neofs-node/pkg/services/object/util"
"github.com/nspcc-dev/neofs-sdk-go/object"
@ -32,8 +33,11 @@ func toChunkPrm(req *objectV2.PutObjectPartChunk) *putsvc.PutChunkPrm {
}
func fromPutResponse(r *putsvc.PutResponse) *objectV2.PutResponse {
var idV2 refsV2.ObjectID
r.ObjectID().WriteToV2(&idV2)
body := new(objectV2.PutResponseBody)
body.SetObjectID(r.ObjectID().ToV2())
body.SetObjectID(&idV2)
resp := new(objectV2.PutResponse)
resp.SetBody(body)

View file

@ -113,7 +113,7 @@ func (c *testStorage) searchObjects(exec *execCtx, _ clientcore.NodeInfo) ([]oid
return v.ids, v.err
}
func (c *testStorage) addResult(addr *cid.ID, ids []oidSDK.ID, err error) {
func (c *testStorage) addResult(addr cid.ID, ids []oidSDK.ID, err error) {
c.items[addr.String()] = idsErr{
ids: ids,
err: err,
@ -146,9 +146,9 @@ func TestGetLocalOnly(t *testing.T) {
return svc
}
newPrm := func(cid *cid.ID, w IDListWriter) Prm {
newPrm := func(cnr cid.ID, w IDListWriter) Prm {
p := Prm{}
p.WithContainerID(cid)
p.WithContainerID(&cnr)
p.SetWriter(w)
p.common = new(util.CommonPrm).WithLocalOnly(true)
@ -159,12 +159,12 @@ func TestGetLocalOnly(t *testing.T) {
storage := newTestStorage()
svc := newSvc(storage)
cid := cidtest.ID()
cnr := cidtest.ID()
ids := generateIDs(10)
storage.addResult(cid, ids, nil)
storage.addResult(cnr, ids, nil)
w := new(simpleIDWriter)
p := newPrm(cid, w)
p := newPrm(cnr, w)
err := svc.Search(ctx, p)
require.NoError(t, err)
@ -175,12 +175,12 @@ func TestGetLocalOnly(t *testing.T) {
storage := newTestStorage()
svc := newSvc(storage)
cid := cidtest.ID()
cnr := cidtest.ID()
testErr := errors.New("any error")
storage.addResult(cid, nil, testErr)
storage.addResult(cnr, nil, testErr)
w := new(simpleIDWriter)
p := newPrm(cid, w)
p := newPrm(cnr, w)
err := svc.Search(ctx, p)
require.ErrorIs(t, err, testErr)
@ -256,9 +256,9 @@ func TestGetRemoteSmall(t *testing.T) {
return svc
}
newPrm := func(id *cid.ID, w IDListWriter) Prm {
newPrm := func(id cid.ID, w IDListWriter) Prm {
p := Prm{}
p.WithContainerID(id)
p.WithContainerID(&id)
p.SetWriter(w)
p.common = new(util.CommonPrm).WithLocalOnly(false)
@ -380,7 +380,7 @@ func TestGetFromPastEpoch(t *testing.T) {
w := new(simpleIDWriter)
p := Prm{}
p.WithContainerID(cid)
p.WithContainerID(&cid)
p.SetWriter(w)
commonPrm := new(util.CommonPrm)

View file

@ -127,15 +127,15 @@ func idsFromAddresses(addrs []*addressSDK.Address) []oidSDK.ID {
ids := make([]oidSDK.ID, len(addrs))
for i := range addrs {
ids[i] = *addrs[i].ObjectID()
ids[i], _ = addrs[i].ObjectID()
}
return ids
}
func (e *traverseGeneratorWrapper) generateTraverser(cid *cid.ID, epoch uint64) (*placement.Traverser, error) {
func (e *traverseGeneratorWrapper) generateTraverser(cnr *cid.ID, epoch uint64) (*placement.Traverser, error) {
a := addressSDK.NewAddress()
a.SetContainerID(cid)
a.SetContainerID(*cnr)
return (*util.TraverserGenerator)(e).GenerateTraverser(a, epoch)
}

View file

@ -20,7 +20,7 @@ func (s *streamWriter) WriteIDs(ids []oidSDK.ID) error {
idsV2 := make([]refs.ObjectID, len(ids))
for i := range ids {
idsV2[i] = *ids[i].ToV2()
ids[i].WriteToV2(&idsV2[i])
}
body.SetIDList(idsV2)

View file

@ -23,6 +23,20 @@ import (
)
func (s *Service) toPrm(req *objectV2.SearchRequest, stream objectSvc.SearchStream) (*searchsvc.Prm, error) {
body := req.GetBody()
cnrV2 := body.GetContainerID()
if cnrV2 == nil {
return nil, errors.New("missing container ID")
}
var id cid.ID
err := id.ReadFromV2(*cnrV2)
if err != nil {
return nil, fmt.Errorf("invalid container ID: %w", err)
}
meta := req.GetMetaHeader()
commonPrm, err := util.CommonPrmFromV2(req)
@ -103,8 +117,15 @@ func (s *Service) toPrm(req *objectV2.SearchRequest, stream objectSvc.SearchStre
}
chunk := resp.GetBody().GetIDList()
var id oidSDK.ID
for i := range chunk {
searchResult = append(searchResult, *oidSDK.NewIDFromV2(&chunk[i]))
err = id.ReadFromV2(chunk[i])
if err != nil {
return nil, fmt.Errorf("invalid object ID: %w", err)
}
searchResult = append(searchResult, id)
}
}
@ -112,8 +133,7 @@ func (s *Service) toPrm(req *objectV2.SearchRequest, stream objectSvc.SearchStre
}))
}
body := req.GetBody()
p.WithContainerID(cid.NewFromV2(body.GetContainerID()))
p.WithContainerID(&id)
p.WithSearchFilters(object.NewSearchFiltersFromV2(body.GetFilters()))
return p, nil

View file

@ -79,7 +79,10 @@ func traverseSplitChain(r HeadReceiver, addr *addressSDK.Address, h SplitMemberH
return false, err
}
cid := addr.ContainerID()
cnr, ok := addr.ContainerID()
if !ok {
return false, errors.New("missing container in object address")
}
switch res := v.(type) {
default:
@ -87,13 +90,16 @@ func traverseSplitChain(r HeadReceiver, addr *addressSDK.Address, h SplitMemberH
case *object.Object:
return h(res, false), nil
case *object.SplitInfo:
link, withLink := res.Link()
last, withLast := res.LastPart()
switch {
default:
return false, errors.New("lack of split information")
case res.Link() != nil:
case withLink:
addr := addressSDK.NewAddress()
addr.SetContainerID(cid)
addr.SetObjectID(res.Link())
addr.SetContainerID(cnr)
addr.SetObjectID(link)
chain := make([]oidSDK.ID, 0)
@ -114,7 +120,7 @@ func traverseSplitChain(r HeadReceiver, addr *addressSDK.Address, h SplitMemberH
var reverseChain []*object.Object
for i := range chain {
addr.SetObjectID(&chain[i])
addr.SetObjectID(chain[i])
if stop, err := traverseSplitChain(r, addr, func(member *object.Object, reverseDirection bool) (stop bool) {
if !reverseDirection {
@ -133,18 +139,18 @@ func traverseSplitChain(r HeadReceiver, addr *addressSDK.Address, h SplitMemberH
return true, nil
}
}
case res.LastPart() != nil:
case withLast:
addr := addressSDK.NewAddress()
addr.SetContainerID(cid)
addr.SetContainerID(cnr)
for prev := res.LastPart(); prev != nil; {
addr.SetObjectID(prev)
for last, withLast = res.LastPart(); withLast; {
addr.SetObjectID(last)
var directChain []*object.Object
if _, err := traverseSplitChain(r, addr, func(member *object.Object, reverseDirection bool) (stop bool) {
if reverseDirection {
prev = member.PreviousID()
last, withLast = member.PreviousID()
return h(member, true)
}
@ -162,7 +168,7 @@ func traverseSplitChain(r HeadReceiver, addr *addressSDK.Address, h SplitMemberH
}
if len(directChain) > 0 {
prev = directChain[len(directChain)-1].PreviousID()
last, withLast = directChain[len(directChain)-1].PreviousID()
}
}
}

View file

@ -1,6 +1,7 @@
package util
import (
"errors"
"fmt"
"github.com/nspcc-dev/neofs-node/pkg/core/container"
@ -122,6 +123,11 @@ func (g *TraverserGenerator) WithTraverseOptions(opts ...placement.Option) *Trav
// GenerateTraverser generates placement Traverser for provided object address
// using epoch-th network map.
func (g *TraverserGenerator) GenerateTraverser(addr *addressSDK.Address, epoch uint64) (*placement.Traverser, error) {
idCnr, ok := addr.ContainerID()
if !ok {
return nil, errors.New("missing container in object address")
}
// get network map by epoch
nm, err := g.netMapSrc.GetNetMapByEpoch(epoch)
if err != nil {
@ -129,7 +135,7 @@ func (g *TraverserGenerator) GenerateTraverser(addr *addressSDK.Address, epoch u
}
// get container related container
cnr, err := g.cnrSrc.Get(addr.ContainerID())
cnr, err := g.cnrSrc.Get(&idCnr)
if err != nil {
return nil, fmt.Errorf("could not get container: %w", err)
}
@ -148,12 +154,16 @@ func (g *TraverserGenerator) GenerateTraverser(addr *addressSDK.Address, epoch u
// set processing container
placement.ForContainer(cnr),
// set identifier of the processing object
placement.ForObject(addr.ObjectID()),
// set placement builder
placement.UseBuilder(builder),
)
if idObj, ok := addr.ObjectID(); ok {
traverseOpts = append(traverseOpts,
// set identifier of the processing object
placement.ForObject(&idObj),
)
}
return placement.NewTraverser(traverseOpts...)
}