From 75752d554b6bf4016018b6c50e18c45c58eb1a2a Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 11 Feb 2022 16:23:48 +0100 Subject: [PATCH 1/7] cmd/hiveview: use package io/fs more --- cmd/hiveview/listing.go | 60 +++++++++++++++++++++++++---------------- cmd/hiveview/main.go | 16 ++++++----- 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/cmd/hiveview/listing.go b/cmd/hiveview/listing.go index b5721b15d2..2dbb91e56b 100644 --- a/cmd/hiveview/listing.go +++ b/cmd/hiveview/listing.go @@ -3,35 +3,46 @@ package main import ( "encoding/json" "io" - "io/ioutil" + "io/fs" "log" - "os" - "path/filepath" + "path" "sort" "strings" "time" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/hive/internal/libhive" ) const listLimit = 200 // number of runs reported // generateListing processes hive simulation output files and generates a listing file. -func generateListing(output io.Writer, logdir string) error { - logfiles, err := ioutil.ReadDir(logdir) +func generateListing(fsys fs.FS, dir string, output io.Writer) error { + logfiles, err := fs.ReadDir(fsys, dir) if err != nil { return err } - // The files are prefixed by timestamp, so to get the latest 200 items, - // we just need to read the listing in reverse until we have 200 + + // Sort by name. + sort.Slice(logfiles, func(i, j int) bool { + return logfiles[i].Name() < logfiles[j].Name() + }) + + // The files are prefixed by timestamp, so to get the latest 200 items, we just need + // to read the listing in reverse until we have 200. var entries []listingEntry for i := len(logfiles) - 1; i > 0; i-- { - finfo := logfiles[i] - if !strings.HasSuffix(finfo.Name(), ".json") || skipFile(finfo.Name()) { + name := logfiles[i].Name() + if !strings.HasSuffix(name, ".json") || skipFile(name) { + continue + } + file, err := fsys.Open(path.Join(dir, name)) + if err != nil { continue } - entry, err := convertSummaryFile(logdir, finfo) + + entry, err := convertSummaryFile(file) + file.Close() + if err != nil { continue } @@ -40,11 +51,10 @@ func generateListing(output io.Writer, logdir string) error { break } } - sort.Slice(entries, func(i, j int) bool { return entries[i].SimLog > entries[j].SimLog }) - if len(entries) > listLimit { - entries = entries[:listLimit] - } + sort.Slice(entries, func(i, j int) bool { + return entries[i].SimLog > entries[j].SimLog + }) enc := json.NewEncoder(output) for _, e := range entries { if err := enc.Encode(e); err != nil { @@ -71,18 +81,22 @@ type listingEntry struct { SimLog string `json:"simLog"` // simulator log file } -func convertSummaryFile(logdir string, file os.FileInfo) (listingEntry, error) { - info := new(libhive.TestSuite) - err := common.LoadJSON(filepath.Join(logdir, file.Name()), info) +func convertSummaryFile(file fs.File) (listingEntry, error) { + fileInfo, err := file.Stat() if err != nil { - log.Printf("Skipping invalid summary file: %v", err) + log.Printf("Can't access summary file: %s", err) + } + + var info libhive.TestSuite + if err := json.NewDecoder(file).Decode(&info); err != nil { + log.Printf("Skipping invalid summary file %s: %v", fileInfo.Name(), err) return listingEntry{}, err } - if !suiteValid(info) { - log.Printf("Skipping invalid summary file: %s", file.Name()) + if !suiteValid(&info) { + log.Printf("Skipping invalid summary file %s", fileInfo.Name()) return listingEntry{}, err } - return suiteToEntry(file, info), nil + return suiteToEntry(&info, fileInfo), nil } func suiteValid(s *libhive.TestSuite) bool { @@ -93,7 +107,7 @@ func skipFile(f string) bool { return f == "errorReport.json" || f == "containerErrorReport.json" || strings.HasPrefix(f, ".") } -func suiteToEntry(file os.FileInfo, s *libhive.TestSuite) listingEntry { +func suiteToEntry(s *libhive.TestSuite, file fs.FileInfo) listingEntry { e := listingEntry{ Name: s.Name, FileName: file.Name(), diff --git a/cmd/hiveview/main.go b/cmd/hiveview/main.go index 402fb58b10..1edf748f58 100644 --- a/cmd/hiveview/main.go +++ b/cmd/hiveview/main.go @@ -24,7 +24,7 @@ func main() { config serverConfig ) flag.StringVar(&config.listenAddr, "addr", "0.0.0.0:8080", "HTTP server listen address") - flag.StringVar(&config.logdir, "logdir", "workspace/logs", "Path to hive simulator log directory") + flag.StringVar(&config.logDir, "logdir", "workspace/logs", "Path to hive simulator log directory") flag.StringVar(&config.assetsDir, "assets", "", "Path to static files directory. Serves baked-in assets when not set.") flag.Parse() @@ -33,7 +33,8 @@ func main() { case *serve: runServer(config) case *listing: - generateListing(os.Stdout, config.logdir) + fsys := os.DirFS(config.logDir) + generateListing(fsys, ".", os.Stdout) default: log.Fatalf("Use -serve or -listing to select mode") } @@ -41,7 +42,7 @@ func main() { type serverConfig struct { listenAddr string - logdir string + logDir string assetsDir string } @@ -61,8 +62,9 @@ func runServer(config serverConfig) { } // Create handlers. - logHandler := http.FileServer(http.Dir(config.logdir)) - listingHandler := serveListing{dir: config.logdir} + logDirFS := os.DirFS(config.logDir) + logHandler := http.FileServer(http.FS(logDirFS)) + listingHandler := serveListing{fsys: logDirFS} mux := mux.NewRouter() mux.Handle("/listing.jsonl", listingHandler).Methods("GET") mux.PathPrefix("/results").Handler(http.StripPrefix("/results/", logHandler)) @@ -77,11 +79,11 @@ func runServer(config serverConfig) { http.Serve(l, mux) } -type serveListing struct{ dir string } +type serveListing struct{ fsys fs.FS } func (h serveListing) ServeHTTP(w http.ResponseWriter, r *http.Request) { log.Printf("Generating listing...") - err := generateListing(w, h.dir) + err := generateListing(h.fsys, ".", w) if err != nil { w.WriteHeader(http.StatusInternalServerError) } From f870c137eba4b735f37d6e06e25f056af6970390 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 8 Jun 2022 13:01:59 +0000 Subject: [PATCH 2/7] cmd/hiveview: implement log GC function --- cmd/hiveview/gc.go | 64 +++++++++++++++++++ cmd/hiveview/listing.go | 132 +++++++++++++++++++++++----------------- cmd/hiveview/main.go | 73 ++++------------------ cmd/hiveview/serve.go | 64 +++++++++++++++++++ 4 files changed, 217 insertions(+), 116 deletions(-) create mode 100644 cmd/hiveview/gc.go create mode 100644 cmd/hiveview/serve.go diff --git a/cmd/hiveview/gc.go b/cmd/hiveview/gc.go new file mode 100644 index 0000000000..88250850de --- /dev/null +++ b/cmd/hiveview/gc.go @@ -0,0 +1,64 @@ +package main + +import ( + "fmt" + "io/fs" + "os" + "path/filepath" + "time" + + "github.com/ethereum/hive/internal/libhive" +) + +func logdirGC(dir string, cutoff time.Time) error { + var ( + fsys = os.DirFS(dir) + usedFiles = make(map[string]struct{}) + ) + + // Walk all suite files and pouplate the usedFiles set. + err := walkSummaryFiles(fsys, ".", func(suite *libhive.TestSuite, fi fs.FileInfo) error { + if suiteStart(suite).Before(cutoff) { + return nil // skip + } + // Add suite file itself. + usedFiles[fi.Name()] = struct{}{} + usedFiles[suite.SimulatorLog] = struct{}{} + // Add log files. + for _, test := range suite.TestCases { + for _, client := range test.ClientInfo { + usedFiles[client.LogFile] = struct{}{} + } + } + return nil + }) + if err != nil { + return err + } + + // Delete all files which aren't in usedFiles. + return fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return nil // Ignore scan errors. + } + if d.IsDir() { + return nil // Don't delete directories. + } + if _, used := usedFiles[path]; !used { + path := filepath.Join(dir, filepath.FromSlash(path)) + fmt.Println("rm", path) + err := os.Remove(path) + if err != nil { + fmt.Println("error:", err) + } + } + return nil + }) +} + +func suiteStart(suite *libhive.TestSuite) time.Time { + for _, test := range suite.TestCases { + return test.Start + } + return time.Time{} +} diff --git a/cmd/hiveview/listing.go b/cmd/hiveview/listing.go index 2dbb91e56b..ed96d7c5d3 100644 --- a/cmd/hiveview/listing.go +++ b/cmd/hiveview/listing.go @@ -2,6 +2,7 @@ package main import ( "encoding/json" + "errors" "io" "io/fs" "log" @@ -17,41 +18,25 @@ const listLimit = 200 // number of runs reported // generateListing processes hive simulation output files and generates a listing file. func generateListing(fsys fs.FS, dir string, output io.Writer) error { - logfiles, err := fs.ReadDir(fsys, dir) - if err != nil { - return err - } - - // Sort by name. - sort.Slice(logfiles, func(i, j int) bool { - return logfiles[i].Name() < logfiles[j].Name() - }) - - // The files are prefixed by timestamp, so to get the latest 200 items, we just need - // to read the listing in reverse until we have 200. - var entries []listingEntry - for i := len(logfiles) - 1; i > 0; i-- { - name := logfiles[i].Name() - if !strings.HasSuffix(name, ".json") || skipFile(name) { - continue - } - file, err := fsys.Open(path.Join(dir, name)) - if err != nil { - continue - } - - entry, err := convertSummaryFile(file) - file.Close() - - if err != nil { - continue - } + var ( + stop = errors.New("stop") + entries []listingEntry + ) + // The files are walked in name order high->low. So to get the latest 200 items, we + // just need to keep going until we have 200. + err := walkSummaryFiles(fsys, dir, func(suite *libhive.TestSuite, fi fs.FileInfo) error { + entry := suiteToEntry(suite, fi) entries = append(entries, entry) if len(entries) >= listLimit { - break + return stop } + return nil + }) + if err != nil && err != stop { + return err } + // Write listing JSON lines to output. sort.Slice(entries, func(i, j int) bool { return entries[i].SimLog > entries[j].SimLog }) @@ -81,32 +66,6 @@ type listingEntry struct { SimLog string `json:"simLog"` // simulator log file } -func convertSummaryFile(file fs.File) (listingEntry, error) { - fileInfo, err := file.Stat() - if err != nil { - log.Printf("Can't access summary file: %s", err) - } - - var info libhive.TestSuite - if err := json.NewDecoder(file).Decode(&info); err != nil { - log.Printf("Skipping invalid summary file %s: %v", fileInfo.Name(), err) - return listingEntry{}, err - } - if !suiteValid(&info) { - log.Printf("Skipping invalid summary file %s", fileInfo.Name()) - return listingEntry{}, err - } - return suiteToEntry(&info, fileInfo), nil -} - -func suiteValid(s *libhive.TestSuite) bool { - return s.SimulatorLog != "" -} - -func skipFile(f string) bool { - return f == "errorReport.json" || f == "containerErrorReport.json" || strings.HasPrefix(f, ".") -} - func suiteToEntry(s *libhive.TestSuite, file fs.FileInfo) listingEntry { e := listingEntry{ Name: s.Name, @@ -142,3 +101,64 @@ func contains(list []string, s string) bool { } return false } + +type suiteCB func(*libhive.TestSuite, fs.FileInfo) error + +func walkSummaryFiles(fsys fs.FS, dir string, proc suiteCB) error { + logfiles, err := fs.ReadDir(fsys, dir) + if err != nil { + return err + } + // Sort by name newest-first. + sort.Slice(logfiles, func(i, j int) bool { + return logfiles[i].Name() > logfiles[j].Name() + }) + + for _, entry := range logfiles { + name := entry.Name() + if entry.IsDir() || !strings.HasSuffix(name, ".json") || skipFile(name) { + continue + } + suite, fileInfo := parseSuite(fsys, path.Join(dir, name)) + if suite != nil { + if err := proc(suite, fileInfo); err != nil { + return err + } + } + } + return nil +} + +func parseSuite(fsys fs.FS, path string) (*libhive.TestSuite, fs.FileInfo) { + file, err := fsys.Open(path) + if err != nil { + log.Printf("Can't access summary file: %s", err) + return nil, nil + } + defer file.Close() + + fileInfo, err := file.Stat() + if err != nil { + log.Printf("Can't access summary file: %s", err) + return nil, nil + } + + var info libhive.TestSuite + if err := json.NewDecoder(file).Decode(&info); err != nil { + log.Printf("Skipping invalid summary file %s: %v", fileInfo.Name(), err) + return nil, nil + } + if !suiteValid(&info) { + log.Printf("Skipping invalid summary file %s", fileInfo.Name()) + return nil, nil + } + return &info, fileInfo +} + +func suiteValid(s *libhive.TestSuite) bool { + return s.SimulatorLog != "" +} + +func skipFile(f string) bool { + return f == "errorReport.json" || f == "containerErrorReport.json" || strings.HasPrefix(f, ".") +} diff --git a/cmd/hiveview/main.go b/cmd/hiveview/main.go index 1edf748f58..54c166ebbb 100644 --- a/cmd/hiveview/main.go +++ b/cmd/hiveview/main.go @@ -3,25 +3,24 @@ package main import ( - "embed" "flag" - "io/fs" "log" - "net" - "net/http" "os" - - "github.com/gorilla/mux" + "time" ) -//go:embed assets -var embeddedAssets embed.FS +const ( + durationDays = 24 * time.Hour + durationMonth = 31 * durationDays +) func main() { var ( - serve = flag.Bool("serve", false, "Enables the HTTP server") - listing = flag.Bool("listing", false, "Generates listing JSON to stdout") - config serverConfig + serve = flag.Bool("serve", false, "Enables the HTTP server") + listing = flag.Bool("listing", false, "Generates listing JSON to stdout") + gc = flag.Bool("gc", false, "Deletes old log files") + gcKeepInterval = flag.Duration("keep", 5*durationMonth, "Time interval of past log files to keep") + config serverConfig ) flag.StringVar(&config.listenAddr, "addr", "0.0.0.0:8080", "HTTP server listen address") flag.StringVar(&config.logDir, "logdir", "workspace/logs", "Path to hive simulator log directory") @@ -35,56 +34,10 @@ func main() { case *listing: fsys := os.DirFS(config.logDir) generateListing(fsys, ".", os.Stdout) + case *gc: + cutoff := time.Now().Add(-*gcKeepInterval) + logdirGC(config.logDir, cutoff) default: log.Fatalf("Use -serve or -listing to select mode") } } - -type serverConfig struct { - listenAddr string - logDir string - assetsDir string -} - -func runServer(config serverConfig) { - var assetFS fs.FS - if config.assetsDir != "" { - if stat, _ := os.Stat(config.assetsDir); stat == nil || !stat.IsDir() { - log.Fatalf("-assets: %q is not a directory", config.assetsDir) - } - assetFS = os.DirFS(config.assetsDir) - } else { - sub, err := fs.Sub(embeddedAssets, "assets") - if err != nil { - panic(err) - } - assetFS = sub - } - - // Create handlers. - logDirFS := os.DirFS(config.logDir) - logHandler := http.FileServer(http.FS(logDirFS)) - listingHandler := serveListing{fsys: logDirFS} - mux := mux.NewRouter() - mux.Handle("/listing.jsonl", listingHandler).Methods("GET") - mux.PathPrefix("/results").Handler(http.StripPrefix("/results/", logHandler)) - mux.PathPrefix("/").Handler(http.FileServer(http.FS(assetFS))) - - // Start the server. - l, err := net.Listen("tcp", config.listenAddr) - if err != nil { - log.Fatalf("Can't listen: %v", err) - } - log.Printf("Serving at http://%v/", l.Addr()) - http.Serve(l, mux) -} - -type serveListing struct{ fsys fs.FS } - -func (h serveListing) ServeHTTP(w http.ResponseWriter, r *http.Request) { - log.Printf("Generating listing...") - err := generateListing(h.fsys, ".", w) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - } -} diff --git a/cmd/hiveview/serve.go b/cmd/hiveview/serve.go new file mode 100644 index 0000000000..e6674961f6 --- /dev/null +++ b/cmd/hiveview/serve.go @@ -0,0 +1,64 @@ +package main + +import ( + "embed" + "io/fs" + "log" + "net" + "net/http" + "os" + + "github.com/gorilla/mux" +) + +//go:embed assets +var embeddedAssets embed.FS + +type serverConfig struct { + listenAddr string + logDir string + assetsDir string +} + +func runServer(config serverConfig) { + var assetFS fs.FS + if config.assetsDir != "" { + if stat, _ := os.Stat(config.assetsDir); stat == nil || !stat.IsDir() { + log.Fatalf("-assets: %q is not a directory", config.assetsDir) + } + assetFS = os.DirFS(config.assetsDir) + } else { + sub, err := fs.Sub(embeddedAssets, "assets") + if err != nil { + panic(err) + } + assetFS = sub + } + + // Create handlers. + logDirFS := os.DirFS(config.logDir) + logHandler := http.FileServer(http.FS(logDirFS)) + listingHandler := serveListing{fsys: logDirFS} + mux := mux.NewRouter() + mux.Handle("/listing.jsonl", listingHandler).Methods("GET") + mux.PathPrefix("/results").Handler(http.StripPrefix("/results/", logHandler)) + mux.PathPrefix("/").Handler(http.FileServer(http.FS(assetFS))) + + // Start the server. + l, err := net.Listen("tcp", config.listenAddr) + if err != nil { + log.Fatalf("Can't listen: %v", err) + } + log.Printf("Serving at http://%v/", l.Addr()) + http.Serve(l, mux) +} + +type serveListing struct{ fsys fs.FS } + +func (h serveListing) ServeHTTP(w http.ResponseWriter, r *http.Request) { + log.Printf("Generating listing...") + err := generateListing(h.fsys, ".", w) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + } +} From 961d98fcfad3f4b3e4ec2f3feb47c94734c34893 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 8 Jun 2022 13:12:26 +0000 Subject: [PATCH 3/7] cmd/hiveview: add -keep-min --- cmd/hiveview/gc.go | 17 ++++++++++------- cmd/hiveview/main.go | 5 +++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/cmd/hiveview/gc.go b/cmd/hiveview/gc.go index 88250850de..902217566b 100644 --- a/cmd/hiveview/gc.go +++ b/cmd/hiveview/gc.go @@ -10,21 +10,24 @@ import ( "github.com/ethereum/hive/internal/libhive" ) -func logdirGC(dir string, cutoff time.Time) error { +func logdirGC(dir string, cutoff time.Time, keepMin int) error { var ( - fsys = os.DirFS(dir) - usedFiles = make(map[string]struct{}) + fsys = os.DirFS(dir) + usedFiles = make(map[string]struct{}) + keptSuites = 0 ) // Walk all suite files and pouplate the usedFiles set. err := walkSummaryFiles(fsys, ".", func(suite *libhive.TestSuite, fi fs.FileInfo) error { - if suiteStart(suite).Before(cutoff) { - return nil // skip + // Skip when too old and when above the minimum. + // Note we rely on getting called in descending time order here. + if suiteStart(suite).Before(cutoff) && keptSuites >= keepMin { + return nil } - // Add suite file itself. + // Add suite files and client logs. + keptSuites++ usedFiles[fi.Name()] = struct{}{} usedFiles[suite.SimulatorLog] = struct{}{} - // Add log files. for _, test := range suite.TestCases { for _, client := range test.ClientInfo { usedFiles[client.LogFile] = struct{}{} diff --git a/cmd/hiveview/main.go b/cmd/hiveview/main.go index 54c166ebbb..66a33e6237 100644 --- a/cmd/hiveview/main.go +++ b/cmd/hiveview/main.go @@ -19,7 +19,8 @@ func main() { serve = flag.Bool("serve", false, "Enables the HTTP server") listing = flag.Bool("listing", false, "Generates listing JSON to stdout") gc = flag.Bool("gc", false, "Deletes old log files") - gcKeepInterval = flag.Duration("keep", 5*durationMonth, "Time interval of past log files to keep") + gcKeepInterval = flag.Duration("keep", 5*durationMonth, "Time interval of past log files to keep (for -gc)") + gcKeepMin = flag.Int("keep-min", 10, "Minmum number of suite outputs to keep (for -gc)") config serverConfig ) flag.StringVar(&config.listenAddr, "addr", "0.0.0.0:8080", "HTTP server listen address") @@ -36,7 +37,7 @@ func main() { generateListing(fsys, ".", os.Stdout) case *gc: cutoff := time.Now().Add(-*gcKeepInterval) - logdirGC(config.logDir, cutoff) + logdirGC(config.logDir, cutoff, *gcKeepMin) default: log.Fatalf("Use -serve or -listing to select mode") } From 698f39032c7555a562c30ca9ea498962b8a63d76 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 8 Jun 2022 13:29:48 +0000 Subject: [PATCH 4/7] cmd/hiveview: rename --- cmd/hiveview/gc.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/hiveview/gc.go b/cmd/hiveview/gc.go index 902217566b..204056a229 100644 --- a/cmd/hiveview/gc.go +++ b/cmd/hiveview/gc.go @@ -48,9 +48,9 @@ func logdirGC(dir string, cutoff time.Time, keepMin int) error { return nil // Don't delete directories. } if _, used := usedFiles[path]; !used { - path := filepath.Join(dir, filepath.FromSlash(path)) - fmt.Println("rm", path) - err := os.Remove(path) + file := filepath.Join(dir, filepath.FromSlash(path)) + fmt.Println("rm", file) + err := os.Remove(file) if err != nil { fmt.Println("error:", err) } From 6efa491f8230f4de1a3450cd154f1d0fcfd4ca37 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 16 Jun 2022 23:12:55 +0200 Subject: [PATCH 5/7] cmd/hiveview: debug output --- cmd/hiveview/gc.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/cmd/hiveview/gc.go b/cmd/hiveview/gc.go index 204056a229..5881143a99 100644 --- a/cmd/hiveview/gc.go +++ b/cmd/hiveview/gc.go @@ -5,6 +5,7 @@ import ( "io/fs" "os" "path/filepath" + "sort" "time" "github.com/ethereum/hive/internal/libhive" @@ -15,6 +16,7 @@ func logdirGC(dir string, cutoff time.Time, keepMin int) error { fsys = os.DirFS(dir) usedFiles = make(map[string]struct{}) keptSuites = 0 + oldest time.Time ) // Walk all suite files and pouplate the usedFiles set. @@ -24,6 +26,10 @@ func logdirGC(dir string, cutoff time.Time, keepMin int) error { if suiteStart(suite).Before(cutoff) && keptSuites >= keepMin { return nil } + if oldest.IsZero() || suiteStart(suite).Before(oldest) { + oldest = suiteStart(suite) + } + // Add suite files and client logs. keptSuites++ usedFiles[fi.Name()] = struct{}{} @@ -39,6 +45,19 @@ func logdirGC(dir string, cutoff time.Time, keepMin int) error { return err } + fmt.Println("keptSuites:", keptSuites) + fmt.Println("oldest:", oldest) + + var fileList []string + for f := range usedFiles { + fileList = append(fileList, f) + } + sort.Strings(fileList) + for _, f := range fileList { + fmt.Println(f) + } + return nil + // Delete all files which aren't in usedFiles. return fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error { if err != nil { @@ -49,7 +68,7 @@ func logdirGC(dir string, cutoff time.Time, keepMin int) error { } if _, used := usedFiles[path]; !used { file := filepath.Join(dir, filepath.FromSlash(path)) - fmt.Println("rm", file) + // fmt.Println("rm", file) err := os.Remove(file) if err != nil { fmt.Println("error:", err) From 0dea776f73abbdca84d5120164f7e43fca71ff84 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 16 Jun 2022 23:58:11 +0200 Subject: [PATCH 6/7] cmd/hiveview: remove file list printing --- cmd/hiveview/gc.go | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/cmd/hiveview/gc.go b/cmd/hiveview/gc.go index 5881143a99..5b9c9673f9 100644 --- a/cmd/hiveview/gc.go +++ b/cmd/hiveview/gc.go @@ -5,7 +5,6 @@ import ( "io/fs" "os" "path/filepath" - "sort" "time" "github.com/ethereum/hive/internal/libhive" @@ -45,18 +44,8 @@ func logdirGC(dir string, cutoff time.Time, keepMin int) error { return err } - fmt.Println("keptSuites:", keptSuites) - fmt.Println("oldest:", oldest) - - var fileList []string - for f := range usedFiles { - fileList = append(fileList, f) - } - sort.Strings(fileList) - for _, f := range fileList { - fmt.Println(f) - } - return nil + fmt.Printf("keeping %d suites (%d files)\n", keptSuites, len(usedFiles)) + fmt.Printf("oldest suite date:", oldest) // Delete all files which aren't in usedFiles. return fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error { From f95f630c771da54a0914a95456f07be268cb7abf Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Fri, 17 Jun 2022 00:06:29 +0200 Subject: [PATCH 7/7] cmd/hiveview: fix log line --- cmd/hiveview/gc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/hiveview/gc.go b/cmd/hiveview/gc.go index 5b9c9673f9..74bdc3096e 100644 --- a/cmd/hiveview/gc.go +++ b/cmd/hiveview/gc.go @@ -45,7 +45,7 @@ func logdirGC(dir string, cutoff time.Time, keepMin int) error { } fmt.Printf("keeping %d suites (%d files)\n", keptSuites, len(usedFiles)) - fmt.Printf("oldest suite date:", oldest) + fmt.Println("oldest suite date:", oldest) // Delete all files which aren't in usedFiles. return fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error {