1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-09 17:44:59 +09:00

Merge pull request #1376 from anyproto/fix-repeated-statuses

Fix repeated sync status event sending
This commit is contained in:
Anastasia Shemyakinskaya 2024-07-10 17:13:33 +02:00 committed by GitHub
commit cd155c5ef9
Signed by: github
GPG key ID: B5690EEEBB952194
4 changed files with 55 additions and 19 deletions

View file

@ -79,6 +79,10 @@ func (o *ObjectState) SetSyncStatusAndErr(status domain.SpaceSyncStatus, syncErr
o.objectSyncStatusBySpace[spaceId] = domain.Syncing
o.objectSyncErrBySpace[spaceId] = domain.Null
return
} else if ok && objectNumber == 0 && status == domain.Syncing {
o.objectSyncStatusBySpace[spaceId] = domain.Synced
o.objectSyncErrBySpace[spaceId] = domain.Null
return
}
o.objectSyncStatusBySpace[spaceId] = status
o.objectSyncErrBySpace[spaceId] = syncErr

View file

@ -142,4 +142,16 @@ func TestObjectState_SetSyncStatus(t *testing.T) {
// then
assert.Equal(t, domain.Offline, objectState.GetSyncStatus("spaceId"))
})
t.Run("SetSyncStatusAndErr, syncing", func(t *testing.T) {
// given
objectState := NewObjectState(objectstore.NewStoreFixture(t))
// when
syncStatus := domain.MakeSyncStatus("spaceId", domain.Syncing, domain.Null, domain.Objects)
objectState.SetObjectsNumber(syncStatus)
objectState.SetSyncStatusAndErr(syncStatus.Status, domain.Null, syncStatus.SpaceId)
// then
assert.Equal(t, domain.Synced, objectState.GetSyncStatus("spaceId"))
})
}

View file

@ -156,7 +156,8 @@ func (s *spaceSyncStatus) processEvents() {
}
func (s *spaceSyncStatus) updateSpaceSyncStatus(receivedStatus *domain.SpaceSync) {
if s.isStatusNotChanged(receivedStatus) {
currSyncStatus := s.getSpaceSyncStatus(receivedStatus.SpaceId)
if s.isStatusNotChanged(receivedStatus, currSyncStatus) {
return
}
state := s.getCurrentState(receivedStatus)
@ -168,7 +169,7 @@ func (s *spaceSyncStatus) updateSpaceSyncStatus(receivedStatus *domain.SpaceSync
spaceStatus := s.getSpaceSyncStatus(receivedStatus.SpaceId)
// send synced event only if files and objects are all synced
if !s.needToSendEvent(spaceStatus, prevObjectNumber, newObjectNumber) {
if !s.needToSendEvent(spaceStatus, currSyncStatus, prevObjectNumber, newObjectNumber) {
return
}
s.eventSender.Broadcast(&pb.Event{
@ -181,13 +182,12 @@ func (s *spaceSyncStatus) updateSpaceSyncStatus(receivedStatus *domain.SpaceSync
state.ResetSpaceErrorStatus(receivedStatus.SpaceId, receivedStatus.SyncError)
}
func (s *spaceSyncStatus) isStatusNotChanged(status *domain.SpaceSync) bool {
func (s *spaceSyncStatus) isStatusNotChanged(status *domain.SpaceSync, syncStatus domain.SpaceSyncStatus) bool {
if status.Status == domain.Syncing {
// we need to check if number of syncing object is changed first
return false
}
syncErrNotChanged := s.getError(status.SpaceId) == mapError(status.SyncError)
syncStatus := s.getSpaceSyncStatus(status.SpaceId)
if syncStatus == domain.Unknown {
return false
}
@ -198,9 +198,9 @@ func (s *spaceSyncStatus) isStatusNotChanged(status *domain.SpaceSync) bool {
return false
}
func (s *spaceSyncStatus) needToSendEvent(status domain.SpaceSyncStatus, prevObjectNumber int64, newObjectNumber int64) bool {
func (s *spaceSyncStatus) needToSendEvent(status domain.SpaceSyncStatus, currSyncStatus domain.SpaceSyncStatus, prevObjectNumber int64, newObjectNumber int64) bool {
// that because we get update on syncing objects count, so we need to send updated object counter to client
return status != domain.Syncing || prevObjectNumber != newObjectNumber
return (status == domain.Syncing && prevObjectNumber != newObjectNumber) || currSyncStatus != status
}
func (s *spaceSyncStatus) Close(ctx context.Context) (err error) {

View file

@ -352,19 +352,6 @@ func TestSpaceSyncStatus_updateSpaceSyncStatus(t *testing.T) {
t.Run("send synced event", func(t *testing.T) {
// given
eventSender := mock_event.NewMockSender(t)
eventSender.EXPECT().Broadcast(&pb.Event{
Messages: []*pb.EventMessage{{
Value: &pb.EventMessageValueOfSpaceSyncStatusUpdate{
SpaceSyncStatusUpdate: &pb.EventSpaceSyncStatusUpdate{
Id: "spaceId",
Status: pb.EventSpace_Synced,
Network: pb.EventSpace_SelfHost,
Error: pb.EventSpace_Null,
SyncingObjectsCounter: 0,
},
},
}},
})
status := spaceSyncStatus{
eventSender: eventSender,
networkConfig: &config.Config{NetworkMode: pb.RpcAccount_CustomConfig},
@ -495,6 +482,39 @@ func TestSpaceSyncStatus_updateSpaceSyncStatus(t *testing.T) {
status.updateSpaceSyncStatus(syncStatus)
status.updateSpaceSyncStatus(syncStatus)
})
t.Run("not send not changed event", func(t *testing.T) {
// given
eventSender := mock_event.NewMockSender(t)
status := spaceSyncStatus{
eventSender: eventSender,
networkConfig: &config.Config{NetworkMode: pb.RpcAccount_CustomConfig},
batcher: mb.New[*domain.SpaceSync](0),
filesState: NewFileState(objectstore.NewStoreFixture(t)),
objectsState: NewObjectState(objectstore.NewStoreFixture(t)),
}
status.objectsState.SetSyncStatusAndErr(domain.Synced, domain.Null, "spaceId")
status.filesState.SetSyncStatusAndErr(domain.Synced, domain.Null, "spaceId")
// then
syncStatus := domain.MakeSyncStatus("spaceId", domain.Syncing, domain.Null, domain.Objects)
status.objectsState.SetObjectsNumber(syncStatus)
status.updateSpaceSyncStatus(syncStatus)
// when
eventSender.AssertNotCalled(t, "Broadcast", &pb.Event{
Messages: []*pb.EventMessage{{
Value: &pb.EventMessageValueOfSpaceSyncStatusUpdate{
SpaceSyncStatusUpdate: &pb.EventSpaceSyncStatusUpdate{
Id: "spaceId",
Status: pb.EventSpace_Synced,
Network: pb.EventSpace_SelfHost,
Error: pb.EventSpace_Null,
SyncingObjectsCounter: 0,
},
},
}},
})
})
}
func TestSpaceSyncStatus_SendUpdate(t *testing.T) {