add romCache file
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Steven Polley 2023-06-24 13:36:23 -06:00
parent d17f7c50d8
commit 3c5c99e340

44
main.go
View File

@ -31,14 +31,15 @@ type HTTPResponseJSON struct {
// Caches data about available ROMs in memory so we don't need to reference the filesystem for each request // Caches data about available ROMs in memory so we don't need to reference the filesystem for each request
type ROMCache struct { type ROMCache struct {
ROMs []LineageOSROM ROMs []LineageOSROM `json:"roms"`
Cached map[string]bool // to quickly lookup if a file is already cached Cached map[string]bool `json:"-"` // to quickly lookup if a file is already cached
sync.Mutex // We have multiple goroutines that may be accessing this data simultaneously, so we much lock / unlock it to prevent race conditions sync.Mutex `json:"-"` // We have multiple goroutines that may be accessing this data simultaneously, so we much lock / unlock it to prevent race conditions
} }
const ( const (
romDirectory = "public" // directory where ROMs are available for download romDirectory = "public" // directory where ROMs are available for download
buildOutDirectory = "out" // directory from build system containing artifacts which we can move to romDirectory buildOutDirectory = "out" // directory from build system containing artifacts which we can move to romDirectory
cacheFile = "public/romcache.json"
) )
var ( // evil global variable var ( // evil global variable
@ -46,8 +47,25 @@ var ( // evil global variable
) )
func init() { func init() {
// intialize and load ROMCache from file - so we don't have to rehash all the big files again
romCache = ROMCache{} romCache = ROMCache{}
romCache.Cached = make(map[string]bool) romCache.Cached = make(map[string]bool)
romCacheJson, err := os.ReadFile(cacheFile)
if err != nil {
if err != os.ErrNotExist { // don't care if it doesn't exist, just skip it
log.Printf("failed to read romCache file : %v", err)
}
} else { // if opening the file's successful, then load the contents
err = json.Unmarshal(romCacheJson, &romCache)
if err != nil {
log.Printf("failed to unmarshal romCacheJson to romCache struct: %v", err)
}
}
for _, rom := range romCache.ROMs {
romCache.Cached[rom.ID] = true
log.Printf("loaded cached file: %s", rom.Filename)
}
// Check if any new build artifacts and preload the romCache // Check if any new build artifacts and preload the romCache
moveBuildArtifacts() moveBuildArtifacts()
@ -132,6 +150,26 @@ func updateROMCache() {
romCache.Unlock() romCache.Unlock()
}(files[i]) }(files[i])
} }
// save file to disk for next startup so we don't have to rehash all the files again
romCache.Lock()
romCacheJson, err := json.Marshal(romCache)
romCache.Unlock()
if err != nil {
log.Printf("failed to marshal romCache to json: %v", err)
return
}
err = os.WriteFile(cacheFile, romCacheJson, 0644)
if err != nil {
log.Printf("failed to write '%s' file: %v", cacheFile, err)
log.Printf("attempting to remove '%s' to ensure integrity during next program startup...", cacheFile)
err = os.Remove(cacheFile)
if err != nil {
log.Printf("failed to remove file '%s': %v", cacheFile, err)
}
return
}
} }
// returns true if new builds were moved // returns true if new builds were moved