Change deleter peer logic

This commit is contained in:
mcrakhman 2023-02-27 14:24:28 +01:00 committed by Mikhail Iudin
parent fa52eb413d
commit 3caa36d3a5
No known key found for this signature in database
GPG Key ID: FAAAA8BAABDFF1C0
3 changed files with 49 additions and 36 deletions

View File

@ -4,6 +4,7 @@ package settings
import ( import (
"context" "context"
"errors" "errors"
"fmt"
"github.com/anytypeio/any-sync/accountservice" "github.com/anytypeio/any-sync/accountservice"
"github.com/anytypeio/any-sync/app/logger" "github.com/anytypeio/any-sync/app/logger"
"github.com/anytypeio/any-sync/commonspace/object/tree/objecttree" "github.com/anytypeio/any-sync/commonspace/object/tree/objecttree"
@ -26,16 +27,15 @@ type SettingsObject interface {
synctree.SyncTree synctree.SyncTree
Init(ctx context.Context) (err error) Init(ctx context.Context) (err error)
DeleteObject(id string) (err error) DeleteObject(id string) (err error)
DeleteSpace(ctx context.Context, deleterId string, raw *treechangeproto.RawTreeChangeWithId) (err error) DeleteSpace(ctx context.Context, raw *treechangeproto.RawTreeChangeWithId) (err error)
SpaceDeleteRawChange(deleterId string) (raw *treechangeproto.RawTreeChangeWithId, err error) SpaceDeleteRawChange() (raw *treechangeproto.RawTreeChangeWithId, err error)
} }
var ( var (
ErrDeleteSelf = errors.New("cannot delete self") ErrDeleteSelf = errors.New("cannot delete self")
ErrAlreadyDeleted = errors.New("the object is already deleted") ErrAlreadyDeleted = errors.New("the object is already deleted")
ErrObjDoesNotExist = errors.New("the object does not exist") ErrObjDoesNotExist = errors.New("the object does not exist")
ErrCantDeleteSpace = errors.New("not able to delete space") ErrCantDeleteSpace = errors.New("not able to delete space")
ErrIncorrectDeleteChange = errors.New("incorrect delete change")
) )
type BuildTreeFunc func(ctx context.Context, id string, listener updatelistener.UpdateListener) (t synctree.SyncTree, err error) type BuildTreeFunc func(ctx context.Context, id string, listener updatelistener.UpdateListener) (t synctree.SyncTree, err error)
@ -137,7 +137,7 @@ func (s *settingsObject) updateIds(tr objecttree.ObjectTree) {
log.Error("failed to build state", zap.Error(err)) log.Error("failed to build state", zap.Error(err))
return return
} }
log.Debug("updating object state", zap.String("deleterId", s.state.DeleterId)) log.Debug("updating object state", zap.String("deleted by", s.state.DeleterId))
if err = s.deletionManager.UpdateState(context.Background(), s.state); err != nil { if err = s.deletionManager.UpdateState(context.Background(), s.state); err != nil {
log.Error("failed to update state", zap.Error(err)) log.Error("failed to update state", zap.Error(err))
} }
@ -172,13 +172,13 @@ func (s *settingsObject) Close() error {
return s.SyncTree.Close() return s.SyncTree.Close()
} }
func (s *settingsObject) DeleteSpace(ctx context.Context, deleterId string, raw *treechangeproto.RawTreeChangeWithId) (err error) { func (s *settingsObject) DeleteSpace(ctx context.Context, raw *treechangeproto.RawTreeChangeWithId) (err error) {
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()
defer func() { defer func() {
log.Debug("finished adding delete change", zap.Error(err)) log.Debug("finished adding delete change", zap.Error(err))
}() }()
err = s.verifyDeleteSpace(deleterId, raw) err = s.verifyDeleteSpace(raw)
if err != nil { if err != nil {
return return
} }
@ -196,12 +196,12 @@ func (s *settingsObject) DeleteSpace(ctx context.Context, deleterId string, raw
return return
} }
func (s *settingsObject) SpaceDeleteRawChange(deleterId string) (raw *treechangeproto.RawTreeChangeWithId, err error) { func (s *settingsObject) SpaceDeleteRawChange() (raw *treechangeproto.RawTreeChangeWithId, err error) {
data, err := s.changeFactory.CreateSpaceDeleteChange(deleterId, s.state, false) accountData := s.account.Account()
data, err := s.changeFactory.CreateSpaceDeleteChange(accountData.PeerId, s.state, false)
if err != nil { if err != nil {
return return
} }
accountData := s.account.Account()
return s.PrepareChange(objecttree.SignableChangeContent{ return s.PrepareChange(objecttree.SignableChangeContent{
Data: data, Data: data,
Key: accountData.SignKey, Key: accountData.SignKey,
@ -237,7 +237,7 @@ func (s *settingsObject) DeleteObject(id string) (err error) {
return s.addContent(res) return s.addContent(res)
} }
func (s *settingsObject) verifyDeleteSpace(peerId string, raw *treechangeproto.RawTreeChangeWithId) (err error) { func (s *settingsObject) verifyDeleteSpace(raw *treechangeproto.RawTreeChangeWithId) (err error) {
data, err := s.UnpackChange(raw) data, err := s.UnpackChange(raw)
if err != nil { if err != nil {
return return
@ -249,8 +249,8 @@ func (s *settingsObject) verifyDeleteSpace(peerId string, raw *treechangeproto.R
} }
if len(content.GetContent()) != 1 || if len(content.GetContent()) != 1 ||
content.GetContent()[0].GetSpaceDelete() == nil || content.GetContent()[0].GetSpaceDelete() == nil ||
content.GetContent()[0].GetSpaceDelete().GetDeleterPeerId() != peerId { content.GetContent()[0].GetSpaceDelete().GetDeleterPeerId() == "" {
return ErrIncorrectDeleteChange return fmt.Errorf("incorrect delete change payload")
} }
return return
} }

View File

@ -235,11 +235,11 @@ func TestSettingsObject_DeleteSpace(t *testing.T) {
Heads: []string{rawCh.Id}, Heads: []string{rawCh.Id},
}, nil) }, nil)
err = fx.doc.DeleteSpace(context.Background(), deleterId, rawCh) err = fx.doc.DeleteSpace(context.Background(), rawCh)
require.NoError(t, err) require.NoError(t, err)
} }
func TestSettingsObject_DeleteSpaceIncorrectPeerId(t *testing.T) { func TestSettingsObject_DeleteSpaceIncorrectChange(t *testing.T) {
fx := newSettingsFixture(t) fx := newSettingsFixture(t)
defer fx.stop() defer fx.stop()
@ -250,15 +250,29 @@ func TestSettingsObject_DeleteSpaceIncorrectPeerId(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
deleterId := "delId" t.Run("incorrect change type", func(t *testing.T) {
rawCh := &treechangeproto.RawTreeChangeWithId{ rawCh := &treechangeproto.RawTreeChangeWithId{
RawChange: []byte{1}, RawChange: []byte{1},
Id: "id", Id: "id",
} }
changeFactory := settingsstate.NewChangeFactory() changeFactory := settingsstate.NewChangeFactory()
delChange, _ := changeFactory.CreateSpaceDeleteChange("otherId", &settingsstate.State{}, false) delChange, _ := changeFactory.CreateObjectDeleteChange("otherId", &settingsstate.State{}, false)
fx.syncTree.EXPECT().UnpackChange(rawCh).Return(delChange, nil) fx.syncTree.EXPECT().UnpackChange(rawCh).Return(delChange, nil)
err = fx.doc.DeleteSpace(context.Background(), deleterId, rawCh) err = fx.doc.DeleteSpace(context.Background(), rawCh)
require.Equal(t, err, ErrIncorrectDeleteChange) require.NotNil(t, err)
})
t.Run("empty peer", func(t *testing.T) {
rawCh := &treechangeproto.RawTreeChangeWithId{
RawChange: []byte{1},
Id: "id",
}
changeFactory := settingsstate.NewChangeFactory()
delChange, _ := changeFactory.CreateSpaceDeleteChange("", &settingsstate.State{}, false)
fx.syncTree.EXPECT().UnpackChange(rawCh).Return(delChange, nil)
err = fx.doc.DeleteSpace(context.Background(), rawCh)
require.NotNil(t, err)
})
} }

View File

@ -38,8 +38,7 @@ import (
) )
var ( var (
ErrSpaceClosed = errors.New("space is closed") ErrSpaceClosed = errors.New("space is closed")
ErrPutNotImplemented = errors.New("put tree is not implemented")
) )
type SpaceCreatePayload struct { type SpaceCreatePayload struct {
@ -99,8 +98,8 @@ type Space interface {
DeleteTree(ctx context.Context, id string) (err error) DeleteTree(ctx context.Context, id string) (err error)
BuildHistoryTree(ctx context.Context, id string, opts HistoryTreeOpts) (t objecttree.HistoryTree, err error) BuildHistoryTree(ctx context.Context, id string, opts HistoryTreeOpts) (t objecttree.HistoryTree, err error)
SpaceDeleteRawChange(ctx context.Context, deleterPeer string) (raw *treechangeproto.RawTreeChangeWithId, err error) SpaceDeleteRawChange(ctx context.Context) (raw *treechangeproto.RawTreeChangeWithId, err error)
DeleteSpace(ctx context.Context, deleterPeer string, deleteChange *treechangeproto.RawTreeChangeWithId) (err error) DeleteSpace(ctx context.Context, deleteChange *treechangeproto.RawTreeChangeWithId) (err error)
HeadSync() headsync.HeadSync HeadSync() headsync.HeadSync
ObjectSync() objectsync.ObjectSync ObjectSync() objectsync.ObjectSync
@ -369,12 +368,12 @@ func (s *space) DeleteTree(ctx context.Context, id string) (err error) {
return s.settingsObject.DeleteObject(id) return s.settingsObject.DeleteObject(id)
} }
func (s *space) SpaceDeleteRawChange(ctx context.Context, deleterPeer string) (raw *treechangeproto.RawTreeChangeWithId, err error) { func (s *space) SpaceDeleteRawChange(ctx context.Context) (raw *treechangeproto.RawTreeChangeWithId, err error) {
return s.settingsObject.SpaceDeleteRawChange(deleterPeer) return s.settingsObject.SpaceDeleteRawChange()
} }
func (s *space) DeleteSpace(ctx context.Context, deleterPeer string, deleteChange *treechangeproto.RawTreeChangeWithId) (err error) { func (s *space) DeleteSpace(ctx context.Context, deleteChange *treechangeproto.RawTreeChangeWithId) (err error) {
return s.settingsObject.DeleteSpace(ctx, deleterPeer, deleteChange) return s.settingsObject.DeleteSpace(ctx, deleteChange)
} }
func (s *space) HandleMessage(ctx context.Context, hm HandleMessage) (err error) { func (s *space) HandleMessage(ctx context.Context, hm HandleMessage) (err error) {