forked from TrueCloudLab/frostfs-node
[#28] pilorama: Remove LogMove
struct
Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
This commit is contained in:
parent
46c62be7e8
commit
d65a95a2c6
8 changed files with 24 additions and 27 deletions
|
@ -12,7 +12,7 @@ import (
|
||||||
var _ pilorama.Forest = (*StorageEngine)(nil)
|
var _ pilorama.Forest = (*StorageEngine)(nil)
|
||||||
|
|
||||||
// TreeMove implements the pilorama.Forest interface.
|
// TreeMove implements the pilorama.Forest interface.
|
||||||
func (e *StorageEngine) TreeMove(d pilorama.CIDDescriptor, treeID string, m *pilorama.Move) (*pilorama.LogMove, error) {
|
func (e *StorageEngine) TreeMove(d pilorama.CIDDescriptor, treeID string, m *pilorama.Move) (*pilorama.Move, error) {
|
||||||
index, lst, err := e.getTreeShard(d.CID, treeID)
|
index, lst, err := e.getTreeShard(d.CID, treeID)
|
||||||
if err != nil && !errors.Is(err, pilorama.ErrTreeNotFound) {
|
if err != nil && !errors.Is(err, pilorama.ErrTreeNotFound) {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -32,7 +32,7 @@ func (e *StorageEngine) TreeMove(d pilorama.CIDDescriptor, treeID string, m *pil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TreeAddByPath implements the pilorama.Forest interface.
|
// TreeAddByPath implements the pilorama.Forest interface.
|
||||||
func (e *StorageEngine) TreeAddByPath(d pilorama.CIDDescriptor, treeID string, attr string, path []string, m []pilorama.KeyValue) ([]pilorama.LogMove, error) {
|
func (e *StorageEngine) TreeAddByPath(d pilorama.CIDDescriptor, treeID string, attr string, path []string, m []pilorama.KeyValue) ([]pilorama.Move, error) {
|
||||||
index, lst, err := e.getTreeShard(d.CID, treeID)
|
index, lst, err := e.getTreeShard(d.CID, treeID)
|
||||||
if err != nil && !errors.Is(err, pilorama.ErrTreeNotFound) {
|
if err != nil && !errors.Is(err, pilorama.ErrTreeNotFound) {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -41,7 +41,7 @@ func (b *batch) run() {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var lm LogMove
|
var lm Move
|
||||||
return b.forest.applyOperation(bLog, bTree, b.operations, &lm)
|
return b.forest.applyOperation(bLog, bTree, b.operations, &lm)
|
||||||
})
|
})
|
||||||
for i := range b.operations {
|
for i := range b.operations {
|
||||||
|
|
|
@ -142,7 +142,7 @@ func (t *boltForest) Close() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TreeMove implements the Forest interface.
|
// TreeMove implements the Forest interface.
|
||||||
func (t *boltForest) TreeMove(d CIDDescriptor, treeID string, m *Move) (*LogMove, error) {
|
func (t *boltForest) TreeMove(d CIDDescriptor, treeID string, m *Move) (*Move, error) {
|
||||||
if !d.checkValid() {
|
if !d.checkValid() {
|
||||||
return nil, ErrInvalidCIDDescriptor
|
return nil, ErrInvalidCIDDescriptor
|
||||||
}
|
}
|
||||||
|
@ -193,7 +193,7 @@ func (t *boltForest) TreeExists(cid cidSDK.ID, treeID string) (bool, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TreeAddByPath implements the Forest interface.
|
// TreeAddByPath implements the Forest interface.
|
||||||
func (t *boltForest) TreeAddByPath(d CIDDescriptor, treeID string, attr string, path []string, meta []KeyValue) ([]LogMove, error) {
|
func (t *boltForest) TreeAddByPath(d CIDDescriptor, treeID string, attr string, path []string, meta []KeyValue) ([]Move, error) {
|
||||||
if !d.checkValid() {
|
if !d.checkValid() {
|
||||||
return nil, ErrInvalidCIDDescriptor
|
return nil, ErrInvalidCIDDescriptor
|
||||||
}
|
}
|
||||||
|
@ -210,7 +210,7 @@ func (t *boltForest) TreeAddByPath(d CIDDescriptor, treeID string, attr string,
|
||||||
return nil, ErrReadOnlyMode
|
return nil, ErrReadOnlyMode
|
||||||
}
|
}
|
||||||
|
|
||||||
var lm []LogMove
|
var lm []Move
|
||||||
var key [17]byte
|
var key [17]byte
|
||||||
|
|
||||||
fullID := bucketName(d.CID, treeID)
|
fullID := bucketName(d.CID, treeID)
|
||||||
|
@ -226,7 +226,7 @@ func (t *boltForest) TreeAddByPath(d CIDDescriptor, treeID string, attr string,
|
||||||
}
|
}
|
||||||
|
|
||||||
ts := t.getLatestTimestamp(bLog, d.Position, d.Size)
|
ts := t.getLatestTimestamp(bLog, d.Position, d.Size)
|
||||||
lm = make([]LogMove, len(path)-i+1)
|
lm = make([]Move, len(path)-i+1)
|
||||||
for j := i; j < len(path); j++ {
|
for j := i; j < len(path); j++ {
|
||||||
lm[j-i] = Move{
|
lm[j-i] = Move{
|
||||||
Parent: node,
|
Parent: node,
|
||||||
|
@ -329,7 +329,7 @@ func (t *boltForest) TreeApply(d CIDDescriptor, treeID string, m *Move, backgrou
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var lm LogMove
|
var lm Move
|
||||||
return t.applyOperation(bLog, bTree, []*Move{m}, &lm)
|
return t.applyOperation(bLog, bTree, []*Move{m}, &lm)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -404,8 +404,8 @@ func (t *boltForest) getTreeBuckets(tx *bbolt.Tx, treeRoot []byte) (*bbolt.Bucke
|
||||||
}
|
}
|
||||||
|
|
||||||
// applyOperations applies log operations. Assumes lm are sorted by timestamp.
|
// applyOperations applies log operations. Assumes lm are sorted by timestamp.
|
||||||
func (t *boltForest) applyOperation(logBucket, treeBucket *bbolt.Bucket, ms []*Move, lm *LogMove) error {
|
func (t *boltForest) applyOperation(logBucket, treeBucket *bbolt.Bucket, ms []*Move, lm *Move) error {
|
||||||
var tmp LogMove
|
var tmp Move
|
||||||
var cKey [17]byte
|
var cKey [17]byte
|
||||||
|
|
||||||
c := logBucket.Cursor()
|
c := logBucket.Cursor()
|
||||||
|
@ -460,7 +460,7 @@ func (t *boltForest) applyOperation(logBucket, treeBucket *bbolt.Bucket, ms []*M
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *boltForest) do(lb *bbolt.Bucket, b *bbolt.Bucket, key []byte, op *LogMove) error {
|
func (t *boltForest) do(lb *bbolt.Bucket, b *bbolt.Bucket, key []byte, op *Move) error {
|
||||||
binary.BigEndian.PutUint64(key, op.Time)
|
binary.BigEndian.PutUint64(key, op.Time)
|
||||||
rawLog := t.logToBytes(op)
|
rawLog := t.logToBytes(op)
|
||||||
if err := lb.Put(key[:8], rawLog); err != nil {
|
if err := lb.Put(key[:8], rawLog); err != nil {
|
||||||
|
@ -470,7 +470,7 @@ func (t *boltForest) do(lb *bbolt.Bucket, b *bbolt.Bucket, key []byte, op *LogMo
|
||||||
return t.redo(b, key, op, rawLog[16:])
|
return t.redo(b, key, op, rawLog[16:])
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *boltForest) redo(b *bbolt.Bucket, key []byte, op *LogMove, rawMeta []byte) error {
|
func (t *boltForest) redo(b *bbolt.Bucket, key []byte, op *Move, rawMeta []byte) error {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
parent, ts, currMeta, inTree := t.getState(b, stateKey(key, op.Child))
|
parent, ts, currMeta, inTree := t.getState(b, stateKey(key, op.Child))
|
||||||
|
@ -555,7 +555,7 @@ func (t *boltForest) addNode(b *bbolt.Bucket, key []byte, child, parent Node, ti
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *boltForest) undo(m *LogMove, b *bbolt.Bucket, key []byte) error {
|
func (t *boltForest) undo(m *Move, b *bbolt.Bucket, key []byte) error {
|
||||||
if err := b.Delete(childrenKey(key, m.Child, m.Parent)); err != nil {
|
if err := b.Delete(childrenKey(key, m.Child, m.Parent)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -834,13 +834,13 @@ func (t *boltForest) moveFromBytes(m *Move, data []byte) error {
|
||||||
return t.logFromBytes(m, data)
|
return t.logFromBytes(m, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *boltForest) logFromBytes(lm *LogMove, data []byte) error {
|
func (t *boltForest) logFromBytes(lm *Move, data []byte) error {
|
||||||
lm.Child = binary.LittleEndian.Uint64(data)
|
lm.Child = binary.LittleEndian.Uint64(data)
|
||||||
lm.Parent = binary.LittleEndian.Uint64(data[8:])
|
lm.Parent = binary.LittleEndian.Uint64(data[8:])
|
||||||
return lm.Meta.FromBytes(data[16:])
|
return lm.Meta.FromBytes(data[16:])
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *boltForest) logToBytes(lm *LogMove) []byte {
|
func (t *boltForest) logToBytes(lm *Move) []byte {
|
||||||
w := io.NewBufBinWriter()
|
w := io.NewBufBinWriter()
|
||||||
size := 8 + 8 + lm.Meta.Size() + 1
|
size := 8 + 8 + lm.Meta.Size() + 1
|
||||||
//if lm.HasOld {
|
//if lm.HasOld {
|
||||||
|
|
|
@ -25,7 +25,7 @@ func NewMemoryForest() ForestStorage {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TreeMove implements the Forest interface.
|
// TreeMove implements the Forest interface.
|
||||||
func (f *memoryForest) TreeMove(d CIDDescriptor, treeID string, op *Move) (*LogMove, error) {
|
func (f *memoryForest) TreeMove(d CIDDescriptor, treeID string, op *Move) (*Move, error) {
|
||||||
if !d.checkValid() {
|
if !d.checkValid() {
|
||||||
return nil, ErrInvalidCIDDescriptor
|
return nil, ErrInvalidCIDDescriptor
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ func (f *memoryForest) TreeMove(d CIDDescriptor, treeID string, op *Move) (*LogM
|
||||||
}
|
}
|
||||||
|
|
||||||
// TreeAddByPath implements the Forest interface.
|
// TreeAddByPath implements the Forest interface.
|
||||||
func (f *memoryForest) TreeAddByPath(d CIDDescriptor, treeID string, attr string, path []string, m []KeyValue) ([]LogMove, error) {
|
func (f *memoryForest) TreeAddByPath(d CIDDescriptor, treeID string, attr string, path []string, m []KeyValue) ([]Move, error) {
|
||||||
if !d.checkValid() {
|
if !d.checkValid() {
|
||||||
return nil, ErrInvalidCIDDescriptor
|
return nil, ErrInvalidCIDDescriptor
|
||||||
}
|
}
|
||||||
|
@ -64,7 +64,7 @@ func (f *memoryForest) TreeAddByPath(d CIDDescriptor, treeID string, attr string
|
||||||
}
|
}
|
||||||
|
|
||||||
i, node := s.getPathPrefix(attr, path)
|
i, node := s.getPathPrefix(attr, path)
|
||||||
lm := make([]LogMove, len(path)-i+1)
|
lm := make([]Move, len(path)-i+1)
|
||||||
for j := i; j < len(path); j++ {
|
for j := i; j < len(path); j++ {
|
||||||
op := s.do(&Move{
|
op := s.do(&Move{
|
||||||
Parent: node,
|
Parent: node,
|
||||||
|
|
|
@ -11,11 +11,11 @@ type Forest interface {
|
||||||
// TreeMove moves node in the tree.
|
// TreeMove moves node in the tree.
|
||||||
// If the parent of the move operation is TrashID, the node is removed.
|
// If the parent of the move operation is TrashID, the node is removed.
|
||||||
// If the child of the move operation is RootID, new ID is generated and added to a tree.
|
// If the child of the move operation is RootID, new ID is generated and added to a tree.
|
||||||
TreeMove(d CIDDescriptor, treeID string, m *Move) (*LogMove, error)
|
TreeMove(d CIDDescriptor, treeID string, m *Move) (*Move, error)
|
||||||
// TreeAddByPath adds new node in the tree using provided path.
|
// TreeAddByPath adds new node in the tree using provided path.
|
||||||
// The path is constructed by descending from the root using the values of the attr in meta.
|
// The path is constructed by descending from the root using the values of the attr in meta.
|
||||||
// Internal nodes in path should have exactly one attribute, otherwise a new node is created.
|
// Internal nodes in path should have exactly one attribute, otherwise a new node is created.
|
||||||
TreeAddByPath(d CIDDescriptor, treeID string, attr string, path []string, meta []KeyValue) ([]LogMove, error)
|
TreeAddByPath(d CIDDescriptor, treeID string, attr string, path []string, meta []KeyValue) ([]Move, error)
|
||||||
// TreeApply applies replicated operation from another node.
|
// TreeApply applies replicated operation from another node.
|
||||||
// If background is true, TreeApply will first check whether an operation exists.
|
// If background is true, TreeApply will first check whether an operation exists.
|
||||||
TreeApply(d CIDDescriptor, treeID string, m *Move, backgroundSync bool) error
|
TreeApply(d CIDDescriptor, treeID string, m *Move, backgroundSync bool) error
|
||||||
|
|
|
@ -35,9 +35,6 @@ type Move struct {
|
||||||
Child Node
|
Child Node
|
||||||
}
|
}
|
||||||
|
|
||||||
// LogMove represents log record for a single move operation.
|
|
||||||
type LogMove = Move
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// RootID represents the ID of a root node.
|
// RootID represents the ID of a root node.
|
||||||
RootID = 0
|
RootID = 0
|
||||||
|
|
|
@ -12,7 +12,7 @@ var _ pilorama.Forest = (*Shard)(nil)
|
||||||
var ErrPiloramaDisabled = logicerr.New("pilorama is disabled")
|
var ErrPiloramaDisabled = logicerr.New("pilorama is disabled")
|
||||||
|
|
||||||
// TreeMove implements the pilorama.Forest interface.
|
// TreeMove implements the pilorama.Forest interface.
|
||||||
func (s *Shard) TreeMove(d pilorama.CIDDescriptor, treeID string, m *pilorama.Move) (*pilorama.LogMove, error) {
|
func (s *Shard) TreeMove(d pilorama.CIDDescriptor, treeID string, m *pilorama.Move) (*pilorama.Move, error) {
|
||||||
if s.pilorama == nil {
|
if s.pilorama == nil {
|
||||||
return nil, ErrPiloramaDisabled
|
return nil, ErrPiloramaDisabled
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ func (s *Shard) TreeMove(d pilorama.CIDDescriptor, treeID string, m *pilorama.Mo
|
||||||
}
|
}
|
||||||
|
|
||||||
// TreeAddByPath implements the pilorama.Forest interface.
|
// TreeAddByPath implements the pilorama.Forest interface.
|
||||||
func (s *Shard) TreeAddByPath(d pilorama.CIDDescriptor, treeID string, attr string, path []string, meta []pilorama.KeyValue) ([]pilorama.LogMove, error) {
|
func (s *Shard) TreeAddByPath(d pilorama.CIDDescriptor, treeID string, attr string, path []string, meta []pilorama.KeyValue) ([]pilorama.Move, error) {
|
||||||
if s.pilorama == nil {
|
if s.pilorama == nil {
|
||||||
return nil, ErrPiloramaDisabled
|
return nil, ErrPiloramaDisabled
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ import (
|
||||||
type movePair struct {
|
type movePair struct {
|
||||||
cid cidSDK.ID
|
cid cidSDK.ID
|
||||||
treeID string
|
treeID string
|
||||||
op *pilorama.LogMove
|
op *pilorama.Move
|
||||||
}
|
}
|
||||||
|
|
||||||
type replicationTask struct {
|
type replicationTask struct {
|
||||||
|
@ -141,7 +141,7 @@ func (s *Service) replicate(op movePair) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) pushToQueue(cid cidSDK.ID, treeID string, op *pilorama.LogMove) {
|
func (s *Service) pushToQueue(cid cidSDK.ID, treeID string, op *pilorama.Move) {
|
||||||
select {
|
select {
|
||||||
case s.replicateCh <- movePair{
|
case s.replicateCh <- movePair{
|
||||||
cid: cid,
|
cid: cid,
|
||||||
|
|
Loading…
Reference in a new issue