[#243] object/delete: Implement new service processing
Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
510e9ff2ec
commit
fe3906c295
11 changed files with 654 additions and 217 deletions
|
@ -1,17 +1,138 @@
|
|||
package deletesvc
|
||||
|
||||
import (
|
||||
"github.com/nspcc-dev/neofs-api-go/pkg/container"
|
||||
"errors"
|
||||
|
||||
objectSDK "github.com/nspcc-dev/neofs-api-go/pkg/object"
|
||||
"github.com/nspcc-dev/neofs-api-go/pkg/owner"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/core/object"
|
||||
getsvc "github.com/nspcc-dev/neofs-node/pkg/services/object/get"
|
||||
putsvc "github.com/nspcc-dev/neofs-node/pkg/services/object/put"
|
||||
searchsvc "github.com/nspcc-dev/neofs-node/pkg/services/object/search"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/services/object_manager/placement"
|
||||
)
|
||||
|
||||
func newTombstone(ownerID *owner.ID, cid *container.ID) *object.RawObject {
|
||||
obj := object.NewRaw()
|
||||
obj.SetContainerID(cid)
|
||||
obj.SetOwnerID(ownerID)
|
||||
obj.SetType(objectSDK.TypeTombstone)
|
||||
type headSvcWrapper getsvc.Service
|
||||
|
||||
return obj
|
||||
type searchSvcWrapper searchsvc.Service
|
||||
|
||||
type putSvcWrapper putsvc.Service
|
||||
|
||||
type simpleIDWriter struct {
|
||||
ids []*objectSDK.ID
|
||||
}
|
||||
|
||||
func (w *headSvcWrapper) headAddress(exec *execCtx, addr *objectSDK.Address) (*object.Object, error) {
|
||||
wr := getsvc.NewSimpleObjectWriter()
|
||||
|
||||
p := getsvc.HeadPrm{}
|
||||
p.SetPrivateKey(exec.key())
|
||||
p.SetCommonParameters(exec.commonParameters())
|
||||
p.SetHeaderWriter(wr)
|
||||
p.WithRawFlag(true)
|
||||
p.WithAddress(addr)
|
||||
|
||||
err := (*getsvc.Service)(w).Head(exec.context(), p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return wr.Object(), nil
|
||||
}
|
||||
|
||||
func (w *headSvcWrapper) splitInfo(exec *execCtx) (*objectSDK.SplitInfo, error) {
|
||||
_, err := w.headAddress(exec, exec.address())
|
||||
|
||||
var errSplitInfo *objectSDK.SplitInfoError
|
||||
|
||||
switch {
|
||||
case err == nil:
|
||||
return nil, nil
|
||||
case errors.As(err, &errSplitInfo):
|
||||
return errSplitInfo.SplitInfo(), nil
|
||||
default:
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
func (w *headSvcWrapper) children(exec *execCtx) ([]*objectSDK.ID, error) {
|
||||
a := exec.newAddress(exec.splitInfo.Link())
|
||||
|
||||
linking, err := w.headAddress(exec, a)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return linking.Children(), nil
|
||||
}
|
||||
|
||||
func (w *headSvcWrapper) previous(exec *execCtx, id *objectSDK.ID) (*objectSDK.ID, error) {
|
||||
a := exec.newAddress(id)
|
||||
|
||||
h, err := w.headAddress(exec, a)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return h.PreviousID(), nil
|
||||
}
|
||||
|
||||
func (w *searchSvcWrapper) splitMembers(exec *execCtx) ([]*objectSDK.ID, error) {
|
||||
fs := objectSDK.SearchFilters{}
|
||||
fs.AddSplitIDFilter(objectSDK.MatchStringEqual, exec.splitInfo.SplitID())
|
||||
|
||||
wr := new(simpleIDWriter)
|
||||
|
||||
p := searchsvc.Prm{}
|
||||
p.SetWriter(wr)
|
||||
p.SetCommonParameters(exec.commonParameters())
|
||||
p.SetPrivateKey(exec.key())
|
||||
p.WithContainerID(exec.containerID())
|
||||
p.WithSearchFilters(fs)
|
||||
|
||||
err := (*searchsvc.Service)(w).Search(exec.context(), p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return wr.ids, nil
|
||||
}
|
||||
|
||||
func (s simpleIDWriter) WriteIDs(ids []*objectSDK.ID) error {
|
||||
s.ids = append(s.ids, ids...)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w *putSvcWrapper) put(exec *execCtx, broadcast bool) (*objectSDK.ID, error) {
|
||||
streamer, err := (*putsvc.Service)(w).Put(exec.context())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
payload := exec.tombstoneObj.Payload()
|
||||
|
||||
initPrm := new(putsvc.PutInitPrm).
|
||||
WithCommonPrm(exec.commonParameters()).
|
||||
WithObject(exec.tombstoneObj.CutPayload())
|
||||
|
||||
if broadcast {
|
||||
initPrm.WithTraverseOption(placement.WithoutSuccessTracking())
|
||||
}
|
||||
|
||||
err = streamer.Init(initPrm)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = streamer.SendChunk(new(putsvc.PutChunkPrm).WithChunk(payload))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
r, err := streamer.Close()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return r.ObjectID(), nil
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue