forked from TrueCloudLab/frostfs-node
[#239] object/head: Implement new service processing
Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
9dd83bdf0d
commit
0e1f05ff45
11 changed files with 348 additions and 140 deletions
|
@ -1,7 +1,6 @@
|
|||
package getsvc
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/ecdsa"
|
||||
"hash"
|
||||
|
||||
|
@ -10,10 +9,9 @@ import (
|
|||
"github.com/nspcc-dev/neofs-node/pkg/core/object"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/local_object_storage/engine"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/network/cache"
|
||||
headsvc "github.com/nspcc-dev/neofs-node/pkg/services/object/head"
|
||||
)
|
||||
|
||||
type simpleObjectWriter struct {
|
||||
type SimpleObjectWriter struct {
|
||||
obj *object.RawObject
|
||||
|
||||
pld []byte
|
||||
|
@ -33,13 +31,11 @@ type storageEngineWrapper struct {
|
|||
engine *engine.StorageEngine
|
||||
}
|
||||
|
||||
type headSvcWrapper struct {
|
||||
svc *headsvc.Service
|
||||
}
|
||||
|
||||
type rangeWriter struct {
|
||||
type partWriter struct {
|
||||
ObjectWriter
|
||||
|
||||
headWriter HeaderWriter
|
||||
|
||||
chunkWriter ChunkWriter
|
||||
}
|
||||
|
||||
|
@ -47,13 +43,13 @@ type hasherWrapper struct {
|
|||
hash hash.Hash
|
||||
}
|
||||
|
||||
func newSimpleObjectWriter() *simpleObjectWriter {
|
||||
return &simpleObjectWriter{
|
||||
func NewSimpleObjectWriter() *SimpleObjectWriter {
|
||||
return &SimpleObjectWriter{
|
||||
obj: object.NewRaw(),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *simpleObjectWriter) WriteHeader(obj *object.Object) error {
|
||||
func (s *SimpleObjectWriter) WriteHeader(obj *object.Object) error {
|
||||
s.obj = object.NewRawFromObject(obj)
|
||||
|
||||
s.pld = make([]byte, 0, obj.PayloadSize())
|
||||
|
@ -61,16 +57,12 @@ func (s *simpleObjectWriter) WriteHeader(obj *object.Object) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (s *simpleObjectWriter) WriteChunk(p []byte) error {
|
||||
func (s *SimpleObjectWriter) WriteChunk(p []byte) error {
|
||||
s.pld = append(s.pld, p...)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *simpleObjectWriter) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *simpleObjectWriter) object() *object.Object {
|
||||
func (s *SimpleObjectWriter) Object() *object.Object {
|
||||
if len(s.pld) > 0 {
|
||||
s.obj.SetPayload(s.pld)
|
||||
}
|
||||
|
@ -86,16 +78,24 @@ func (c *clientCacheWrapper) get(key *ecdsa.PrivateKey, addr string) (getClient,
|
|||
}, err
|
||||
}
|
||||
|
||||
func (c *clientWrapper) GetObject(ctx context.Context, p RangePrm) (*objectSDK.Object, error) {
|
||||
func (c *clientWrapper) getObject(exec *execCtx) (*objectSDK.Object, error) {
|
||||
if exec.headOnly() {
|
||||
return c.client.GetObjectHeader(exec.context(),
|
||||
new(client.ObjectHeaderParams).
|
||||
WithAddress(exec.address()).
|
||||
WithRawFlag(exec.isRaw()),
|
||||
exec.callOptions()...,
|
||||
)
|
||||
}
|
||||
// we don't specify payload writer because we accumulate
|
||||
// the object locally (even huge).
|
||||
if p.rng != nil {
|
||||
data, err := c.client.ObjectPayloadRangeData(ctx,
|
||||
if rng := exec.ctxRange(); rng != nil {
|
||||
data, err := c.client.ObjectPayloadRangeData(exec.context(),
|
||||
new(client.RangeDataParams).
|
||||
WithAddress(p.Address()).
|
||||
WithRange(p.rng).
|
||||
WithRaw(p.RawFlag()),
|
||||
p.callOpts...,
|
||||
WithAddress(exec.address()).
|
||||
WithRange(rng).
|
||||
WithRaw(exec.isRaw()),
|
||||
exec.callOptions()...,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -103,22 +103,30 @@ func (c *clientWrapper) GetObject(ctx context.Context, p RangePrm) (*objectSDK.O
|
|||
|
||||
return payloadOnlyObject(data), nil
|
||||
} else {
|
||||
// we don't specify payload writer because we accumulate
|
||||
// the object locally (even huge).
|
||||
return c.client.GetObject(ctx,
|
||||
return c.client.GetObject(exec.context(),
|
||||
new(client.GetObjectParams).
|
||||
WithAddress(p.Address()).
|
||||
WithRawFlag(p.RawFlag()),
|
||||
p.callOpts...,
|
||||
WithAddress(exec.address()).
|
||||
WithRawFlag(exec.isRaw()),
|
||||
exec.callOptions()...,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
func (e *storageEngineWrapper) Get(p RangePrm) (*object.Object, error) {
|
||||
if p.rng != nil {
|
||||
func (e *storageEngineWrapper) get(exec *execCtx) (*object.Object, error) {
|
||||
if exec.headOnly() {
|
||||
r, err := e.engine.Head(new(engine.HeadPrm).
|
||||
WithAddress(exec.address()).
|
||||
WithRaw(exec.isRaw()),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return r.Header(), nil
|
||||
} else if rng := exec.ctxRange(); rng != nil {
|
||||
r, err := e.engine.GetRange(new(engine.RngPrm).
|
||||
WithAddress(p.Address()).
|
||||
WithPayloadRange(p.rng),
|
||||
WithAddress(exec.address()).
|
||||
WithPayloadRange(rng),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -127,7 +135,7 @@ func (e *storageEngineWrapper) Get(p RangePrm) (*object.Object, error) {
|
|||
return r.Object(), nil
|
||||
} else {
|
||||
r, err := e.engine.Get(new(engine.GetPrm).
|
||||
WithAddress(p.Address()),
|
||||
WithAddress(exec.address()),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -137,22 +145,12 @@ func (e *storageEngineWrapper) Get(p RangePrm) (*object.Object, error) {
|
|||
}
|
||||
}
|
||||
|
||||
func (s *headSvcWrapper) head(ctx context.Context, p Prm) (*object.Object, error) {
|
||||
r, err := s.svc.Head(ctx, new(headsvc.Prm).
|
||||
WithAddress(p.Address()).
|
||||
WithCommonPrm(p.common).
|
||||
Short(false),
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return r.Header(), nil
|
||||
func (w *partWriter) WriteChunk(p []byte) error {
|
||||
return w.chunkWriter.WriteChunk(p)
|
||||
}
|
||||
|
||||
func (w *rangeWriter) WriteChunk(p []byte) error {
|
||||
return w.chunkWriter.WriteChunk(p)
|
||||
func (w *partWriter) WriteHeader(o *object.Object) error {
|
||||
return w.headWriter.WriteHeader(o)
|
||||
}
|
||||
|
||||
func payloadOnlyObject(payload []byte) *objectSDK.Object {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue