From ae9ba8496f69c8b6dd8c2c837f2066052b2544ff Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Sun, 5 Feb 2023 11:11:32 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E4=B8=8D=E5=86=8D=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E4=BB=8E=E4=B8=B4=E6=97=B6=E6=96=87=E4=BB=B6=E4=B8=AD=E6=81=A2?= =?UTF-8?q?=E5=A4=8D=E6=95=B0=E6=8D=AE=E6=96=87=E4=BB=B6=20Fix=20https://g?= =?UTF-8?q?ithub.com/siyuan-note/siyuan/issues/7260?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/filesys/tree.go | 47 +----------------------------------------- kernel/model/box.go | 5 ++++- kernel/util/file.go | 39 ----------------------------------- 3 files changed, 5 insertions(+), 86 deletions(-) diff --git a/kernel/filesys/tree.go b/kernel/filesys/tree.go index 6b0521e13..948821f4f 100644 --- a/kernel/filesys/tree.go +++ b/kernel/filesys/tree.go @@ -24,7 +24,6 @@ import ( "os" "path/filepath" "strings" - "time" "github.com/88250/lute" "github.com/88250/lute/parse" @@ -45,10 +44,7 @@ func LoadTree(boxID, p string, luteEngine *lute.Lute) (ret *parse.Tree, err erro } ret = parseJSON2Tree(boxID, p, data, luteEngine) if nil == ret { - ret = recoverParseJSON2Tree(boxID, p, filePath, luteEngine) - if nil == ret { - return nil, errors.New("parse tree failed") - } + return nil, errors.New("parse tree failed") } ret.Path = p ret.Root.Path = p @@ -185,47 +181,6 @@ func afterWriteTree(tree *parse.Tree) { cache.PutDocIAL(tree.Path, docIAL) } -func recoverParseJSON2Tree(boxID, p, filePath string, luteEngine *lute.Lute) (ret *parse.Tree) { - // 尝试从临时文件恢复 - tmp := util.LatestTmpFile(filePath) - if "" == tmp { - logging.LogWarnf("recover tree [%s] not found tmp", filePath) - return - } - - stat, err := os.Stat(filePath) - if nil != err { - logging.LogErrorf("stat tmp [%s] failed: %s", tmp, err) - return - } - - if stat.ModTime().Before(time.Now().Add(-time.Hour * 24)) { - logging.LogWarnf("tmp [%s] is too old, remove it", tmp) - os.RemoveAll(tmp) - return - } - - data, err := filelock.ReadFile(tmp) - if nil != err { - logging.LogErrorf("recover tree read from tmp [%s] failed: %s", tmp, err) - return - } - if err = filelock.WriteFile(filePath, data); nil != err { - logging.LogErrorf("recover tree write [%s] from tmp [%s] failed: %s", filePath, tmp, err) - return - } - - ret = parseJSON2Tree(boxID, p, data, luteEngine) - if nil == ret { - logging.LogErrorf("recover tree from tmp [%s] parse failed, remove it", tmp) - os.RemoveAll(tmp) - return - } - logging.LogInfof("recovered tree [%s] from [%s]", filePath, tmp) - os.RemoveAll(tmp) - return -} - func parseJSON2Tree(boxID, p string, jsonData []byte, luteEngine *lute.Lute) (ret *parse.Tree) { var err error var needFix bool diff --git a/kernel/model/box.go b/kernel/model/box.go index 4335c9c76..7cee0fdf6 100644 --- a/kernel/model/box.go +++ b/kernel/model/box.go @@ -245,7 +245,10 @@ func (box *Box) Ls(p string) (ret []*FileInfo, totals int, err error) { } if strings.HasSuffix(name, ".tmp") { // 移除写入失败时产生的临时文件 - os.Remove(filepath.Join(util.DataDir, box.ID, p, name)) + removePath := filepath.Join(util.DataDir, box.ID, p, name) + if removeErr := os.Remove(removePath); nil != removeErr { + logging.LogWarnf("remove tmp file [%s] failed: %s", removePath, removeErr) + } continue } diff --git a/kernel/util/file.go b/kernel/util/file.go index ab0c360b3..f39ebe004 100644 --- a/kernel/util/file.go +++ b/kernel/util/file.go @@ -22,7 +22,6 @@ import ( "os" "path" "path/filepath" - "sort" "strings" "unicode/utf8" @@ -79,44 +78,6 @@ func LastID(p string) (name, id string) { return } -func LatestTmpFile(p string) string { - dir, base := filepath.Split(p) - files, err := os.ReadDir(dir) - if nil != err { - logging.LogErrorf("read dir [%s] failed: %s", dir, err) - return "" - } - - var tmps []os.DirEntry - for _, f := range files { - if f.IsDir() { - continue - } - if strings.HasSuffix(f.Name(), ".tmp") && strings.HasPrefix(f.Name(), base) && len(base)+7+len(".tmp") == len(f.Name()) { - tmps = append(tmps, f) - } - } - - if 1 > len(tmps) { - return "" - } - - sort.Slice(tmps, func(i, j int) bool { - info1, err := tmps[i].Info() - if nil != err { - logging.LogErrorf("read file info [%s] failed: %s", tmps[i].Name(), err) - return false - } - info2, err := tmps[j].Info() - if nil != err { - logging.LogErrorf("read file info [%s] failed: %s", tmps[j].Name(), err) - return false - } - return info1.ModTime().After(info2.ModTime()) - }) - return filepath.Join(dir, tmps[0].Name()) -} - func IsCorruptedSYData(data []byte) bool { if 64 > len(data) || '{' != data[0] { return true