Enhance FileInfo structure and DiskFS functionality
All checks were successful
Release Tag / release (push) Successful in 12s
All checks were successful
Release Tag / release (push) Successful in 12s
- Added CTime (creation time) and AccessCount fields to FileInfo struct for better file metadata tracking. - Updated NewFileInfo and NewFileInfoFromOS functions to initialize new fields. - Enhanced DiskFS to maintain access counts and file metadata, including flushing to JSON files. - Modified Open and Create methods to increment access counts and set creation times appropriately. - Updated garbage collection logic to utilize real access counts for files.
This commit is contained in:
@@ -3,8 +3,10 @@ package disk
|
||||
|
||||
import (
|
||||
"container/list"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"s1d3sw1ped/SteamCache2/steamcache/logger"
|
||||
@@ -56,12 +58,17 @@ var _ vfs.VFS = (*DiskFS)(nil)
|
||||
type DiskFS struct {
|
||||
root string
|
||||
|
||||
info map[string]*vfs.FileInfo
|
||||
capacity int64
|
||||
size int64
|
||||
mu sync.RWMutex
|
||||
keyLocks sync.Map // map[string]*sync.RWMutex
|
||||
LRU *lruList
|
||||
info map[string]*vfs.FileInfo
|
||||
capacity int64
|
||||
size int64
|
||||
mu sync.RWMutex
|
||||
keyLocks sync.Map // map[string]*sync.RWMutex
|
||||
LRU *lruList
|
||||
accessCounts map[string]int64 // key: filename, value: access count
|
||||
fileMeta map[string]struct {
|
||||
AccessCount int64
|
||||
CTime int64
|
||||
} // key: filename
|
||||
}
|
||||
|
||||
// lruList for LRU eviction
|
||||
@@ -129,12 +136,17 @@ func new(root string, capacity int64, skipinit bool) *DiskFS {
|
||||
}
|
||||
|
||||
dfs := &DiskFS{
|
||||
root: root,
|
||||
info: make(map[string]*vfs.FileInfo),
|
||||
capacity: capacity,
|
||||
mu: sync.RWMutex{},
|
||||
keyLocks: sync.Map{},
|
||||
LRU: newLruList(),
|
||||
root: root,
|
||||
info: make(map[string]*vfs.FileInfo),
|
||||
capacity: capacity,
|
||||
mu: sync.RWMutex{},
|
||||
keyLocks: sync.Map{},
|
||||
LRU: newLruList(),
|
||||
accessCounts: make(map[string]int64),
|
||||
fileMeta: make(map[string]struct {
|
||||
AccessCount int64
|
||||
CTime int64
|
||||
}),
|
||||
}
|
||||
|
||||
os.MkdirAll(dfs.root, 0755)
|
||||
@@ -282,6 +294,15 @@ func (d *DiskFS) Create(key string, size int64) (io.WriteCloser, error) {
|
||||
diskWriteBytes.Add(float64(n))
|
||||
diskSizeBytes.Set(float64(d.Size()))
|
||||
|
||||
// On new file, set access count to 1
|
||||
finfo.AccessCount = 1
|
||||
finfo.CTime = time.Now()
|
||||
d.fileMeta[key] = struct {
|
||||
AccessCount int64
|
||||
CTime int64
|
||||
}{1, finfo.CTime.Unix()}
|
||||
flushFileMeta(d.root, d.fileMeta)
|
||||
|
||||
return nil
|
||||
},
|
||||
key: key,
|
||||
@@ -351,6 +372,10 @@ func (d *DiskFS) Delete(key string) error {
|
||||
|
||||
diskSizeBytes.Set(float64(d.Size()))
|
||||
|
||||
delete(d.accessCounts, key)
|
||||
delete(d.fileMeta, key)
|
||||
flushFileMeta(d.root, d.fileMeta)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -381,9 +406,17 @@ func (d *DiskFS) Open(key string) (io.ReadCloser, error) {
|
||||
return nil, vfserror.ErrNotFound
|
||||
}
|
||||
fi.ATime = time.Now()
|
||||
fi.AccessCount++ // Increment access count
|
||||
d.LRU.MoveToFront(key)
|
||||
d.mu.Unlock()
|
||||
|
||||
fi.AccessCount++
|
||||
d.fileMeta[key] = struct {
|
||||
AccessCount int64
|
||||
CTime int64
|
||||
}{fi.AccessCount, fi.CTime.Unix()}
|
||||
flushFileMeta(d.root, d.fileMeta)
|
||||
|
||||
path := filepath.Join(d.root, key)
|
||||
path = strings.ReplaceAll(path, "\\", "/") // Ensure forward slashes for consistency
|
||||
file, err := os.Open(path)
|
||||
@@ -461,3 +494,22 @@ func (d *DiskFS) StatAll() []*vfs.FileInfo {
|
||||
|
||||
return files
|
||||
}
|
||||
|
||||
func flushAccessCounts(root string, counts map[string]int64) {
|
||||
path := filepath.Join(root, "access_counts.json")
|
||||
data, _ := json.MarshalIndent(counts, "", " ")
|
||||
_ = ioutil.WriteFile(path, data, 0644)
|
||||
}
|
||||
|
||||
func flushFileMeta(root string, meta map[string]struct {
|
||||
AccessCount int64
|
||||
CTime int64
|
||||
}) {
|
||||
path := filepath.Join(root, "filemeta.json")
|
||||
if len(meta) == 0 {
|
||||
_ = os.Remove(path)
|
||||
return
|
||||
}
|
||||
data, _ := json.MarshalIndent(meta, "", " ")
|
||||
_ = ioutil.WriteFile(path, data, 0644)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user