forked from TrueCloudLab/frostfs-node
[#1377] oid, cid: Upgrade SDK package
Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
f65898a354
commit
f15e6e888f
118 changed files with 1455 additions and 886 deletions
|
@ -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),
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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...")
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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...)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue