diff --git a/internal/caches/list_file.go b/internal/caches/list_file.go index defa88f..73cb6e6 100644 --- a/internal/caches/list_file.go +++ b/internal/caches/list_file.go @@ -77,39 +77,7 @@ func (this *FileList) Init() error { }**/ // 创建 - _, err = db.Exec(`CREATE TABLE IF NOT EXISTS "` + this.itemsTableName + `" ( - "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, - "hash" varchar(32), - "key" varchar(1024), - "headerSize" integer DEFAULT 0, - "bodySize" integer DEFAULT 0, - "metaSize" integer DEFAULT 0, - "expiredAt" integer DEFAULT 0, - "createdAt" integer DEFAULT 0, - "host" varchar(128), - "serverId" integer -); - -CREATE INDEX IF NOT EXISTS "createdAt" -ON "` + this.itemsTableName + `" ( - "createdAt" ASC -); - -CREATE INDEX IF NOT EXISTS "expiredAt" -ON "` + this.itemsTableName + `" ( - "expiredAt" ASC -); - -CREATE UNIQUE INDEX IF NOT EXISTS "hash" -ON "` + this.itemsTableName + `" ( - "hash" ASC -); - -CREATE INDEX IF NOT EXISTS "serverId" -ON "` + this.itemsTableName + `" ( - "serverId" ASC -); -`) + err = this.initTables(db, 1) if err != nil { return err } @@ -375,6 +343,58 @@ func (this *FileList) Close() error { return nil } +// 初始化 +func (this *FileList) initTables(db *sql.DB, times int) error { + _, err := db.Exec(`CREATE TABLE IF NOT EXISTS "` + this.itemsTableName + `" ( + "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, + "hash" varchar(32), + "key" varchar(1024), + "headerSize" integer DEFAULT 0, + "bodySize" integer DEFAULT 0, + "metaSize" integer DEFAULT 0, + "expiredAt" integer DEFAULT 0, + "createdAt" integer DEFAULT 0, + "host" varchar(128), + "serverId" integer +); + +CREATE INDEX IF NOT EXISTS "createdAt" +ON "` + this.itemsTableName + `" ( + "createdAt" ASC +); + +CREATE INDEX IF NOT EXISTS "expiredAt" +ON "` + this.itemsTableName + `" ( + "expiredAt" ASC +); + +CREATE UNIQUE INDEX IF NOT EXISTS "hash" +ON "` + this.itemsTableName + `" ( + "hash" ASC +); + +CREATE INDEX IF NOT EXISTS "serverId" +ON "` + this.itemsTableName + `" ( + "serverId" ASC +); +`) + if err != nil { + // 尝试删除重建 + if times < 3 { + _, dropErr := db.Exec(`DROP TABLE "` + this.itemsTableName + `"`) + if dropErr == nil { + return this.initTables(db, times+1) + } + return err + } + + return err + } + + return nil +} + +// 删除过期不用的表格 func (this *FileList) removeOldTables() error { rows, err := this.db.Query(`SELECT "name" FROM sqlite_master WHERE "type"='table'`) if err != nil { diff --git a/internal/caches/storage_file.go b/internal/caches/storage_file.go index 56ceb7d..f758469 100644 --- a/internal/caches/storage_file.go +++ b/internal/caches/storage_file.go @@ -499,29 +499,12 @@ func (this *FileStorage) CleanAll() error { } // 重新遍历待删除 - fp2, err := os.Open(dir) - if err != nil { - return err - } - defer func() { - _ = fp2.Close() - }() - subDirs, err = fp2.Readdir(-1) - if err != nil { - return err - } - for _, info := range subDirs { - subDir := info.Name() - if !strings.HasSuffix(subDir, "-deleted") { - continue - } - - // 删除 - err = os.RemoveAll(dir + "/" + subDir) + go func() { + err = this.cleanDeletedDirs(dir) if err != nil { - return err + remotelogs.Warn("CACHE", "delete '*-deleted' dirs failed: "+err.Error()) } - } + }() return nil } @@ -756,7 +739,7 @@ func (this *FileStorage) purgeLoop() { return nil }) if err != nil { - remotelogs.Warn("CACHE", "purge file storage failed: " + err.Error()) + remotelogs.Warn("CACHE", "purge file storage failed: "+err.Error()) } } @@ -798,3 +781,34 @@ func (this *FileStorage) diskCapacityBytes() int64 { } return c1 } + +// 清理 *-deleted 目录 +// 由于在很多硬盘上耗时非常久,所以应该放在后台运行 +func (this *FileStorage) cleanDeletedDirs(dir string) error { + fp, err := os.Open(dir) + if err != nil { + return err + } + defer func() { + _ = fp.Close() + }() + subDirs, err := fp.Readdir(-1) + if err != nil { + return err + } + for _, info := range subDirs { + subDir := info.Name() + if !strings.HasSuffix(subDir, "-deleted") { + continue + } + + // 删除 + err = os.RemoveAll(dir + "/" + subDir) + if err != nil { + if !os.IsNotExist(err) { + return err + } + } + } + return nil +}