mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-11 22:00:25 +08:00
优化文件缓存
This commit is contained in:
@@ -77,39 +77,7 @@ func (this *FileList) Init() error {
|
|||||||
}**/
|
}**/
|
||||||
|
|
||||||
// 创建
|
// 创建
|
||||||
_, err = db.Exec(`CREATE TABLE IF NOT EXISTS "` + this.itemsTableName + `" (
|
err = this.initTables(db, 1)
|
||||||
"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 err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -375,6 +343,58 @@ func (this *FileList) Close() error {
|
|||||||
return nil
|
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 {
|
func (this *FileList) removeOldTables() error {
|
||||||
rows, err := this.db.Query(`SELECT "name" FROM sqlite_master WHERE "type"='table'`)
|
rows, err := this.db.Query(`SELECT "name" FROM sqlite_master WHERE "type"='table'`)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -499,29 +499,12 @@ func (this *FileStorage) CleanAll() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 重新遍历待删除
|
// 重新遍历待删除
|
||||||
fp2, err := os.Open(dir)
|
go func() {
|
||||||
|
err = this.cleanDeletedDirs(dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
remotelogs.Warn("CACHE", "delete '*-deleted' dirs failed: "+err.Error())
|
||||||
}
|
}
|
||||||
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)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -798,3 +781,34 @@ func (this *FileStorage) diskCapacityBytes() int64 {
|
|||||||
}
|
}
|
||||||
return c1
|
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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user