From 651f245662b299b4e23bfd980630185a6e0bbee4 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sat, 13 Jan 2024 22:30:57 +0800 Subject: [PATCH] :art: Flashcards are not allowed to be modified during data sync to avoid data overwriting https://github.com/siyuan-note/siyuan/issues/10167 --- kernel/model/flashcard.go | 4 ++-- kernel/model/repository.go | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/kernel/model/flashcard.go b/kernel/model/flashcard.go index bf1693aa1..711e155ae 100644 --- a/kernel/model/flashcard.go +++ b/kernel/model/flashcard.go @@ -641,7 +641,7 @@ func (tx *Transaction) doRemoveFlashcards(operation *Operation) (ret *TxErr) { deckLock.Lock() defer deckLock.Unlock() - if isSyncing.Load() { + if isSyncingStorages() { ret = &TxErr{code: TxErrCodeDataIsSyncing} return } @@ -753,7 +753,7 @@ func (tx *Transaction) doAddFlashcards(operation *Operation) (ret *TxErr) { deckLock.Lock() defer deckLock.Unlock() - if isSyncing.Load() { + if isSyncingStorages() { ret = &TxErr{code: TxErrCodeDataIsSyncing} return } diff --git a/kernel/model/repository.go b/kernel/model/repository.go index 0c54bbc86..ad0959d62 100644 --- a/kernel/model/repository.go +++ b/kernel/model/repository.go @@ -955,11 +955,15 @@ var syncingFiles = sync.Map{} var syncingStorages = atomic.Bool{} func waitForSyncingStorages() { - for syncingStorages.Load() { + for isSyncingStorages() { time.Sleep(time.Second) } } +func isSyncingStorages() bool { + return syncingStorages.Load() || isBootSyncing.Load() +} + func IsSyncingFile(rootID string) (ret bool) { _, ret = syncingFiles.Load(rootID) return @@ -1105,6 +1109,8 @@ func syncRepoUpload() (err error) { return } +var isBootSyncing = atomic.Bool{} + func bootSyncRepo() (err error) { if 1 > len(Conf.Repo.Key) { autoSyncErrCount++ @@ -1129,11 +1135,14 @@ func bootSyncRepo() (err error) { return } + isBootSyncing.Store(true) + start := time.Now() _, _, err = indexRepoBeforeCloudSync(repo) if nil != err { autoSyncErrCount++ planSyncAfter(fixSyncInterval) + isBootSyncing.Store(false) return } @@ -1180,17 +1189,21 @@ func bootSyncRepo() (err error) { util.PushStatusBar(msg) util.PushErrMsg(msg, 0) BootSyncSucc = 1 + isBootSyncing.Store(false) return } if 0 < len(fetchedFiles) { go func() { _, syncErr := syncRepo(false, false) + isBootSyncing.Store(false) if nil != err { logging.LogErrorf("boot background sync repo failed: %s", syncErr) return } }() + } else { + isBootSyncing.Store(false) } return }