Add settings snapshot logic
This commit is contained in:
parent
16a5c2efe9
commit
8729d069dc
@ -258,6 +258,20 @@ func (mr *MockObjectTreeMockRecorder) IterateRoot(arg0, arg1 interface{}) *gomoc
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IterateRoot", reflect.TypeOf((*MockObjectTree)(nil).IterateRoot), arg0, arg1)
|
||||
}
|
||||
|
||||
// Len mocks base method.
|
||||
func (m *MockObjectTree) Len() int {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "Len")
|
||||
ret0, _ := ret[0].(int)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// Len indicates an expected call of Len.
|
||||
func (mr *MockObjectTreeMockRecorder) Len() *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockObjectTree)(nil).Len))
|
||||
}
|
||||
|
||||
// Lock mocks base method.
|
||||
func (m *MockObjectTree) Lock() {
|
||||
m.ctrl.T.Helper()
|
||||
|
||||
@ -57,6 +57,7 @@ type ReadableObjectTree interface {
|
||||
ChangeInfo() *treechangeproto.TreeChangeInfo
|
||||
Heads() []string
|
||||
Root() *Change
|
||||
Len() int
|
||||
|
||||
AclList() list.AclList
|
||||
|
||||
@ -135,6 +136,10 @@ func (ot *objectTree) Id() string {
|
||||
return ot.id
|
||||
}
|
||||
|
||||
func (ot *objectTree) Len() int {
|
||||
return ot.tree.Len()
|
||||
}
|
||||
|
||||
func (ot *objectTree) AclList() list.AclList {
|
||||
return ot.aclList
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@ package objecttree
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/anytypeio/any-sync/util/crypto"
|
||||
"math/rand"
|
||||
)
|
||||
|
||||
func commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) {
|
||||
@ -40,3 +41,16 @@ func deriveTreeKey(key crypto.SymKey, cid string) (crypto.SymKey, error) {
|
||||
}
|
||||
return crypto.DeriveSymmetricKey(raw, fmt.Sprintf(crypto.AnysyncTreePath, cid))
|
||||
}
|
||||
|
||||
func DoSnapshot(treeLen int) bool {
|
||||
if treeLen <= 100 {
|
||||
return false
|
||||
}
|
||||
|
||||
var (
|
||||
delta = treeLen/50 + 1
|
||||
midPoint = 1000
|
||||
val = rand.Intn(midPoint * 2)
|
||||
)
|
||||
return midPoint-delta <= val && val <= midPoint+delta
|
||||
}
|
||||
|
||||
@ -383,6 +383,20 @@ func (mr *MockSyncTreeMockRecorder) IterateRoot(arg0, arg1 interface{}) *gomock.
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IterateRoot", reflect.TypeOf((*MockSyncTree)(nil).IterateRoot), arg0, arg1)
|
||||
}
|
||||
|
||||
// Len mocks base method.
|
||||
func (m *MockSyncTree) Len() int {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "Len")
|
||||
ret0, _ := ret[0].(int)
|
||||
return ret0
|
||||
}
|
||||
|
||||
// Len indicates an expected call of Len.
|
||||
func (mr *MockSyncTreeMockRecorder) Len() *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Len", reflect.TypeOf((*MockSyncTree)(nil).Len))
|
||||
}
|
||||
|
||||
// Lock mocks base method.
|
||||
func (m *MockSyncTree) Lock() {
|
||||
m.ctrl.T.Helper()
|
||||
|
||||
@ -40,6 +40,8 @@ var (
|
||||
ErrCantDeleteSpace = errors.New("not able to delete space")
|
||||
)
|
||||
|
||||
var doSnapshot = objecttree.DoSnapshot
|
||||
|
||||
type BuildTreeFunc func(ctx context.Context, id string, listener updatelistener.UpdateListener) (t synctree.SyncTree, err error)
|
||||
|
||||
type Deps struct {
|
||||
@ -228,14 +230,13 @@ func (s *settingsObject) DeleteObject(id string) (err error) {
|
||||
err = ErrObjDoesNotExist
|
||||
return
|
||||
}
|
||||
|
||||
// TODO: add snapshot logic
|
||||
res, err := s.changeFactory.CreateObjectDeleteChange(id, s.state, false)
|
||||
isSnapshot := doSnapshot(s.Len())
|
||||
res, err := s.changeFactory.CreateObjectDeleteChange(id, s.state, isSnapshot)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
return s.addContent(res)
|
||||
return s.addContent(res, isSnapshot)
|
||||
}
|
||||
|
||||
func (s *settingsObject) verifyDeleteSpace(raw *treechangeproto.RawTreeChangeWithId) (err error) {
|
||||
@ -246,12 +247,12 @@ func (s *settingsObject) verifyDeleteSpace(raw *treechangeproto.RawTreeChangeWit
|
||||
return verifyDeleteContent(data, "")
|
||||
}
|
||||
|
||||
func (s *settingsObject) addContent(data []byte) (err error) {
|
||||
func (s *settingsObject) addContent(data []byte, isSnapshot bool) (err error) {
|
||||
accountData := s.account.Account()
|
||||
_, err = s.AddContent(context.Background(), objecttree.SignableChangeContent{
|
||||
Data: data,
|
||||
Key: accountData.SignKey,
|
||||
IsSnapshot: false,
|
||||
IsSnapshot: isSnapshot,
|
||||
IsEncrypted: false,
|
||||
})
|
||||
if err != nil {
|
||||
|
||||
@ -24,9 +24,10 @@ func (c *changeFactory) CreateObjectDeleteChange(id string, state *State, isSnap
|
||||
Content: []*spacesyncproto.SpaceSettingsContent{
|
||||
{Value: content},
|
||||
},
|
||||
Snapshot: nil,
|
||||
}
|
||||
// TODO: add snapshot logic
|
||||
if isSnapshot {
|
||||
change.Snapshot = c.makeSnapshot(state, id, "")
|
||||
}
|
||||
res, err = change.Marshal()
|
||||
return
|
||||
}
|
||||
@ -39,9 +40,21 @@ func (c *changeFactory) CreateSpaceDeleteChange(peerId string, state *State, isS
|
||||
Content: []*spacesyncproto.SpaceSettingsContent{
|
||||
{Value: content},
|
||||
},
|
||||
Snapshot: nil,
|
||||
}
|
||||
// TODO: add snapshot logic
|
||||
if isSnapshot {
|
||||
change.Snapshot = c.makeSnapshot(state, "", peerId)
|
||||
}
|
||||
res, err = change.Marshal()
|
||||
return
|
||||
}
|
||||
|
||||
func (c *changeFactory) makeSnapshot(state *State, objectId, deleterPeer string) *spacesyncproto.SpaceSettingsSnapshot {
|
||||
deletedIds := state.DeletedIds
|
||||
if objectId != "" {
|
||||
deletedIds = append(deletedIds, objectId)
|
||||
}
|
||||
return &spacesyncproto.SpaceSettingsSnapshot{
|
||||
DeletedIds: deletedIds,
|
||||
DeleterPeerId: deleterPeer,
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user