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 {
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{
RootRawChange: payload.SpaceSettingsWithId,
Changes: []*treechangeproto.RawTreeChangeWithId{payload.SpaceSettingsWithId},
Heads: []string{payload.SpaceHeaderWithId.Id},
Heads: []string{payload.SpaceSettingsWithId.Id},
})
if err != nil {
return

View File

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

View File

@ -20,6 +20,7 @@ const (
type SettingsDocument interface {
tree.ObjectTree
Init(ctx context.Context) (err error)
Refresh()
DeleteObject(id string) (err error)
NotifyObjectUpdate(id string)
@ -48,10 +49,11 @@ type settingsDocument struct {
lastChangeId string
prov deletedIdsProvider
removeNotifyFunc RemoveObjectsFunc
buildFunc BuildTreeFunc
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{
account: deps.Account,
spaceId: spaceId,
@ -59,11 +61,9 @@ func NewSettingsDocument(ctx context.Context, deps Deps, spaceId string) (doc Se
treeGetter: deps.TreeGetter,
store: deps.Store,
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
if deps.prov == nil {
s.prov = &provider{}
@ -99,6 +99,11 @@ func (s *settingsDocument) Rebuild(tr tree.ObjectTree) {
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() {
s.Lock()
defer s.Unlock()

View File

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

View File

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

View File

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

View File

@ -528,7 +528,7 @@ func (ot *objectTree) Close() error {
}
func (ot *objectTree) Delete() error {
return nil
return ot.treeStorage.Delete()
}
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 {
return strings.HasPrefix(key, t.prefix) && !strings.HasSuffix(key, "/heads")
return strings.HasPrefix(key, t.prefix)
}
type spaceKeys struct {

View File

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