Fix some document deletion bugs

This commit is contained in:
mcrakhman 2022-11-12 22:55:12 +01:00
parent b617cdc690
commit 8854bbbe95
No known key found for this signature in database
GPG Key ID: DED12CFEF5B8396B
10 changed files with 29 additions and 24 deletions

View File

@ -106,7 +106,3 @@ func (t *textDocument) Text() (text string, err error) {
func (t *textDocument) TreeDump() string { func (t *textDocument) TreeDump() string {
return t.TreeDump() return t.TreeDump()
} }
func (t *textDocument) Close() error {
return nil
}

View File

@ -78,7 +78,7 @@ func createSpaceStorage(db *badger.DB, payload spacestorage.SpaceStorageCreatePa
_, err = spaceStore.CreateTreeStorage(storage.TreeStorageCreatePayload{ _, err = spaceStore.CreateTreeStorage(storage.TreeStorageCreatePayload{
RootRawChange: payload.SpaceSettingsWithId, RootRawChange: payload.SpaceSettingsWithId,
Changes: []*treechangeproto.RawTreeChangeWithId{payload.SpaceSettingsWithId}, Changes: []*treechangeproto.RawTreeChangeWithId{payload.SpaceSettingsWithId},
Heads: []string{payload.SpaceHeaderWithId.Id}, Heads: []string{payload.SpaceSettingsWithId.Id},
}) })
if err != nil { if err != nil {
return return

View File

@ -166,15 +166,15 @@ func (t *treeStorage) storedKeys() (keys [][]byte, err error) {
for it.Rewind(); it.Valid(); it.Next() { for it.Rewind(); it.Valid(); it.Next() {
item := it.Item() item := it.Item()
key := item.Key() key := item.Key()
// if it is a heads key
if len(key) <= len(t.keys.HeadsKey()) {
continue
}
keyCopy := make([]byte, 0, len(key)) keyCopy := make([]byte, 0, len(key))
keyCopy = item.KeyCopy(key) keyCopy = item.KeyCopy(key)
keys = append(keys, keyCopy) keys = append(keys, keyCopy)
} }
return nil return nil
}) })
if err != nil {
return
}
keys = append(keys, t.keys.RootIdKey())
return return
} }

View File

@ -20,6 +20,7 @@ const (
type SettingsDocument interface { type SettingsDocument interface {
tree.ObjectTree tree.ObjectTree
Init(ctx context.Context) (err error)
Refresh() Refresh()
DeleteObject(id string) (err error) DeleteObject(id string) (err error)
NotifyObjectUpdate(id string) NotifyObjectUpdate(id string)
@ -48,10 +49,11 @@ type settingsDocument struct {
lastChangeId string lastChangeId string
prov deletedIdsProvider prov deletedIdsProvider
removeNotifyFunc RemoveObjectsFunc removeNotifyFunc RemoveObjectsFunc
buildFunc BuildTreeFunc
deletionStateLock sync.Mutex deletionStateLock sync.Mutex
} }
func NewSettingsDocument(ctx context.Context, deps Deps, spaceId string) (doc SettingsDocument, err error) { func NewSettingsDocument(deps Deps, spaceId string) (doc SettingsDocument, err error) {
s := &settingsDocument{ s := &settingsDocument{
account: deps.Account, account: deps.Account,
spaceId: spaceId, spaceId: spaceId,
@ -59,11 +61,9 @@ func NewSettingsDocument(ctx context.Context, deps Deps, spaceId string) (doc Se
treeGetter: deps.TreeGetter, treeGetter: deps.TreeGetter,
store: deps.Store, store: deps.Store,
removeNotifyFunc: deps.RemoveFunc, removeNotifyFunc: deps.RemoveFunc,
buildFunc: deps.BuildFunc,
} }
s.ObjectTree, err = deps.BuildFunc(ctx, deps.Store.SpaceSettingsId(), s)
if err != nil {
return
}
// this is needed mainly for testing // this is needed mainly for testing
if deps.prov == nil { if deps.prov == nil {
s.prov = &provider{} s.prov = &provider{}
@ -99,6 +99,11 @@ func (s *settingsDocument) Rebuild(tr tree.ObjectTree) {
s.toBeDeleted(ids) s.toBeDeleted(ids)
} }
func (s *settingsDocument) Init(ctx context.Context) (err error) {
s.ObjectTree, err = s.buildFunc(ctx, s.store.SpaceSettingsId(), s)
return
}
func (s *settingsDocument) Refresh() { func (s *settingsDocument) Refresh() {
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()

View File

@ -150,6 +150,7 @@ func (s *space) Init(ctx context.Context) (err error) {
if err != nil { if err != nil {
return return
} }
s.aclList = syncacl.NewSyncACL(aclList, s.syncService.StreamPool())
deps := settingsdocument.Deps{ deps := settingsdocument.Deps{
BuildFunc: s.BuildTree, BuildFunc: s.BuildTree,
@ -158,7 +159,7 @@ func (s *space) Init(ctx context.Context) (err error) {
Store: s.storage, Store: s.storage,
RemoveFunc: s.diffService.RemoveObjects, RemoveFunc: s.diffService.RemoveObjects,
} }
s.settingsDocument, err = settingsdocument.NewSettingsDocument(context.Background(), deps, s.id) s.settingsDocument, err = settingsdocument.NewSettingsDocument(deps, s.id)
if err != nil { if err != nil {
return return
} }
@ -166,8 +167,10 @@ func (s *space) Init(ctx context.Context) (err error) {
s.diffService.UpdateHeads(id, heads) s.diffService.UpdateHeads(id, heads)
s.settingsDocument.NotifyObjectUpdate(id) s.settingsDocument.NotifyObjectUpdate(id)
}) })
s.settingsDocument.Refresh() err = s.settingsDocument.Init(ctx)
s.aclList = syncacl.NewSyncACL(aclList, s.syncService.StreamPool()) if err != nil {
return
}
objectGetter := newCommonSpaceGetter(s.id, s.aclList, s.cache, s.settingsDocument) objectGetter := newCommonSpaceGetter(s.id, s.aclList, s.cache, s.settingsDocument)
s.syncService.Init(objectGetter) s.syncService.Init(objectGetter)
s.diffService.Init(initialIds) s.diffService.Init(initialIds)
@ -175,6 +178,7 @@ func (s *space) Init(ctx context.Context) (err error) {
s.settingsDocument.Refresh() s.settingsDocument.Refresh()
return nil return nil
}, log) }, log)
s.settingsSync.Run()
return nil return nil
} }

View File

@ -277,8 +277,8 @@ func (s *SyncTree) Close() (err error) {
log.With("id", s.ID()).Debug("closing sync tree") log.With("id", s.ID()).Debug("closing sync tree")
s.Lock() s.Lock()
defer s.Unlock() defer s.Unlock()
if err = s.checkAlive(); err != nil { if s.isClosed {
return return ErrSyncTreeClosed
} }
s.isClosed = true s.isClosed = true
return return

View File

@ -156,7 +156,8 @@ func (c *changeBuilder) BuildContent(payload BuilderContent) (ch *Change, rawIdC
IsSnapshot: payload.IsSnapshot, IsSnapshot: payload.IsSnapshot,
} }
if payload.ReadKey != nil { if payload.ReadKey != nil {
encrypted, err := payload.ReadKey.Encrypt(payload.Content) var encrypted []byte
encrypted, err = payload.ReadKey.Encrypt(payload.Content)
if err != nil { if err != nil {
return return
} }
@ -191,7 +192,6 @@ func (c *changeBuilder) BuildContent(payload BuilderContent) (ch *Change, rawIdC
} }
ch = NewChange(id, change, signature) ch = NewChange(id, change, signature)
ch.Model = payload.Content
rawIdChange = &treechangeproto.RawTreeChangeWithId{ rawIdChange = &treechangeproto.RawTreeChangeWithId{
RawChange: marshalledRawChange, RawChange: marshalledRawChange,

View File

@ -528,7 +528,7 @@ func (ot *objectTree) Close() error {
} }
func (ot *objectTree) Delete() error { func (ot *objectTree) Delete() error {
return nil return ot.treeStorage.Delete()
} }
func (ot *objectTree) SnapshotPath() []string { func (ot *objectTree) SnapshotPath() []string {

View File

@ -47,7 +47,7 @@ func (t treeKeys) RawChangeKey(id string) []byte {
} }
func (t treeKeys) isTreeRecordKey(key string) bool { func (t treeKeys) isTreeRecordKey(key string) bool {
return strings.HasPrefix(key, t.prefix) && !strings.HasSuffix(key, "/heads") return strings.HasPrefix(key, t.prefix)
} }
type spaceKeys struct { type spaceKeys struct {

View File

@ -137,7 +137,7 @@ func createSpaceStorage(rootPath string, payload spacestorage.SpaceStorageCreate
_, err = store.CreateTreeStorage(storage.TreeStorageCreatePayload{ _, err = store.CreateTreeStorage(storage.TreeStorageCreatePayload{
RootRawChange: payload.SpaceSettingsWithId, RootRawChange: payload.SpaceSettingsWithId,
Changes: []*treechangeproto.RawTreeChangeWithId{payload.SpaceSettingsWithId}, Changes: []*treechangeproto.RawTreeChangeWithId{payload.SpaceSettingsWithId},
Heads: []string{payload.SpaceHeaderWithId.Id}, Heads: []string{payload.SpaceSettingsWithId.Id},
}) })
if err != nil { if err != nil {
return return