diff --git a/cmd/satellite/gc-bf.go b/cmd/satellite/gc-bf.go new file mode 100644 index 000000000..0f7a219d8 --- /dev/null +++ b/cmd/satellite/gc-bf.go @@ -0,0 +1,89 @@ +// Copyright (C) 2022 Storj Labs, Inc. +// See LICENSE for copying information. + +package main + +import ( + "github.com/spf13/cobra" + "github.com/zeebo/errs" + "go.uber.org/zap" + + "storj.io/private/process" + "storj.io/private/version" + "storj.io/storj/private/revocation" + "storj.io/storj/satellite" + "storj.io/storj/satellite/metabase" + "storj.io/storj/satellite/satellitedb" +) + +func cmdGCBloomFilterRun(cmd *cobra.Command, args []string) (err error) { + ctx, _ := process.Ctx(cmd) + log := zap.L() + + runCfg.Debug.Address = *process.DebugAddrFlag + + identity, err := runCfg.Identity.Load() + if err != nil { + log.Error("Failed to load identity.", zap.Error(err)) + return errs.New("Failed to load identity: %+v", err) + } + + db, err := satellitedb.Open(ctx, log.Named("db"), runCfg.Database, satellitedb.Options{ApplicationName: "satellite-gc-bloomfilter"}) + if err != nil { + return errs.New("Error starting master database on satellite GC: %+v", err) + } + defer func() { + err = errs.Combine(err, db.Close()) + }() + + metabaseDB, err := metabase.Open(ctx, log.Named("metabase"), runCfg.Metainfo.DatabaseURL, metabase.Config{ + ApplicationName: "satellite-gc-bloomfilter", + MinPartSize: runCfg.Config.Metainfo.MinPartSize, + MaxNumberOfParts: runCfg.Config.Metainfo.MaxNumberOfParts, + ServerSideCopy: runCfg.Config.Metainfo.ServerSideCopy, + }) + if err != nil { + return errs.New("Error creating metabase connection: %+v", err) + } + defer func() { + err = errs.Combine(err, metabaseDB.Close()) + }() + + revocationDB, err := revocation.OpenDBFromCfg(ctx, runCfg.Server.Config) + if err != nil { + return errs.New("Error creating revocation database GC: %+v", err) + } + defer func() { + err = errs.Combine(err, revocationDB.Close()) + }() + + peer, err := satellite.NewGarbageCollectionBF(log, identity, db, metabaseDB, revocationDB, version.Build, &runCfg.Config, process.AtomicLevel(cmd)) + if err != nil { + return err + } + + _, err = peer.Version.Service.CheckVersion(ctx) + if err != nil { + return err + } + + if err := process.InitMetricsWithHostname(ctx, log, nil); err != nil { + log.Warn("Failed to initialize telemetry batcher on satellite GC", zap.Error(err)) + } + + err = metabaseDB.CheckVersion(ctx) + if err != nil { + log.Error("Failed metabase database version check.", zap.Error(err)) + return errs.New("failed metabase version check: %+v", err) + } + + err = db.CheckVersion(ctx) + if err != nil { + log.Error("Failed satellite database version check.", zap.Error(err)) + return errs.New("Error checking version for satellitedb: %+v", err) + } + + runError := peer.Run(ctx) + closeError := peer.Close() + return errs.Combine(runError, closeError) +} diff --git a/cmd/satellite/main.go b/cmd/satellite/main.go index b04a91890..19f0692c0 100644 --- a/cmd/satellite/main.go +++ b/cmd/satellite/main.go @@ -116,6 +116,11 @@ var ( Short: "Run the satellite garbage collection process", RunE: cmdGCRun, } + runGCBloomFilterCmd = &cobra.Command{ + Use: "garbage-collection-bloom-filters", + Short: "Run the satellite process which collects nodes bloom filters for garbage collection", + RunE: cmdGCBloomFilterRun, + } setupCmd = &cobra.Command{ Use: "setup", Short: "Create config files", @@ -320,6 +325,7 @@ func init() { runCmd.AddCommand(runAdminCmd) runCmd.AddCommand(runRepairerCmd) runCmd.AddCommand(runGCCmd) + runCmd.AddCommand(runGCBloomFilterCmd) rootCmd.AddCommand(setupCmd) rootCmd.AddCommand(qdiagCmd) rootCmd.AddCommand(reportsCmd) @@ -350,6 +356,7 @@ func init() { process.Bind(runAdminCmd, &runCfg, defaults, cfgstruct.ConfDir(confDir), cfgstruct.IdentityDir(identityDir)) process.Bind(runRepairerCmd, &runCfg, defaults, cfgstruct.ConfDir(confDir), cfgstruct.IdentityDir(identityDir)) process.Bind(runGCCmd, &runCfg, defaults, cfgstruct.ConfDir(confDir), cfgstruct.IdentityDir(identityDir)) + process.Bind(runGCBloomFilterCmd, &runCfg, defaults, cfgstruct.ConfDir(confDir), cfgstruct.IdentityDir(identityDir)) process.Bind(restoreTrashCmd, &runCfg, defaults, cfgstruct.ConfDir(confDir), cfgstruct.IdentityDir(identityDir)) process.Bind(registerLostSegments, &runCfg, defaults, cfgstruct.ConfDir(confDir), cfgstruct.IdentityDir(identityDir)) process.Bind(fetchPiecesCmd, &runCfg, defaults, cfgstruct.ConfDir(confDir), cfgstruct.IdentityDir(identityDir))