From 0d252d04567afcd01684fbc3d88e795f4332a9d3 Mon Sep 17 00:00:00 2001 From: Seednode Date: Fri, 15 Sep 2023 13:51:04 -0500 Subject: [PATCH] Remove atomic int usage and some mutexes, replace with channels --- cmd/cache.go | 29 +++++---- cmd/files.go | 165 +++++++++++++++++++++++++++++++-------------------- cmd/root.go | 10 ++-- default.pgo | Bin 17423 -> 27706 bytes 4 files changed, 124 insertions(+), 80 deletions(-) diff --git a/cmd/cache.go b/cmd/cache.go index 2e412d8..6525359 100644 --- a/cmd/cache.go +++ b/cmd/cache.go @@ -6,6 +6,7 @@ package cmd import ( "encoding/gob" + "fmt" "net/http" "os" "sync" @@ -64,14 +65,6 @@ func (cache *fileCache) set(val []string) { cache.list = make([]string, length) copy(cache.list, val) cache.mutex.Unlock() -} - -func (cache *fileCache) generate(args []string, formats *types.Types) { - cache.mutex.Lock() - cache.list = []string{} - cache.mutex.Unlock() - - fileList(args, &filters{}, "", cache, formats) if Cache && CacheFile != "" { cache.Export(CacheFile) @@ -138,7 +131,14 @@ func (cache *fileCache) Import(path string) error { func serveCacheClear(args []string, cache *fileCache, formats *types.Types) httprouter.Handle { return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { - cache.generate(args, formats) + list, err := fileList(args, &filters{}, "", &fileCache{}, formats) + if err != nil { + fmt.Println(err) + + return + } + + cache.set(list) w.Header().Set("Content-Type", "text/plain") @@ -146,7 +146,7 @@ func serveCacheClear(args []string, cache *fileCache, formats *types.Types) http } } -func registerCacheHandlers(mux *httprouter.Router, args []string, cache *fileCache, formats *types.Types) { +func registerCacheHandlers(mux *httprouter.Router, args []string, cache *fileCache, formats *types.Types) error { skipIndex := false if CacheFile != "" { @@ -157,8 +157,15 @@ func registerCacheHandlers(mux *httprouter.Router, args []string, cache *fileCac } if !skipIndex { - cache.generate(args, formats) + list, err := fileList(args, &filters{}, "", &fileCache{}, formats) + if err != nil { + return err + } + + cache.set(list) } register(mux, Prefix+"/clear_cache", serveCacheClear(args, cache, formats)) + + return nil } diff --git a/cmd/files.go b/cmd/files.go index ade8b73..a0ea19b 100644 --- a/cmd/files.go +++ b/cmd/files.go @@ -17,7 +17,6 @@ import ( "strconv" "strings" "sync" - "sync/atomic" "time" "seedno.de/seednode/roulette/types" @@ -41,22 +40,11 @@ type concurrency struct { fileScans chan int } -type files struct { - mutex sync.RWMutex - list []string -} - -func (f *files) append(path string) { - f.mutex.Lock() - f.list = append(f.list, path) - f.mutex.Unlock() -} - type scanStats struct { - filesMatched atomic.Uint32 - filesSkipped atomic.Uint32 - directoriesMatched atomic.Uint32 - directoriesSkipped atomic.Uint32 + filesMatched int + filesSkipped int + directoriesMatched int + directoriesSkipped int } type splitPath struct { @@ -102,7 +90,7 @@ func preparePath(path string) string { func newFile(paths []string, filters *filters, sortOrder string, regexes *regexes, cache *fileCache, formats *types.Types) (string, error) { path, err := pickFile(paths, filters, sortOrder, cache, formats) if err != nil { - return "", nil + return "", err } splitPath, err := split(path, regexes) @@ -274,9 +262,9 @@ func pathHasSupportedFiles(path string, formats *types.Types) (bool, error) { } } -func pathCount(path string) (uint32, uint32, error) { - var directories uint32 = 0 - var files uint32 = 0 +func pathCount(path string) (int, int, error) { + var directories = 0 + var files = 0 nodes, err := os.ReadDir(path) if err != nil { @@ -294,9 +282,16 @@ func pathCount(path string) (uint32, uint32, error) { return files, directories, nil } -func scanPath(path string, files *files, stats *scanStats, concurrency *concurrency, formats *types.Types) error { +func scanPath(path string, fileChannel chan<- string, statChannel chan<- *scanStats, errorChannel chan<- error, concurrency *concurrency, formats *types.Types) { var wg sync.WaitGroup + stats := &scanStats{ + filesMatched: 0, + filesSkipped: 0, + directoriesMatched: 0, + directoriesSkipped: 0, + } + err := filepath.WalkDir(path, func(p string, info os.DirEntry, err error) error { if err != nil { return err @@ -318,34 +313,34 @@ func scanPath(path string, files *files, stats *scanStats, concurrency *concurre path, err := normalizePath(p) if err != nil { - fmt.Println(err) + errorChannel <- err } if !formats.Validate(path) { - stats.filesSkipped.Add(1) + stats.filesSkipped = stats.filesSkipped + 1 return } - files.append(path) + fileChannel <- path - stats.filesMatched.Add(1) + stats.filesMatched = stats.filesMatched + 1 }() case info.IsDir(): files, directories, err := pathCount(p) if err != nil { - fmt.Println(err) + errorChannel <- err } if files > 0 && (files < MinimumFileCount) || (files > MaximumFileCount) { // This count will not otherwise include the parent directory itself, so increment by one - stats.directoriesSkipped.Add(directories + 1) - stats.filesSkipped.Add(files) + stats.directoriesSkipped = stats.directoriesSkipped + directories + 1 + stats.filesSkipped = stats.filesSkipped + files return filepath.SkipDir } - stats.directoriesMatched.Add(1) + stats.directoriesMatched = stats.directoriesMatched + 1 } return err @@ -353,24 +348,26 @@ func scanPath(path string, files *files, stats *scanStats, concurrency *concurre wg.Wait() - if err != nil { - return err - } + statChannel <- stats - return nil + if err != nil { + errorChannel <- err + } } -func scanPaths(paths []string, sort string, cache *fileCache, formats *types.Types) []string { - files := &files{ - mutex: sync.RWMutex{}, - list: []string{}, - } +func scanPaths(paths []string, sort string, cache *fileCache, formats *types.Types) ([]string, error) { + var list []string + + fileChannel := make(chan string) + statChannel := make(chan *scanStats) + errorChannel := make(chan error) + done := make(chan bool, 1) stats := &scanStats{ - filesMatched: atomic.Uint32{}, - filesSkipped: atomic.Uint32{}, - directoriesMatched: atomic.Uint32{}, - directoriesSkipped: atomic.Uint32{}, + filesMatched: 0, + filesSkipped: 0, + directoriesMatched: 0, + directoriesSkipped: 0, } concurrency := &concurrency{ @@ -393,55 +390,95 @@ func scanPaths(paths []string, sort string, cache *fileCache, formats *types.Typ wg.Done() }() - err := scanPath(paths[i], files, stats, concurrency, formats) - if err != nil { - fmt.Println(err) - } + scanPath(paths[i], fileChannel, statChannel, errorChannel, concurrency, formats) }(i) } - wg.Wait() + go func() { + wg.Wait() + done <- true + }() - if stats.filesMatched.Load() < 1 { +Poll: + for { + select { + case p := <-fileChannel: + list = append(list, p) + case s := <-statChannel: + stats.filesMatched = stats.filesMatched + s.filesMatched + stats.filesSkipped = stats.filesSkipped + s.filesSkipped + stats.directoriesMatched = stats.directoriesMatched + s.directoriesMatched + stats.directoriesSkipped = stats.directoriesSkipped + s.directoriesSkipped + case e := <-errorChannel: + return []string{}, e + case <-done: + break Poll + } + } + + if stats.filesMatched < 1 { fmt.Println("No files matched") - return []string{} + return []string{}, nil } if Verbose { fmt.Printf("%s | Indexed %d/%d files across %d/%d directories in %s\n", time.Now().Format(logDate), - stats.filesMatched.Load(), - stats.filesMatched.Load()+stats.filesSkipped.Load(), - stats.directoriesMatched.Load(), - stats.directoriesMatched.Load()+stats.directoriesSkipped.Load(), + stats.filesMatched, + stats.filesMatched+stats.filesSkipped, + stats.directoriesMatched, + stats.directoriesMatched+stats.directoriesSkipped, time.Since(startTime), ) } - return files.list + return list, nil } -func fileList(paths []string, filters *filters, sort string, cache *fileCache, formats *types.Types) []string { +func fileList(paths []string, filters *filters, sort string, cache *fileCache, formats *types.Types) ([]string, error) { switch { case Cache && !cache.isEmpty() && filters.isEmpty(): - return cache.List() + return cache.List(), nil case Cache && !cache.isEmpty() && !filters.isEmpty(): - return filters.apply(cache.List()) + return filters.apply(cache.List()), nil case Cache && cache.isEmpty() && !filters.isEmpty(): - cache.set(scanPaths(paths, sort, cache, formats)) - return filters.apply(cache.List()) + list, err := scanPaths(paths, sort, cache, formats) + if err != nil { + return []string{}, err + } + cache.set(list) + + return filters.apply(cache.List()), nil case Cache && cache.isEmpty() && filters.isEmpty(): - cache.set(scanPaths(paths, sort, cache, formats)) - return cache.List() + list, err := scanPaths(paths, sort, cache, formats) + if err != nil { + return []string{}, err + } + cache.set(list) + + return cache.List(), nil case !Cache && !filters.isEmpty(): - return filters.apply(scanPaths(paths, sort, cache, formats)) + list, err := scanPaths(paths, sort, cache, formats) + if err != nil { + return []string{}, err + } + + return filters.apply(list), nil default: - return scanPaths(paths, sort, cache, formats) + list, err := scanPaths(paths, sort, cache, formats) + if err != nil { + return []string{}, err + } + + return list, nil } } func pickFile(args []string, filters *filters, sort string, cache *fileCache, formats *types.Types) (string, error) { - list := fileList(args, filters, sort, cache, formats) + list, err := fileList(args, filters, sort, cache, formats) + if err != nil { + return "", err + } fileCount := len(list) diff --git a/cmd/root.go b/cmd/root.go index 53e32b5..3352797 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -11,7 +11,7 @@ import ( ) const ( - ReleaseVersion string = "0.87.0" + ReleaseVersion string = "0.88.0" ) var ( @@ -27,8 +27,8 @@ var ( Handlers bool Images bool Info bool - MaximumFileCount uint32 - MinimumFileCount uint32 + MaximumFileCount int + MinimumFileCount int PageLength uint32 Port uint16 Prefix string @@ -77,8 +77,8 @@ func init() { rootCmd.Flags().BoolVar(&Handlers, "handlers", false, "display registered handlers (for debugging)") rootCmd.Flags().BoolVar(&Images, "images", false, "enable support for image files") rootCmd.Flags().BoolVarP(&Info, "info", "i", false, "expose informational endpoints") - rootCmd.Flags().Uint32Var(&MaximumFileCount, "maximum-files", 1<<32-1, "skip directories with file counts above this value") - rootCmd.Flags().Uint32Var(&MinimumFileCount, "minimum-files", 1, "skip directories with file counts below this value") + rootCmd.Flags().IntVar(&MaximumFileCount, "maximum-files", 1<<32-1, "skip directories with file counts above this value") + rootCmd.Flags().IntVar(&MinimumFileCount, "minimum-files", 1, "skip directories with file counts below this value") rootCmd.Flags().Uint32Var(&PageLength, "page-length", 0, "pagination length for info pages") rootCmd.Flags().Uint16VarP(&Port, "port", "p", 8080, "port to listen on") rootCmd.Flags().StringVar(&Prefix, "prefix", "/", "root path for http handlers (for reverse proxying)") diff --git a/default.pgo b/default.pgo index 6e958697bfef0f17f45b083ae35a33d9be0db1a0..2d0ebf5a94434cd9a1321541ce1206b539ac53f6 100644 GIT binary patch literal 27706 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