mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2025-05-11 02:15:48 +02:00
refactor(cache): simplify event handling in file watcher and improve directory change detection
This commit is contained in:
parent
a30f2c5657
commit
5f0e59d095
2 changed files with 43 additions and 27 deletions
2
internal/cache/cache.go
vendored
2
internal/cache/cache.go
vendored
|
@ -11,7 +11,7 @@ var cache *ristretto.Cache[string, any]
|
||||||
|
|
||||||
func Init() {
|
func Init() {
|
||||||
var err error
|
var err error
|
||||||
cache, err = ristretto.NewCache[string, any](&ristretto.Config[string, any]{
|
cache, err = ristretto.NewCache(&ristretto.Config[string, any]{
|
||||||
NumCounters: 1e7, // number of keys to track frequency of (10M).
|
NumCounters: 1e7, // number of keys to track frequency of (10M).
|
||||||
MaxCost: 1 << 30, // maximum cost of cache (1GB).
|
MaxCost: 1 << 30, // maximum cost of cache (1GB).
|
||||||
BufferItems: 64, // number of keys per Get buffer.
|
BufferItems: 64, // number of keys per Get buffer.
|
||||||
|
|
68
internal/cache/index.go
vendored
68
internal/cache/index.go
vendored
|
@ -228,35 +228,51 @@ func (s *Scanner) watchForChanges() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if this is a relevant event (create, write, rename, remove)
|
// Skip irrelevant events
|
||||||
if event.Has(fsnotify.Create) || event.Has(fsnotify.Write) ||
|
if !event.Has(fsnotify.Create) && !event.Has(fsnotify.Write) &&
|
||||||
event.Has(fsnotify.Rename) || event.Has(fsnotify.Remove) {
|
!event.Has(fsnotify.Rename) && !event.Has(fsnotify.Remove) {
|
||||||
// If it's a directory, add it to the watch list
|
continue
|
||||||
if event.Has(fsnotify.Create) {
|
}
|
||||||
fi, err := os.Stat(event.Name)
|
|
||||||
if err == nil && fi.IsDir() {
|
|
||||||
_ = s.watcher.Add(event.Name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Process file changes
|
// Add newly created directories to the watch list
|
||||||
if !event.Has(fsnotify.Remove) {
|
if event.Has(fsnotify.Create) {
|
||||||
logger.Debug("Config file changed:", event.Name)
|
if fi, err := os.Stat(event.Name); err == nil && fi.IsDir() {
|
||||||
// Give the system a moment to finish writing the file
|
_ = s.watcher.Add(event.Name)
|
||||||
time.Sleep(100 * time.Millisecond)
|
|
||||||
// Only scan the changed file instead of all configs
|
|
||||||
err := s.scanSingleFile(event.Name)
|
|
||||||
if err != nil {
|
|
||||||
logger.Error("Failed to scan changed file:", err)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// For removed files, we need a full rescan
|
|
||||||
err := s.ScanAllConfigs()
|
|
||||||
if err != nil {
|
|
||||||
logger.Error("Failed to rescan configs after file removal:", err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For remove events, perform a full scan
|
||||||
|
if event.Has(fsnotify.Remove) {
|
||||||
|
logger.Debug("Config item removed:", event.Name)
|
||||||
|
if err := s.ScanAllConfigs(); err != nil {
|
||||||
|
logger.Error("Failed to rescan configs after removal:", err)
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle non-remove events
|
||||||
|
fi, err := os.Stat(event.Name)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("Failed to stat changed path:", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if fi.IsDir() {
|
||||||
|
// Directory change, perform full scan
|
||||||
|
logger.Debug("Config directory changed:", event.Name)
|
||||||
|
if err := s.ScanAllConfigs(); err != nil {
|
||||||
|
logger.Error("Failed to rescan configs after directory change:", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// File change, scan only the single file
|
||||||
|
logger.Debug("Config file changed:", event.Name)
|
||||||
|
// Give the system a moment to finish writing the file
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
if err := s.scanSingleFile(event.Name); err != nil {
|
||||||
|
logger.Error("Failed to scan changed file:", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
case err, ok := <-s.watcher.Errors:
|
case err, ok := <-s.watcher.Errors:
|
||||||
if !ok {
|
if !ok {
|
||||||
return
|
return
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue