forked from TrueCloudLab/frostfs-node
[#176] localstore: Draft storage engine shard structure and ops
Implement the primary structure and operation of the local object storage shard. Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
1486cc0e29
commit
383c483be7
8 changed files with 315 additions and 0 deletions
37
pkg/local_object_storage/shard/delete.go
Normal file
37
pkg/local_object_storage/shard/delete.go
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
package shard
|
||||||
|
|
||||||
|
import (
|
||||||
|
objectSDK "github.com/nspcc-dev/neofs-api-go/pkg/object"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DeletePrm groups the parameters of Delete operation.
|
||||||
|
type DeletePrm struct {
|
||||||
|
addr *objectSDK.Address
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteRes groups resulting values of Delete operation.
|
||||||
|
type DeleteRes struct{}
|
||||||
|
|
||||||
|
// WithAddress is a Delete option to set the address of the object to delete.
|
||||||
|
//
|
||||||
|
// Option is required.
|
||||||
|
func (p *DeletePrm) WithAddress(addr *objectSDK.Address) *DeletePrm {
|
||||||
|
if p != nil {
|
||||||
|
p.addr = addr
|
||||||
|
}
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete marks object to delete from shard.
|
||||||
|
//
|
||||||
|
// Returns any error encountered that did not allow to completely
|
||||||
|
// mark the object to delete.
|
||||||
|
func (s *Shard) Delete(prm *DeletePrm) (*DeleteRes, error) {
|
||||||
|
s.mtx.Lock()
|
||||||
|
defer s.mtx.Unlock()
|
||||||
|
|
||||||
|
// FIXME: implement me
|
||||||
|
|
||||||
|
return nil, nil
|
||||||
|
}
|
43
pkg/local_object_storage/shard/exists.go
Normal file
43
pkg/local_object_storage/shard/exists.go
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
package shard
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/nspcc-dev/neofs-api-go/pkg/object"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ExistsPrm groups the parameters of Exists operation.
|
||||||
|
type ExistsPrm struct {
|
||||||
|
addr *object.Address
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExistsRes groups resulting values of Exists operation.
|
||||||
|
type ExistsRes struct {
|
||||||
|
ex bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAddress is an Exists option to set object checked for existence.
|
||||||
|
func (p *ExistsPrm) WithAddress(addr *object.Address) *ExistsPrm {
|
||||||
|
if p != nil {
|
||||||
|
p.addr = addr
|
||||||
|
}
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exists returns the fact that the object is in the shard.
|
||||||
|
func (p *ExistsRes) Exists() bool {
|
||||||
|
return p.ex
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exists checks if object is presented in shard.
|
||||||
|
//
|
||||||
|
// Returns any error encountered that does not allow to
|
||||||
|
// unambiguously determine the presence of an object.
|
||||||
|
func (s *Shard) Exists(prm *ExistsPrm) (*ExistsRes, error) {
|
||||||
|
s.mtx.RLock()
|
||||||
|
defer s.mtx.RUnlock()
|
||||||
|
|
||||||
|
// FIXME: implement me
|
||||||
|
return &ExistsRes{
|
||||||
|
ex: false,
|
||||||
|
}, nil
|
||||||
|
}
|
79
pkg/local_object_storage/shard/get.go
Normal file
79
pkg/local_object_storage/shard/get.go
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
package shard
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
objectSDK "github.com/nspcc-dev/neofs-api-go/pkg/object"
|
||||||
|
"github.com/nspcc-dev/neofs-node/pkg/core/object"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetPrm groups the parameters of Get operation.
|
||||||
|
type GetPrm struct {
|
||||||
|
ln int64 // negative value for full range
|
||||||
|
|
||||||
|
off uint64
|
||||||
|
|
||||||
|
addr *objectSDK.Address
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetRes groups resulting values of Get operation.
|
||||||
|
type GetRes struct {
|
||||||
|
obj *object.Object
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrObjectNotFound is returns on read operations requested on a missing object.
|
||||||
|
var ErrObjectNotFound = errors.New("object not found")
|
||||||
|
|
||||||
|
// WithAddress is a Get option to set the address of the requested object.
|
||||||
|
//
|
||||||
|
// Option is required.
|
||||||
|
func (p *GetPrm) WithAddress(addr *objectSDK.Address) *GetPrm {
|
||||||
|
if p != nil {
|
||||||
|
p.addr = addr
|
||||||
|
}
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithFullRange is a Get option to receive full object payload.
|
||||||
|
func (p *GetPrm) WithFullRange() *GetPrm {
|
||||||
|
if p != nil {
|
||||||
|
p.ln = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithRange is a Get option to set range of requested payload data.
|
||||||
|
//
|
||||||
|
// Calling with negative length is equivalent
|
||||||
|
// to getting the full payload range.
|
||||||
|
func (p *GetPrm) WithRange(off uint64, ln int64) *GetPrm {
|
||||||
|
if p != nil {
|
||||||
|
p.off, p.ln = off, ln
|
||||||
|
}
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// Object returns the requested object part.
|
||||||
|
//
|
||||||
|
// Instance payload contains the requested range of the original object.
|
||||||
|
func (r *GetRes) Object() *object.Object {
|
||||||
|
return r.obj
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get reads part of an object from shard.
|
||||||
|
//
|
||||||
|
// Returns any error encountered that
|
||||||
|
// did not allow to completely read the object part.
|
||||||
|
//
|
||||||
|
// Returns ErrObjectNotFound if requested object is missing in shard.
|
||||||
|
func (s *Shard) Get(prm *GetPrm) (*GetRes, error) {
|
||||||
|
s.mtx.RLock()
|
||||||
|
defer s.mtx.RUnlock()
|
||||||
|
|
||||||
|
// FIXME: implement me
|
||||||
|
|
||||||
|
return nil, nil
|
||||||
|
}
|
21
pkg/local_object_storage/shard/id.go
Normal file
21
pkg/local_object_storage/shard/id.go
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
package shard
|
||||||
|
|
||||||
|
// ID represents Shard identifier.
|
||||||
|
//
|
||||||
|
// Each shard should have the unique ID within
|
||||||
|
// a single instance of local storage.
|
||||||
|
type ID []byte
|
||||||
|
|
||||||
|
// NewIDFromBytes constructs ID from byte slice.
|
||||||
|
func NewIDFromBytes(v []byte) *ID {
|
||||||
|
return (*ID)(&v)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (id ID) String() string {
|
||||||
|
return string(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ID returns Shard identifier.
|
||||||
|
func (s *Shard) ID() *ID {
|
||||||
|
return s.id
|
||||||
|
}
|
35
pkg/local_object_storage/shard/put.go
Normal file
35
pkg/local_object_storage/shard/put.go
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
package shard
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/nspcc-dev/neofs-node/pkg/core/object"
|
||||||
|
)
|
||||||
|
|
||||||
|
// PutPrm groups the parameters of Put operation.
|
||||||
|
type PutPrm struct {
|
||||||
|
obj *object.Object
|
||||||
|
}
|
||||||
|
|
||||||
|
// PutRes groups resulting values of Put operation.
|
||||||
|
type PutRes struct{}
|
||||||
|
|
||||||
|
// WithObject is a Put option to set object to save.
|
||||||
|
func (p *PutPrm) WithObject(obj *object.Object) *PutPrm {
|
||||||
|
if p != nil {
|
||||||
|
p.obj = obj
|
||||||
|
}
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put saves the object in shard.
|
||||||
|
//
|
||||||
|
// Returns any error encountered that
|
||||||
|
// did not allow to completely save the object.
|
||||||
|
func (s *Shard) Put(prm *PutPrm) (*PutRes, error) {
|
||||||
|
s.mtx.Lock()
|
||||||
|
defer s.mtx.Unlock()
|
||||||
|
|
||||||
|
// FIXME: implement me
|
||||||
|
|
||||||
|
return nil, nil
|
||||||
|
}
|
42
pkg/local_object_storage/shard/select.go
Normal file
42
pkg/local_object_storage/shard/select.go
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
package shard
|
||||||
|
|
||||||
|
import (
|
||||||
|
objectSDK "github.com/nspcc-dev/neofs-api-go/pkg/object"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SelectPrm groups the parameters of Select operation.
|
||||||
|
type SelectPrm struct {
|
||||||
|
filters objectSDK.SearchFilters
|
||||||
|
}
|
||||||
|
|
||||||
|
// SelectRes groups resulting values of Select operation.
|
||||||
|
type SelectRes struct {
|
||||||
|
addrList []*objectSDK.Address
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithFilters is a Select option to set the object filters.
|
||||||
|
func (p *SelectPrm) WithFilters(fs objectSDK.SearchFilters) *SelectPrm {
|
||||||
|
if p != nil {
|
||||||
|
p.filters = fs
|
||||||
|
}
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddressList returns list of addresses of the selected objects.
|
||||||
|
func (r *SelectRes) AddressList() []*objectSDK.Address {
|
||||||
|
return r.addrList
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select selects the objects from shard that match select parameters.
|
||||||
|
//
|
||||||
|
// Returns any error encountered that
|
||||||
|
// did not allow to completely select the objects.
|
||||||
|
func (s *Shard) Select(prm *SelectPrm) (*SelectRes, error) {
|
||||||
|
s.mtx.RLock()
|
||||||
|
defer s.mtx.RUnlock()
|
||||||
|
|
||||||
|
// FIXME: implement me
|
||||||
|
|
||||||
|
return nil, nil
|
||||||
|
}
|
46
pkg/local_object_storage/shard/shard.go
Normal file
46
pkg/local_object_storage/shard/shard.go
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
package shard
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Shard represents single shard of NeoFS Local Storage Engine.
|
||||||
|
type Shard struct {
|
||||||
|
*cfg
|
||||||
|
|
||||||
|
mtx *sync.RWMutex
|
||||||
|
|
||||||
|
weight WeightValues
|
||||||
|
}
|
||||||
|
|
||||||
|
// Option represents Shard's constructor option.
|
||||||
|
type Option func(*cfg)
|
||||||
|
|
||||||
|
type cfg struct {
|
||||||
|
id *ID
|
||||||
|
}
|
||||||
|
|
||||||
|
func defaultCfg() *cfg {
|
||||||
|
return new(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates, initializes and returns new Shard instance.
|
||||||
|
func New(opts ...Option) *Shard {
|
||||||
|
c := defaultCfg()
|
||||||
|
|
||||||
|
for i := range opts {
|
||||||
|
opts[i](c)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Shard{
|
||||||
|
cfg: c,
|
||||||
|
mtx: new(sync.RWMutex),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithID returns option to set shard identifier.
|
||||||
|
func WithID(id *ID) Option {
|
||||||
|
return func(c *cfg) {
|
||||||
|
c.id = id
|
||||||
|
}
|
||||||
|
}
|
12
pkg/local_object_storage/shard/weight.go
Normal file
12
pkg/local_object_storage/shard/weight.go
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
package shard
|
||||||
|
|
||||||
|
// WeightValues groups values of Shard weight parameters.
|
||||||
|
type WeightValues struct {
|
||||||
|
// Amount of free disk space. Measured in kilobytes.
|
||||||
|
FreeSpace uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
// WeightValues returns current weight values of the Shard.
|
||||||
|
func (s *Shard) WeightValues() WeightValues {
|
||||||
|
return s.weight
|
||||||
|
}
|
Loading…
Reference in a new issue