X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/3da10f0c0f5a0c0c91d49436a5995c890b03d228..86ddb15b162a0c29b6caa4370e5cedf27bbdd69a:/services/datamanager/datamanager.go diff --git a/services/datamanager/datamanager.go b/services/datamanager/datamanager.go index a9306ce83a..c1a5cbed75 100644 --- a/services/datamanager/datamanager.go +++ b/services/datamanager/datamanager.go @@ -22,6 +22,7 @@ var ( logEventTypePrefix string logFrequencySeconds int minutesBetweenRuns int + dryRun bool ) func init() { @@ -36,21 +37,34 @@ func init() { flag.IntVar(&minutesBetweenRuns, "minutes-between-runs", 0, - "How many minutes we wait betwen data manager runs. 0 means run once and exit.") + "How many minutes we wait between data manager runs. 0 means run once and exit.") + flag.BoolVar(&dryRun, + "dry-run", + false, + "Perform a dry run. Log how many blocks would be deleted/moved, but do not issue any changes to keepstore.") } func main() { flag.Parse() + if minutesBetweenRuns == 0 { - err := singlerun(makeArvadosClient()) + arv, err := arvadosclient.MakeArvadosClient() + if err != nil { + loggerutil.FatalWithMessage(arvLogger, fmt.Sprintf("Error making arvados client: %v", err)) + } + err = singlerun(arv) if err != nil { - log.Fatalf("singlerun: %v", err) + loggerutil.FatalWithMessage(arvLogger, fmt.Sprintf("singlerun: %v", err)) } } else { waitTime := time.Minute * time.Duration(minutesBetweenRuns) for { log.Println("Beginning Run") - err := singlerun(makeArvadosClient()) + arv, err := arvadosclient.MakeArvadosClient() + if err != nil { + loggerutil.FatalWithMessage(arvLogger, fmt.Sprintf("Error making arvados client: %v", err)) + } + err = singlerun(arv) if err != nil { log.Printf("singlerun: %v", err) } @@ -60,13 +74,7 @@ func main() { } } -func makeArvadosClient() arvadosclient.ArvadosClient { - arv, err := arvadosclient.MakeArvadosClient() - if err != nil { - log.Fatalf("Error setting up arvados client: %s", err) - } - return arv -} +var arvLogger *logger.Logger func singlerun(arv arvadosclient.ArvadosClient) error { var err error @@ -76,9 +84,8 @@ func singlerun(arv arvadosclient.ArvadosClient) error { return errors.New("Current user is not an admin. Datamanager requires a privileged token.") } - var arvLogger *logger.Logger if logEventTypePrefix != "" { - arvLogger = logger.NewLogger(logger.LoggerParams{ + arvLogger, err = logger.NewLogger(logger.LoggerParams{ Client: arv, EventTypePrefix: logEventTypePrefix, WriteInterval: time.Second * time.Duration(logFrequencySeconds)}) @@ -103,7 +110,14 @@ func singlerun(arv arvadosclient.ArvadosClient) error { dataFetcher(arvLogger, &readCollections, &keepServerInfo) - summary.MaybeWriteData(arvLogger, readCollections, keepServerInfo) + if readCollections.Err != nil { + return readCollections.Err + } + + err = summary.MaybeWriteData(arvLogger, readCollections, keepServerInfo) + if err != nil { + return err + } buckets := summary.BucketReplication(readCollections, keepServerInfo) bucketCounts := buckets.Counts() @@ -126,8 +140,7 @@ func singlerun(arv arvadosclient.ArvadosClient) error { kc, err := keepclient.MakeKeepClient(&arv) if err != nil { - loggerutil.FatalWithMessage(arvLogger, - fmt.Sprintf("Error setting up keep client %s", err.Error())) + return fmt.Errorf("Error setting up keep client %v", err.Error()) } // Log that we're finished. We force the recording, since go will @@ -154,12 +167,15 @@ func singlerun(arv arvadosclient.ArvadosClient) error { &keepServerInfo, replicationSummary.KeepBlocksNotInCollections) - summary.WritePullLists(arvLogger, pullLists) + err = summary.WritePullLists(arvLogger, pullLists, dryRun) + if err != nil { + return err + } if trashErr != nil { return err } - keep.SendTrashLists(kc, trashLists) + keep.SendTrashLists(arvLogger, kc, trashLists, dryRun) return nil } @@ -179,12 +195,17 @@ func BuildDataFetcher(arv arvadosclient.ArvadosClient) summary.DataFetcher { BatchSize: 50}) }() - *keepServerInfo = keep.GetKeepServersAndSummarize( + var err error + *keepServerInfo, err = keep.GetKeepServersAndSummarize( keep.GetKeepServersParams{ Client: arv, Logger: arvLogger, Limit: 1000}) + if err != nil { + return + } + *readCollections = <-collectionChannel } }