forked from TrueCloudLab/frostfs-node
[#50] services/object: Implement GetRange service
Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
dd16f568c3
commit
0490107165
12 changed files with 744 additions and 5 deletions
36
pkg/services/object/range/local.go
Normal file
36
pkg/services/object/range/local.go
Normal file
|
@ -0,0 +1,36 @@
|
|||
package rangesvc
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/nspcc-dev/neofs-api-go/pkg/object"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/local_object_storage/localstore"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
type localRangeWriter struct {
|
||||
addr *object.Address
|
||||
|
||||
rng *object.Range
|
||||
|
||||
storage *localstore.Storage
|
||||
}
|
||||
|
||||
func (l *localRangeWriter) WriteTo(w io.Writer) (int64, error) {
|
||||
obj, err := l.storage.Get(l.addr)
|
||||
if err != nil {
|
||||
return 0, errors.Wrapf(err, "(%T) could not get object from local storage", l)
|
||||
}
|
||||
|
||||
payload := obj.GetPayload()
|
||||
left := l.rng.GetOffset()
|
||||
right := left + l.rng.GetLength()
|
||||
|
||||
if ln := uint64(len(payload)); ln < right {
|
||||
return 0, errors.Errorf("(%T) object range is out-of-boundaries (size %d, range [%d:%d]", l, ln, left, right)
|
||||
}
|
||||
|
||||
n, err := w.Write(payload[left:right])
|
||||
|
||||
return int64(n), err
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue