diff --git a/commonspace/headsync/diffsyncer.go b/commonspace/headsync/diffsyncer.go index 4cd5ec1a..c58cb58e 100644 --- a/commonspace/headsync/diffsyncer.go +++ b/commonspace/headsync/diffsyncer.go @@ -63,7 +63,10 @@ func (d *diffSyncer) Init(deletionState deletionstate.DeletionState) { func (d *diffSyncer) RemoveObjects(ids []string) { for _, id := range ids { - d.diff.RemoveId(id) + _ = d.diff.RemoveId(id) + } + if err := d.storage.WriteSpaceHash(d.diff.Hash()); err != nil { + d.log.Error("can't write space hash", zap.Error(err)) } } @@ -75,6 +78,9 @@ func (d *diffSyncer) UpdateHeads(id string, heads []string) { Id: id, Head: concatStrings(heads), }) + if err := d.storage.WriteSpaceHash(d.diff.Hash()); err != nil { + d.log.Error("can't write space hash", zap.Error(err)) + } } func (d *diffSyncer) Sync(ctx context.Context) error { diff --git a/commonspace/headsync/diffsyncer_test.go b/commonspace/headsync/diffsyncer_test.go index 686399b2..c74afd8e 100644 --- a/commonspace/headsync/diffsyncer_test.go +++ b/commonspace/headsync/diffsyncer_test.go @@ -148,11 +148,14 @@ func TestDiffSyncer_Sync(t *testing.T) { t.Run("update heads updates diff", func(t *testing.T) { newId := "newId" newHeads := []string{"h1", "h2"} + hash := "hash" diffMock.EXPECT().Set(ldiff.Element{ Id: newId, Head: concatStrings(newHeads), }) + diffMock.EXPECT().Hash().Return(hash) delState.EXPECT().Exists(newId).Return(false) + stMock.EXPECT().WriteSpaceHash(hash) diffSyncer.UpdateHeads(newId, newHeads) }) diff --git a/commonspace/headsync/headsync.go b/commonspace/headsync/headsync.go index ec71f1ad..60168274 100644 --- a/commonspace/headsync/headsync.go +++ b/commonspace/headsync/headsync.go @@ -22,16 +22,14 @@ type TreeHeads struct { } type HeadSync interface { + Init(objectIds []string, deletionState deletionstate.DeletionState) + UpdateHeads(id string, heads []string) HandleRangeRequest(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error) RemoveObjects(ids []string) AllIds() []string DebugAllHeads() (res []TreeHeads) - Init(objectIds []string, deletionState deletionstate.DeletionState) - - StateHash() string - Close() (err error) } @@ -106,10 +104,6 @@ func (d *headSync) RemoveObjects(ids []string) { d.syncer.RemoveObjects(ids) } -func (d *headSync) StateHash() string { - return d.diff.Hash() -} - func (d *headSync) Close() (err error) { d.periodicSync.Close() return nil diff --git a/commonspace/spacestorage/mock_spacestorage/mock_spacestorage.go b/commonspace/spacestorage/mock_spacestorage/mock_spacestorage.go index f349e2eb..26f6bb30 100644 --- a/commonspace/spacestorage/mock_spacestorage/mock_spacestorage.go +++ b/commonspace/spacestorage/mock_spacestorage/mock_spacestorage.go @@ -95,6 +95,21 @@ func (mr *MockSpaceStorageMockRecorder) Id() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Id", reflect.TypeOf((*MockSpaceStorage)(nil).Id)) } +// ReadSpaceHash mocks base method. +func (m *MockSpaceStorage) ReadSpaceHash() (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReadSpaceHash") + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReadSpaceHash indicates an expected call of ReadSpaceHash. +func (mr *MockSpaceStorageMockRecorder) ReadSpaceHash() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadSpaceHash", reflect.TypeOf((*MockSpaceStorage)(nil).ReadSpaceHash)) +} + // SetTreeDeletedStatus mocks base method. func (m *MockSpaceStorage) SetTreeDeletedStatus(arg0, arg1 string) error { m.ctrl.T.Helper() @@ -197,3 +212,17 @@ func (mr *MockSpaceStorageMockRecorder) TreeStorage(arg0 interface{}) *gomock.Ca mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TreeStorage", reflect.TypeOf((*MockSpaceStorage)(nil).TreeStorage), arg0) } + +// WriteSpaceHash mocks base method. +func (m *MockSpaceStorage) WriteSpaceHash(arg0 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WriteSpaceHash", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// WriteSpaceHash indicates an expected call of WriteSpaceHash. +func (mr *MockSpaceStorageMockRecorder) WriteSpaceHash(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteSpaceHash", reflect.TypeOf((*MockSpaceStorage)(nil).WriteSpaceHash), arg0) +} diff --git a/commonspace/spacestorage/spacestorage.go b/commonspace/spacestorage/spacestorage.go index 6321f0de..08469f2f 100644 --- a/commonspace/spacestorage/spacestorage.go +++ b/commonspace/spacestorage/spacestorage.go @@ -34,10 +34,13 @@ type SpaceStorage interface { AclStorage() (liststorage.ListStorage, error) SpaceHeader() (*spacesyncproto.RawSpaceHeaderWithId, error) StoredIds() ([]string, error) - Close() error TreeRoot(id string) (*treechangeproto.RawTreeChangeWithId, error) TreeStorage(id string) (treestorage.TreeStorage, error) CreateTreeStorage(payload treestorage.TreeStorageCreatePayload) (treestorage.TreeStorage, error) + WriteSpaceHash(head string) error + ReadSpaceHash() (hash string, err error) + + Close() error } type SpaceStorageCreatePayload struct {