From 390d42c5d9476f37721b9dba7bc30f57d8dec8d6 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Wed, 7 Sep 2022 13:55:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=AF=E5=8A=A8=E6=97=B6=E5=B0=9D=E8=AF=95?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E4=BF=AE=E5=A4=8D=E6=8D=9F=E5=9D=8F=E7=9A=84?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E7=B4=A2=E5=BC=95=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/caches/list_file_db.go | 41 ++++++++++++++++++++++++++-- internal/caches/list_file_db_test.go | 6 ++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/internal/caches/list_file_db.go b/internal/caches/list_file_db.go index c3d1ed0..6541af4 100644 --- a/internal/caches/list_file_db.go +++ b/internal/caches/list_file_db.go @@ -10,6 +10,7 @@ import ( "github.com/TeaOSLab/EdgeNode/internal/remotelogs" "github.com/TeaOSLab/EdgeNode/internal/utils" "github.com/TeaOSLab/EdgeNode/internal/utils/dbs" + "github.com/iwind/TeaGo/logs" "github.com/iwind/TeaGo/types" timeutil "github.com/iwind/TeaGo/utils/time" "runtime" @@ -84,6 +85,15 @@ func (this *FileListDB) Open(dbPath string) error { writeDB.SetMaxOpenConns(1) + this.writeDB = dbs.NewDB(writeDB) + + // 检查 + if this.shouldRecover() { + for _, indexName := range []string{"staleAt", "hash"} { + _, _ = this.writeDB.Exec(`REINDEX "` + indexName + `"`) + } + } + // TODO 耗时过长,暂时不整理数据库 // TODO 需要根据行数来判断是否VACUUM // TODO 注意VACUUM反而可能让数据库文件变大 @@ -92,7 +102,6 @@ func (this *FileListDB) Open(dbPath string) error { return err }**/ - this.writeDB = dbs.NewDB(writeDB) this.writeBatch = dbs.NewBatch(writeDB, 4) this.writeBatch.OnFail(func(err error) { remotelogs.Warn("LIST_FILE_DB", "run batch failed: "+err.Error()) @@ -305,8 +314,16 @@ func (this *FileListDB) ListLFUItems(count int) (hashList []string, err error) { } var l = len(hashList) - // 直接删除旧缓存,不再从hits表里查询 - return this.listOlderItems(count - l) + // 从旧缓存中补充 + if l < count { + oldHashList, err := this.listOlderItems(count - l) + if err != nil { + return nil, err + } + hashList = append(hashList, oldHashList...) + } + + return hashList, nil } func (this *FileListDB) ListHashes(lastId int64) (hashList []string, maxId int64, err error) { @@ -554,3 +571,21 @@ func (this *FileListDB) listOlderItems(count int) (hashList []string, err error) return hashList, nil } + +func (this *FileListDB) shouldRecover() bool { + result, err := this.writeDB.Query("pragma integrity_check;") + if err != nil { + logs.Println(result) + } + var errString = "" + var shouldRecover = false + for result.Next() { + err = result.Scan(&errString) + if strings.TrimSpace(errString) != "ok" { + shouldRecover = true + } + break + } + _ = result.Close() + return shouldRecover +} diff --git a/internal/caches/list_file_db_test.go b/internal/caches/list_file_db_test.go index 51ca135..0b5bb0e 100644 --- a/internal/caches/list_file_db_test.go +++ b/internal/caches/list_file_db_test.go @@ -13,6 +13,7 @@ import ( func TestFileListDB_ListLFUItems(t *testing.T) { var db = caches.NewFileListDB() err := db.Open(Tea.Root + "/data/cache-db-large.db") + //err := db.Open(Tea.Root + "/data/cache-index/p1/db-0.db") if err != nil { t.Fatal(err) } @@ -20,6 +21,11 @@ func TestFileListDB_ListLFUItems(t *testing.T) { if err != nil { t.Fatal(err) } + + defer func() { + _ = db.Close() + }() + hashList, err := db.ListLFUItems(100) if err != nil { t.Fatal(err)