From 42454bf03b4597964989fdb6047b8a1aa286f72b Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Sun, 19 Mar 2023 22:19:42 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E4=BD=BF=E7=94=A8=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E6=96=B9=E5=90=8C=E6=AD=A5=E7=9B=98=E6=97=B6=E5=BC=B9=E5=87=BA?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E5=B9=B6=E9=80=80=E5=87=BA=E5=86=85=E6=A0=B8?= =?UTF-8?q?=20https://github.com/siyuan-note/siyuan/issues/7683?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/util/runtime.go | 144 +++++++++++++++++++++-------------------- 1 file changed, 75 insertions(+), 69 deletions(-) diff --git a/kernel/util/runtime.go b/kernel/util/runtime.go index d4f0642cb..4a6e86ca3 100644 --- a/kernel/util/runtime.go +++ b/kernel/util/runtime.go @@ -130,105 +130,111 @@ func ReportFileSysFatalError(err error) { os.Exit(logging.ExitCodeFileSysErr) } +var checkFileSysStatusLock = sync.Mutex{} + func CheckFileSysStatus() { if ContainerStd != Container { return } - const fileSysStatusCheckFile = ".siyuan/filesys_status_check" - for { <-thirdPartySyncCheckTicker.C + checkFileSysStatus() + } +} - if IsCloudDrivePath(WorkspaceDir) { - ReportFileSysFatalError(fmt.Errorf("workspace dir [%s] is in third party sync dir", WorkspaceDir)) - return - } +func checkFileSysStatus() { + checkFileSysStatusLock.Lock() + defer checkFileSysStatusLock.Unlock() - dir := filepath.Join(DataDir, fileSysStatusCheckFile) - if err := os.RemoveAll(dir); nil != err { + const fileSysStatusCheckFile = ".siyuan/filesys_status_check" + if IsCloudDrivePath(WorkspaceDir) { + ReportFileSysFatalError(fmt.Errorf("workspace dir [%s] is in third party sync dir", WorkspaceDir)) + return + } + + dir := filepath.Join(DataDir, fileSysStatusCheckFile) + if err := os.RemoveAll(dir); nil != err { + ReportFileSysFatalError(err) + return + } + + if err := os.MkdirAll(dir, 0755); nil != err { + ReportFileSysFatalError(err) + return + } + + for i := 0; i < 7; i++ { + tmp := filepath.Join(dir, "check_consistency") + data := make([]byte, 1024*4) + _, err := rand.Read(data) + if nil != err { ReportFileSysFatalError(err) return } - if err := os.MkdirAll(dir, 0755); nil != err { + if err = os.WriteFile(tmp, data, 0644); nil != err { ReportFileSysFatalError(err) return } - for i := 0; i < 7; i++ { - tmp := filepath.Join(dir, "check_consistency") - data := make([]byte, 1024*4) - _, err := rand.Read(data) + time.Sleep(5 * time.Second) + + for j := 0; j < 32; j++ { + renamed := tmp + "_renamed" + if err = os.Rename(tmp, renamed); nil != err { + ReportFileSysFatalError(err) + break + } + + time.Sleep(time.Second) + + f, err := os.Open(renamed) if nil != err { ReportFileSysFatalError(err) return } - if err = os.WriteFile(tmp, data, 0644); nil != err { + if err = f.Close(); nil != err { ReportFileSysFatalError(err) return } - time.Sleep(5 * time.Second) - - for j := 0; j < 32; j++ { - renamed := tmp + "_renamed" - if err = os.Rename(tmp, renamed); nil != err { - ReportFileSysFatalError(err) - break - } - - time.Sleep(time.Second) - - f, err := os.Open(renamed) - if nil != err { - ReportFileSysFatalError(err) - return - } - - if err = f.Close(); nil != err { - ReportFileSysFatalError(err) - return - } - - if err = os.Rename(renamed, tmp); nil != err { - ReportFileSysFatalError(err) - return - } - - entries, err := os.ReadDir(dir) - if nil != err { - ReportFileSysFatalError(err) - return - } - - checkFilenames := bytes.Buffer{} - for _, entry := range entries { - if !entry.IsDir() && strings.Contains(entry.Name(), "check_") { - checkFilenames.WriteString(entry.Name()) - checkFilenames.WriteString("\n") - } - } - lines := strings.Split(strings.TrimSpace(checkFilenames.String()), "\n") - if 1 < len(lines) { - buf := bytes.Buffer{} - for _, line := range lines { - buf.WriteString(" ") - buf.WriteString(line) - buf.WriteString("\n") - } - output := buf.String() - ReportFileSysFatalError(fmt.Errorf("dir [%s] has more than 1 file:\n%s", dir, output)) - return - } - } - - if err = os.RemoveAll(tmp); nil != err { + if err = os.Rename(renamed, tmp); nil != err { ReportFileSysFatalError(err) return } + entries, err := os.ReadDir(dir) + if nil != err { + ReportFileSysFatalError(err) + return + } + + checkFilenames := bytes.Buffer{} + for _, entry := range entries { + if !entry.IsDir() && strings.Contains(entry.Name(), "check_") { + checkFilenames.WriteString(entry.Name()) + checkFilenames.WriteString("\n") + } + } + lines := strings.Split(strings.TrimSpace(checkFilenames.String()), "\n") + if 1 < len(lines) { + buf := bytes.Buffer{} + for _, line := range lines { + buf.WriteString(" ") + buf.WriteString(line) + buf.WriteString("\n") + } + output := buf.String() + ReportFileSysFatalError(fmt.Errorf("dir [%s] has more than 1 file:\n%s", dir, output)) + return + } + } + + if err = os.RemoveAll(tmp); nil != err { + ReportFileSysFatalError(err) + return } } }