From f9520e3a0827781b4b23ecb7a5a994e256041d16 Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Fri, 17 Mar 2023 21:43:38 +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/model/appearance.go | 16 ++++++--- kernel/model/conf.go | 12 +++++-- kernel/server/serve.go | 6 ++-- kernel/util/runtime.go | 68 +++++++++++++++++++------------------- 4 files changed, 59 insertions(+), 43 deletions(-) diff --git a/kernel/model/appearance.go b/kernel/model/appearance.go index dda76ce62..a44f2f6eb 100644 --- a/kernel/model/appearance.go +++ b/kernel/model/appearance.go @@ -35,13 +35,17 @@ import ( func InitAppearance() { util.SetBootDetails("Initializing appearance...") if err := os.Mkdir(util.AppearancePath, 0755); nil != err && !os.IsExist(err) { - logging.LogFatalf("create appearance folder [%s] failed: %s", util.AppearancePath, err) + logging.LogErrorf("create appearance folder [%s] failed: %s", util.AppearancePath, err) + util.ReportFileSysFatalError(err) + return } unloadThemes() from := filepath.Join(util.WorkingDir, "appearance") if err := gulu.File.Copy(from, util.AppearancePath); nil != err { - logging.LogFatalf("copy appearance resources from [%s] to [%s] failed: %s", from, util.AppearancePath, err) + logging.LogErrorf("copy appearance resources from [%s] to [%s] failed: %s", from, util.AppearancePath, err) + util.ReportFileSysFatalError(err) + return } loadThemes() @@ -95,7 +99,9 @@ func unloadThemes() { func loadThemes() { themeDirs, err := os.ReadDir(util.ThemesPath) if nil != err { - logging.LogFatalf("read appearance themes folder failed: %s", err) + logging.LogErrorf("read appearance themes folder failed: %s", err) + util.ReportFileSysFatalError(err) + return } Conf.Appearance.DarkThemes = nil @@ -204,7 +210,9 @@ func widgetJSON(widgetName string) (ret map[string]interface{}, err error) { func loadIcons() { iconDirs, err := os.ReadDir(util.IconsPath) if nil != err { - logging.LogFatalf("read appearance icons folder failed: %s", err) + logging.LogErrorf("read appearance icons folder failed: %s", err) + util.ReportFileSysFatalError(err) + return } Conf.Appearance.Icons = nil diff --git a/kernel/model/conf.go b/kernel/model/conf.go index e8dab7c92..0c9d8586c 100644 --- a/kernel/model/conf.go +++ b/kernel/model/conf.go @@ -343,13 +343,17 @@ func initLang() { p := filepath.Join(util.WorkingDir, "appearance", "langs") dir, err := os.Open(p) if nil != err { - logging.LogFatalf("open language configuration folder [%s] failed: %s", p, err) + logging.LogErrorf("open language configuration folder [%s] failed: %s", p, err) + util.ReportFileSysFatalError(err) + return } defer dir.Close() langNames, err := dir.Readdirnames(-1) if nil != err { - logging.LogFatalf("list language configuration folder [%s] failed: %s", p, err) + logging.LogErrorf("list language configuration folder [%s] failed: %s", p, err) + util.ReportFileSysFatalError(err) + return } for _, langName := range langNames { @@ -510,7 +514,9 @@ func (conf *AppConf) Save() { func (conf *AppConf) save0(data []byte) { confPath := filepath.Join(util.ConfDir, "conf.json") if err := filelock.WriteFile(confPath, data); nil != err { - logging.LogFatalf("write conf [%s] failed: %s", confPath, err) + logging.LogErrorf("write conf [%s] failed: %s", confPath, err) + util.ReportFileSysFatalError(err) + return } } diff --git a/kernel/server/serve.go b/kernel/server/serve.go index e078ce051..d49e485c0 100644 --- a/kernel/server/serve.go +++ b/kernel/server/serve.go @@ -217,12 +217,14 @@ func serveAppearance(ginServer *gin.Engine) { enUSFilePath := filepath.Join(appearancePath, "langs", "en_US.json") enUSData, err := os.ReadFile(enUSFilePath) if nil != err { - logging.LogFatalf("read en_US.json [%s] failed: %s", enUSFilePath, err) + logging.LogErrorf("read en_US.json [%s] failed: %s", enUSFilePath, err) + util.ReportFileSysFatalError(err) return } enUSMap := map[string]interface{}{} if err = gulu.JSON.UnmarshalJSON(enUSData, &enUSMap); nil != err { - logging.LogFatalf("unmarshal en_US.json [%s] failed: %s", enUSFilePath, err) + logging.LogErrorf("unmarshal en_US.json [%s] failed: %s", enUSFilePath, err) + util.ReportFileSysFatalError(err) return } diff --git a/kernel/util/runtime.go b/kernel/util/runtime.go index d56bde4c1..88118f63e 100644 --- a/kernel/util/runtime.go +++ b/kernel/util/runtime.go @@ -131,41 +131,41 @@ var ( thirdPartySyncCheckTicker = time.NewTicker(time.Minute * 10) ) +func ReportFileSysFatalError(err error) { + stack := debug.Stack() + output := string(stack) + if 5 < strings.Count(output, "\n") { + lines := strings.Split(output, "\n") + output = strings.Join(lines[5:], "\n") + } + logging.LogErrorf("check file system status failed: %s, %s", err, output) + os.Exit(ExitCodeFileSysInconsistent) +} + func CheckFileSysStatus() { if ContainerStd != Container { return } - reportFileSysFatalError := func(err error) { - stack := debug.Stack() - output := string(stack) - if 5 < strings.Count(output, "\n") { - lines := strings.Split(output, "\n") - output = strings.Join(lines[5:], "\n") - } - logging.LogErrorf("check file system status failed: %s, %s", err, output) - os.Exit(ExitCodeFileSysInconsistent) - } - const fileSysStatusCheckFile = ".siyuan/filesys_status_check" for { <-thirdPartySyncCheckTicker.C if IsCloudDrivePath(WorkspaceDir) { - reportFileSysFatalError(fmt.Errorf("workspace dir [%s] is in third party sync dir", WorkspaceDir)) - continue + 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) - continue + ReportFileSysFatalError(err) + return } if err := os.MkdirAll(dir, 0755); nil != err { - reportFileSysFatalError(err) - continue + ReportFileSysFatalError(err) + return } for i := 0; i < 7; i++ { @@ -173,13 +173,13 @@ func CheckFileSysStatus() { data := make([]byte, 1024*4) _, err := rand.Read(data) if nil != err { - reportFileSysFatalError(err) - break + ReportFileSysFatalError(err) + return } if err = os.WriteFile(tmp, data, 0644); nil != err { - reportFileSysFatalError(err) - break + ReportFileSysFatalError(err) + return } time.Sleep(5 * time.Second) @@ -187,7 +187,7 @@ func CheckFileSysStatus() { for j := 0; j < 32; j++ { renamed := tmp + "_renamed" if err = os.Rename(tmp, renamed); nil != err { - reportFileSysFatalError(err) + ReportFileSysFatalError(err) break } @@ -195,24 +195,24 @@ func CheckFileSysStatus() { f, err := os.Open(renamed) if nil != err { - reportFileSysFatalError(err) - break + ReportFileSysFatalError(err) + return } if err = f.Close(); nil != err { - reportFileSysFatalError(err) - break + ReportFileSysFatalError(err) + return } if err = os.Rename(renamed, tmp); nil != err { - reportFileSysFatalError(err) - break + ReportFileSysFatalError(err) + return } entries, err := os.ReadDir(dir) if nil != err { - reportFileSysFatalError(err) - break + ReportFileSysFatalError(err) + return } checkFilenames := bytes.Buffer{} @@ -231,14 +231,14 @@ func CheckFileSysStatus() { buf.WriteString("\n") } output := buf.String() - reportFileSysFatalError(fmt.Errorf("dir [%s] has more than 1 file:\n%s", dir, output)) - break + ReportFileSysFatalError(fmt.Errorf("dir [%s] has more than 1 file:\n%s", dir, output)) + return } } if err = os.RemoveAll(tmp); nil != err { - reportFileSysFatalError(err) - break + ReportFileSysFatalError(err) + return } }