X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/a56406d730f2a07dd442b9e99ef9dab7b7d81895..47a79960c81ea689445f2040b24cb76729afab06:/services/datamanager/summary/file.go diff --git a/services/datamanager/summary/file.go b/services/datamanager/summary/file.go index 3a853bca3e..6e463d7670 100644 --- a/services/datamanager/summary/file.go +++ b/services/datamanager/summary/file.go @@ -9,18 +9,29 @@ import ( "git.curoverse.com/arvados.git/sdk/go/logger" "git.curoverse.com/arvados.git/services/datamanager/collection" "git.curoverse.com/arvados.git/services/datamanager/keep" - "git.curoverse.com/arvados.git/services/datamanager/loggerutil" "log" "os" ) +// Used to locally cache data read from servers to reduce execution +// time when developing. Not for use in production. +type serializedData struct { + ReadCollections collection.ReadCollections + KeepServerInfo keep.ReadServers +} + var ( - writeDataTo string + WriteDataTo string readDataFrom string ) +// DataFetcher to fetch data from keep servers +type DataFetcher func(arvLogger *logger.Logger, + readCollections *collection.ReadCollections, + keepServerInfo *keep.ReadServers) error + func init() { - flag.StringVar(&writeDataTo, + flag.StringVar(&WriteDataTo, "write-data-to", "", "Write summary of data received to this file. Used for development only.") @@ -30,7 +41,7 @@ func init() { "Avoid network i/o and read summary data from this file instead. Used for development only.") } -// Writes data we've read to a file. +// MaybeWriteData writes data we've read to a file. // // This is useful for development, so that we don't need to read all // our data from the network every time we tweak something. @@ -39,67 +50,66 @@ func init() { // working with stale data. func MaybeWriteData(arvLogger *logger.Logger, readCollections collection.ReadCollections, - keepServerInfo keep.ReadServers) bool { - if writeDataTo == "" { - return false - } else { - summaryFile, err := os.Create(writeDataTo) - if err != nil { - loggerutil.FatalWithMessage(arvLogger, - fmt.Sprintf("Failed to open %s: %v", writeDataTo, err)) - } - defer summaryFile.Close() + keepServerInfo keep.ReadServers) error { + if WriteDataTo == "" { + return nil + } + summaryFile, err := os.Create(WriteDataTo) + if err != nil { + return err + } + defer summaryFile.Close() - enc := gob.NewEncoder(summaryFile) - data := serializedData{ - ReadCollections: readCollections, - KeepServerInfo: keepServerInfo} - err = enc.Encode(data) - if err != nil { - loggerutil.FatalWithMessage(arvLogger, - fmt.Sprintf("Failed to write summary data: %v", err)) - } - log.Printf("Wrote summary data to: %s", writeDataTo) - return true + enc := gob.NewEncoder(summaryFile) + data := serializedData{ + ReadCollections: readCollections, + KeepServerInfo: keepServerInfo} + err = enc.Encode(data) + if err != nil { + return err } + log.Printf("Wrote summary data to: %s", WriteDataTo) + return nil } -// Reads data that we've written to a file. +// ShouldReadData should not be used outside of development +func ShouldReadData() bool { + return readDataFrom != "" +} + +// ReadData reads data that we've written to a file. // // This is useful for development, so that we don't need to read all // our data from the network every time we tweak something. // // This should not be used outside of development, since you'll be // working with stale data. -func MaybeReadData(arvLogger *logger.Logger, +func ReadData(arvLogger *logger.Logger, readCollections *collection.ReadCollections, - keepServerInfo *keep.ReadServers) bool { + keepServerInfo *keep.ReadServers) error { if readDataFrom == "" { - return false - } else { - summaryFile, err := os.Open(readDataFrom) - if err != nil { - loggerutil.FatalWithMessage(arvLogger, - fmt.Sprintf("Failed to open %s: %v", readDataFrom, err)) - } - defer summaryFile.Close() + return fmt.Errorf("ReadData() called with empty filename.") + } + summaryFile, err := os.Open(readDataFrom) + if err != nil { + return err + } + defer summaryFile.Close() - dec := gob.NewDecoder(summaryFile) - data := serializedData{} - err = dec.Decode(&data) - if err != nil { - loggerutil.FatalWithMessage(arvLogger, - fmt.Sprintf("Failed to read summary data: %v", err)) - } + dec := gob.NewDecoder(summaryFile) + data := serializedData{} + err = dec.Decode(&data) + if err != nil { + return err + } - // re-summarize data, so that we can update our summarizing - // functions without needing to do all our network i/o - data.ReadCollections.Summarize() - keep.ComputeBlockReplicationCounts(&data.KeepServerInfo) + // re-summarize data, so that we can update our summarizing + // functions without needing to do all our network i/o + data.ReadCollections.Summarize(arvLogger) + data.KeepServerInfo.Summarize(arvLogger) - *readCollections = data.ReadCollections - *keepServerInfo = data.KeepServerInfo - log.Printf("Read summary data from: %s", readDataFrom) - return true - } + *readCollections = data.ReadCollections + *keepServerInfo = data.KeepServerInfo + log.Printf("Read summary data from: %s", readDataFrom) + return nil }