forked from TrueCloudLab/frostfs-node
Move to frostfs-node
Signed-off-by: Pavel Karpy <p.karpy@yadro.com>
This commit is contained in:
parent
42554a9298
commit
923f84722a
934 changed files with 3470 additions and 3451 deletions
48
cmd/frostfs-lens/internal/blobovnicza/inspect.go
Normal file
48
cmd/frostfs-lens/internal/blobovnicza/inspect.go
Normal file
|
@ -0,0 +1,48 @@
|
|||
package blobovnicza
|
||||
|
||||
import (
|
||||
common "github.com/TrueCloudLab/frostfs-node/cmd/frostfs-lens/internal"
|
||||
"github.com/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobovnicza"
|
||||
"github.com/TrueCloudLab/frostfs-sdk-go/object"
|
||||
oid "github.com/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var inspectCMD = &cobra.Command{
|
||||
Use: "inspect",
|
||||
Short: "Object inspection",
|
||||
Long: `Inspect specific object in a blobovnicza.`,
|
||||
Run: inspectFunc,
|
||||
}
|
||||
|
||||
func init() {
|
||||
common.AddAddressFlag(inspectCMD, &vAddress)
|
||||
common.AddComponentPathFlag(inspectCMD, &vPath)
|
||||
common.AddOutputFileFlag(inspectCMD, &vOut)
|
||||
}
|
||||
|
||||
func inspectFunc(cmd *cobra.Command, _ []string) {
|
||||
var addr oid.Address
|
||||
|
||||
err := addr.DecodeString(vAddress)
|
||||
common.ExitOnErr(cmd, common.Errf("invalid address argument: %w", err))
|
||||
|
||||
blz := openBlobovnicza(cmd)
|
||||
defer blz.Close()
|
||||
|
||||
var prm blobovnicza.GetPrm
|
||||
prm.SetAddress(addr)
|
||||
|
||||
res, err := blz.Get(prm)
|
||||
common.ExitOnErr(cmd, common.Errf("could not fetch object: %w", err))
|
||||
|
||||
data := res.Object()
|
||||
|
||||
var o object.Object
|
||||
common.ExitOnErr(cmd, common.Errf("could not unmarshal object: %w",
|
||||
o.Unmarshal(data)),
|
||||
)
|
||||
|
||||
common.PrintObjectHeader(cmd, o)
|
||||
common.WriteObjectToFile(cmd, vOut, data)
|
||||
}
|
38
cmd/frostfs-lens/internal/blobovnicza/list.go
Normal file
38
cmd/frostfs-lens/internal/blobovnicza/list.go
Normal file
|
@ -0,0 +1,38 @@
|
|||
package blobovnicza
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
common "github.com/TrueCloudLab/frostfs-node/cmd/frostfs-lens/internal"
|
||||
"github.com/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobovnicza"
|
||||
oid "github.com/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var listCMD = &cobra.Command{
|
||||
Use: "list",
|
||||
Short: "Object listing",
|
||||
Long: `List all objects stored in a blobovnicza.`,
|
||||
Run: listFunc,
|
||||
}
|
||||
|
||||
func init() {
|
||||
common.AddComponentPathFlag(listCMD, &vPath)
|
||||
}
|
||||
|
||||
func listFunc(cmd *cobra.Command, _ []string) {
|
||||
// other targets can be supported
|
||||
w := cmd.OutOrStderr()
|
||||
|
||||
wAddr := func(addr oid.Address) error {
|
||||
_, err := io.WriteString(w, fmt.Sprintf("%s\n", addr))
|
||||
return err
|
||||
}
|
||||
|
||||
blz := openBlobovnicza(cmd)
|
||||
defer blz.Close()
|
||||
|
||||
err := blobovnicza.IterateAddresses(blz, wAddr)
|
||||
common.ExitOnErr(cmd, common.Errf("blobovnicza iterator failure: %w", err))
|
||||
}
|
33
cmd/frostfs-lens/internal/blobovnicza/root.go
Normal file
33
cmd/frostfs-lens/internal/blobovnicza/root.go
Normal file
|
@ -0,0 +1,33 @@
|
|||
package blobovnicza
|
||||
|
||||
import (
|
||||
common "github.com/TrueCloudLab/frostfs-node/cmd/frostfs-lens/internal"
|
||||
"github.com/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobovnicza"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var (
|
||||
vAddress string
|
||||
vPath string
|
||||
vOut string
|
||||
)
|
||||
|
||||
// Root contains `blobovnicza` command definition.
|
||||
var Root = &cobra.Command{
|
||||
Use: "blobovnicza",
|
||||
Short: "Operations with a blobovnicza",
|
||||
}
|
||||
|
||||
func init() {
|
||||
Root.AddCommand(listCMD, inspectCMD)
|
||||
}
|
||||
|
||||
func openBlobovnicza(cmd *cobra.Command) *blobovnicza.Blobovnicza {
|
||||
blz := blobovnicza.New(
|
||||
blobovnicza.WithPath(vPath),
|
||||
blobovnicza.WithReadOnly(true),
|
||||
)
|
||||
common.ExitOnErr(cmd, blz.Open())
|
||||
|
||||
return blz
|
||||
}
|
31
cmd/frostfs-lens/internal/errors.go
Normal file
31
cmd/frostfs-lens/internal/errors.go
Normal file
|
@ -0,0 +1,31 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
// Errf returns formatted error in errFmt format if err is not nil.
|
||||
func Errf(errFmt string, err error) error {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return fmt.Errorf(errFmt, err)
|
||||
}
|
||||
|
||||
// ExitOnErr calls exitOnErrCode with code 1.
|
||||
func ExitOnErr(cmd *cobra.Command, err error) {
|
||||
exitOnErrCode(cmd, err, 1)
|
||||
}
|
||||
|
||||
// exitOnErrCode prints error via cmd and calls os.Exit with passed exit code.
|
||||
// Does nothing if err is nil.
|
||||
func exitOnErrCode(cmd *cobra.Command, err error, code int) {
|
||||
if err != nil {
|
||||
cmd.PrintErrln(err)
|
||||
os.Exit(code)
|
||||
}
|
||||
}
|
35
cmd/frostfs-lens/internal/flags.go
Normal file
35
cmd/frostfs-lens/internal/flags.go
Normal file
|
@ -0,0 +1,35 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
const (
|
||||
flagAddress = "address"
|
||||
flagEnginePath = "path"
|
||||
flagOutFile = "out"
|
||||
)
|
||||
|
||||
// AddAddressFlag adds the address flag to the passed cobra command.
|
||||
func AddAddressFlag(cmd *cobra.Command, v *string) {
|
||||
cmd.Flags().StringVar(v, flagAddress, "", "Object address")
|
||||
_ = cmd.MarkFlagRequired(flagAddress)
|
||||
}
|
||||
|
||||
// AddComponentPathFlag adds the path-to-component flag to the
|
||||
// passed cobra command.
|
||||
func AddComponentPathFlag(cmd *cobra.Command, v *string) {
|
||||
cmd.Flags().StringVar(v, flagEnginePath, "",
|
||||
"Path to storage engine component",
|
||||
)
|
||||
_ = cmd.MarkFlagFilename(flagEnginePath)
|
||||
_ = cmd.MarkFlagRequired(flagEnginePath)
|
||||
}
|
||||
|
||||
// AddOutputFileFlag adds the output file flag to the passed cobra
|
||||
// command.
|
||||
func AddOutputFileFlag(cmd *cobra.Command, v *string) {
|
||||
cmd.Flags().StringVar(v, flagOutFile, "",
|
||||
"File to save object payload")
|
||||
_ = cmd.MarkFlagFilename(flagOutFile)
|
||||
}
|
74
cmd/frostfs-lens/internal/meta/inspect.go
Normal file
74
cmd/frostfs-lens/internal/meta/inspect.go
Normal file
|
@ -0,0 +1,74 @@
|
|||
package meta
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
common "github.com/TrueCloudLab/frostfs-node/cmd/frostfs-lens/internal"
|
||||
"github.com/TrueCloudLab/frostfs-node/pkg/local_object_storage/blobovnicza"
|
||||
meta "github.com/TrueCloudLab/frostfs-node/pkg/local_object_storage/metabase"
|
||||
"github.com/TrueCloudLab/frostfs-sdk-go/object"
|
||||
oid "github.com/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var inspectCMD = &cobra.Command{
|
||||
Use: "inspect",
|
||||
Short: "Object inspection",
|
||||
Long: `Inspect specific object in a metabase.`,
|
||||
Run: inspectFunc,
|
||||
}
|
||||
|
||||
func init() {
|
||||
common.AddAddressFlag(inspectCMD, &vAddress)
|
||||
common.AddComponentPathFlag(inspectCMD, &vPath)
|
||||
}
|
||||
|
||||
func inspectFunc(cmd *cobra.Command, _ []string) {
|
||||
var addr oid.Address
|
||||
|
||||
err := addr.DecodeString(vAddress)
|
||||
common.ExitOnErr(cmd, common.Errf("invalid address argument: %w", err))
|
||||
|
||||
db := openMeta(cmd)
|
||||
defer db.Close()
|
||||
|
||||
storageID := meta.StorageIDPrm{}
|
||||
storageID.SetAddress(addr)
|
||||
|
||||
resStorageID, err := db.StorageID(storageID)
|
||||
common.ExitOnErr(cmd, common.Errf("could not check if the obj is small: %w", err))
|
||||
|
||||
if id := resStorageID.StorageID(); id != nil {
|
||||
cmd.Printf("Object storageID: %s\n\n", blobovnicza.NewIDFromBytes(id).String())
|
||||
} else {
|
||||
cmd.Printf("Object does not contain storageID\n\n")
|
||||
}
|
||||
|
||||
prm := meta.GetPrm{}
|
||||
prm.SetAddress(addr)
|
||||
prm.SetRaw(true)
|
||||
|
||||
siErr := new(object.SplitInfoError)
|
||||
|
||||
res, err := db.Get(prm)
|
||||
if errors.As(err, &siErr) {
|
||||
link, linkSet := siErr.SplitInfo().Link()
|
||||
last, lastSet := siErr.SplitInfo().LastPart()
|
||||
|
||||
fmt.Println("Object is split")
|
||||
cmd.Println("\tSplitID:", siErr.SplitInfo().SplitID().String())
|
||||
|
||||
if linkSet {
|
||||
cmd.Println("\tLink:", link)
|
||||
}
|
||||
if lastSet {
|
||||
cmd.Println("\tLast:", last)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
common.ExitOnErr(cmd, common.Errf("could not get object: %w", err))
|
||||
|
||||
common.PrintObjectHeader(cmd, *res.Header())
|
||||
}
|
33
cmd/frostfs-lens/internal/meta/list-garbage.go
Normal file
33
cmd/frostfs-lens/internal/meta/list-garbage.go
Normal file
|
@ -0,0 +1,33 @@
|
|||
package meta
|
||||
|
||||
import (
|
||||
common "github.com/TrueCloudLab/frostfs-node/cmd/frostfs-lens/internal"
|
||||
meta "github.com/TrueCloudLab/frostfs-node/pkg/local_object_storage/metabase"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var listGarbageCMD = &cobra.Command{
|
||||
Use: "list-garbage",
|
||||
Short: "Garbage listing",
|
||||
Long: `List all the objects that have received GC Mark.`,
|
||||
Run: listGarbageFunc,
|
||||
}
|
||||
|
||||
func init() {
|
||||
common.AddComponentPathFlag(listGarbageCMD, &vPath)
|
||||
}
|
||||
|
||||
func listGarbageFunc(cmd *cobra.Command, _ []string) {
|
||||
db := openMeta(cmd)
|
||||
defer db.Close()
|
||||
|
||||
var garbPrm meta.GarbageIterationPrm
|
||||
garbPrm.SetHandler(
|
||||
func(garbageObject meta.GarbageObject) error {
|
||||
cmd.Println(garbageObject.Address().EncodeToString())
|
||||
return nil
|
||||
})
|
||||
|
||||
err := db.IterateOverGarbage(garbPrm)
|
||||
common.ExitOnErr(cmd, common.Errf("could not iterate over garbage bucket: %w", err))
|
||||
}
|
38
cmd/frostfs-lens/internal/meta/list-graveyard.go
Normal file
38
cmd/frostfs-lens/internal/meta/list-graveyard.go
Normal file
|
@ -0,0 +1,38 @@
|
|||
package meta
|
||||
|
||||
import (
|
||||
common "github.com/TrueCloudLab/frostfs-node/cmd/frostfs-lens/internal"
|
||||
meta "github.com/TrueCloudLab/frostfs-node/pkg/local_object_storage/metabase"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var listGraveyardCMD = &cobra.Command{
|
||||
Use: "list-graveyard",
|
||||
Short: "Graveyard listing",
|
||||
Long: `List all the objects that have been covered with a Tomb Stone.`,
|
||||
Run: listGraveyardFunc,
|
||||
}
|
||||
|
||||
func init() {
|
||||
common.AddComponentPathFlag(listGraveyardCMD, &vPath)
|
||||
}
|
||||
|
||||
func listGraveyardFunc(cmd *cobra.Command, _ []string) {
|
||||
db := openMeta(cmd)
|
||||
defer db.Close()
|
||||
|
||||
var gravePrm meta.GraveyardIterationPrm
|
||||
gravePrm.SetHandler(
|
||||
func(tsObj meta.TombstonedObject) error {
|
||||
cmd.Printf(
|
||||
"Object: %s\nTS: %s\n",
|
||||
tsObj.Address().EncodeToString(),
|
||||
tsObj.Tombstone().EncodeToString(),
|
||||
)
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
err := db.IterateOverGraveyard(gravePrm)
|
||||
common.ExitOnErr(cmd, common.Errf("could not iterate over graveyard bucket: %w", err))
|
||||
}
|
49
cmd/frostfs-lens/internal/meta/root.go
Normal file
49
cmd/frostfs-lens/internal/meta/root.go
Normal file
|
@ -0,0 +1,49 @@
|
|||
package meta
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
common "github.com/TrueCloudLab/frostfs-node/cmd/frostfs-lens/internal"
|
||||
meta "github.com/TrueCloudLab/frostfs-node/pkg/local_object_storage/metabase"
|
||||
"github.com/spf13/cobra"
|
||||
"go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
var (
|
||||
vAddress string
|
||||
vPath string
|
||||
)
|
||||
|
||||
type epochState struct{}
|
||||
|
||||
func (s epochState) CurrentEpoch() uint64 {
|
||||
return 0
|
||||
}
|
||||
|
||||
// Root contains `meta` command definition.
|
||||
var Root = &cobra.Command{
|
||||
Use: "meta",
|
||||
Short: "Operations with a metabase",
|
||||
}
|
||||
|
||||
func init() {
|
||||
Root.AddCommand(
|
||||
inspectCMD,
|
||||
listGraveyardCMD,
|
||||
listGarbageCMD,
|
||||
)
|
||||
}
|
||||
|
||||
func openMeta(cmd *cobra.Command) *meta.DB {
|
||||
db := meta.New(
|
||||
meta.WithPath(vPath),
|
||||
meta.WithBoltDBOptions(&bbolt.Options{
|
||||
ReadOnly: true,
|
||||
Timeout: 100 * time.Millisecond,
|
||||
}),
|
||||
meta.WithEpochState(epochState{}),
|
||||
)
|
||||
common.ExitOnErr(cmd, common.Errf("could not open metabase: %w", db.Open(true)))
|
||||
|
||||
return db
|
||||
}
|
65
cmd/frostfs-lens/internal/printers.go
Normal file
65
cmd/frostfs-lens/internal/printers.go
Normal file
|
@ -0,0 +1,65 @@
|
|||
package common
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
cid "github.com/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||
"github.com/TrueCloudLab/frostfs-sdk-go/object"
|
||||
oid "github.com/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
// PrintObjectHeader prints passed object's header fields via
|
||||
// the passed cobra command. Does nothing with the payload.
|
||||
func PrintObjectHeader(cmd *cobra.Command, h object.Object) {
|
||||
cmd.Println("Version:", h.Version())
|
||||
cmd.Println("Type:", h.Type())
|
||||
printContainerID(cmd, h.ContainerID)
|
||||
printObjectID(cmd, h.ID)
|
||||
cmd.Println("Owner:", h.OwnerID())
|
||||
cmd.Println("CreatedAt:", h.CreationEpoch())
|
||||
cmd.Println("PayloadSize:", h.PayloadSize())
|
||||
cmd.Println("Attributes:")
|
||||
for _, attr := range h.Attributes() {
|
||||
cmd.Printf(" %s: %s\n", attr.Key(), attr.Value())
|
||||
}
|
||||
}
|
||||
|
||||
func printContainerID(cmd *cobra.Command, recv func() (cid.ID, bool)) {
|
||||
var val string
|
||||
|
||||
id, ok := recv()
|
||||
if ok {
|
||||
val = id.String()
|
||||
} else {
|
||||
val = "<empty>"
|
||||
}
|
||||
|
||||
cmd.Println("CID:", val)
|
||||
}
|
||||
|
||||
func printObjectID(cmd *cobra.Command, recv func() (oid.ID, bool)) {
|
||||
var val string
|
||||
|
||||
id, ok := recv()
|
||||
if ok {
|
||||
val = id.String()
|
||||
} else {
|
||||
val = "<empty>"
|
||||
}
|
||||
|
||||
cmd.Println("ID:", val)
|
||||
}
|
||||
|
||||
// WriteObjectToFile writes object to the provided path. Does nothing if
|
||||
// the path is empty.
|
||||
func WriteObjectToFile(cmd *cobra.Command, path string, data []byte) {
|
||||
if path == "" {
|
||||
return
|
||||
}
|
||||
|
||||
ExitOnErr(cmd, Errf("could not write file: %w",
|
||||
os.WriteFile(path, data, 0644)))
|
||||
|
||||
cmd.Printf("\nSaved payload to '%s' file\n", path)
|
||||
}
|
35
cmd/frostfs-lens/internal/writecache/inspect.go
Normal file
35
cmd/frostfs-lens/internal/writecache/inspect.go
Normal file
|
@ -0,0 +1,35 @@
|
|||
package writecache
|
||||
|
||||
import (
|
||||
common "github.com/TrueCloudLab/frostfs-node/cmd/frostfs-lens/internal"
|
||||
"github.com/TrueCloudLab/frostfs-node/pkg/local_object_storage/writecache"
|
||||
"github.com/TrueCloudLab/frostfs-sdk-go/object"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var inspectCMD = &cobra.Command{
|
||||
Use: "inspect",
|
||||
Short: "Object inspection",
|
||||
Long: `Inspect specific object in a write-cache.`,
|
||||
Run: inspectFunc,
|
||||
}
|
||||
|
||||
func init() {
|
||||
common.AddAddressFlag(inspectCMD, &vAddress)
|
||||
common.AddComponentPathFlag(inspectCMD, &vPath)
|
||||
common.AddOutputFileFlag(inspectCMD, &vOut)
|
||||
}
|
||||
|
||||
func inspectFunc(cmd *cobra.Command, _ []string) {
|
||||
db := openWC(cmd)
|
||||
defer db.Close()
|
||||
|
||||
data, err := writecache.Get(db, []byte(vAddress))
|
||||
common.ExitOnErr(cmd, common.Errf("could not fetch object: %w", err))
|
||||
|
||||
var o object.Object
|
||||
common.ExitOnErr(cmd, common.Errf("could not unmarshal object: %w", o.Unmarshal(data)))
|
||||
|
||||
common.PrintObjectHeader(cmd, o)
|
||||
common.WriteObjectToFile(cmd, vOut, data)
|
||||
}
|
38
cmd/frostfs-lens/internal/writecache/list.go
Normal file
38
cmd/frostfs-lens/internal/writecache/list.go
Normal file
|
@ -0,0 +1,38 @@
|
|||
package writecache
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
common "github.com/TrueCloudLab/frostfs-node/cmd/frostfs-lens/internal"
|
||||
"github.com/TrueCloudLab/frostfs-node/pkg/local_object_storage/writecache"
|
||||
oid "github.com/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var listCMD = &cobra.Command{
|
||||
Use: "inspect",
|
||||
Short: "Object inspection",
|
||||
Long: `Inspect specific object in a write-cache.`,
|
||||
Run: listFunc,
|
||||
}
|
||||
|
||||
func init() {
|
||||
common.AddComponentPathFlag(listCMD, &vPath)
|
||||
}
|
||||
|
||||
func listFunc(cmd *cobra.Command, _ []string) {
|
||||
// other targets can be supported
|
||||
w := cmd.OutOrStderr()
|
||||
|
||||
wAddr := func(addr oid.Address) error {
|
||||
_, err := io.WriteString(w, fmt.Sprintf("%s\n", addr))
|
||||
return err
|
||||
}
|
||||
|
||||
db := openWC(cmd)
|
||||
defer db.Close()
|
||||
|
||||
err := writecache.IterateDB(db, wAddr)
|
||||
common.ExitOnErr(cmd, common.Errf("write-cache iterator failure: %w", err))
|
||||
}
|
31
cmd/frostfs-lens/internal/writecache/root.go
Normal file
31
cmd/frostfs-lens/internal/writecache/root.go
Normal file
|
@ -0,0 +1,31 @@
|
|||
package writecache
|
||||
|
||||
import (
|
||||
common "github.com/TrueCloudLab/frostfs-node/cmd/frostfs-lens/internal"
|
||||
"github.com/TrueCloudLab/frostfs-node/pkg/local_object_storage/writecache"
|
||||
"github.com/spf13/cobra"
|
||||
"go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
var (
|
||||
vAddress string
|
||||
vPath string
|
||||
vOut string
|
||||
)
|
||||
|
||||
// Root contains `write-cache` command definition.
|
||||
var Root = &cobra.Command{
|
||||
Use: "write-cache",
|
||||
Short: "Operations with write-cache",
|
||||
}
|
||||
|
||||
func init() {
|
||||
Root.AddCommand(listCMD, inspectCMD)
|
||||
}
|
||||
|
||||
func openWC(cmd *cobra.Command) *bbolt.DB {
|
||||
db, err := writecache.OpenDB(vPath, true)
|
||||
common.ExitOnErr(cmd, common.Errf("could not open write-cache db: %w", err))
|
||||
|
||||
return db
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue