Skip to content

Commit

Permalink
feat(lvol): add snapshot checksum APIs
Browse files Browse the repository at this point in the history
Longhorn 9709

Signed-off-by: Damiano Cipriani <[email protected]>
  • Loading branch information
DamiaSan committed Nov 28, 2024
1 parent c396ae7 commit b5a686e
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 5 deletions.
86 changes: 86 additions & 0 deletions app/cmd/basic/bdev_lvol.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ func BdevLvolCmd() cli.Command {
BdevLvolGetXattrCmd(),
BdevLvolGetFragmapCmd(),
BdevLvolRenameCmd(),
BdevLvolRegisterSnapshotChecksumCmd(),
BdevLvolGetSnapshotChecksumCmd(),
},
}
}
Expand Down Expand Up @@ -654,3 +656,87 @@ func bdevLvolRename(c *cli.Context) error {

return util.PrintObject(renamed)
}

func BdevLvolRegisterSnapshotChecksumCmd() cli.Command {
return cli.Command{
Name: "register-snapshot-checksum",
Flags: []cli.Flag{
cli.StringFlag{
Name: "alias",
Usage: "The alias of a snapshot is <LVSTORE NAME>/<SNAPSHOT NAME>. Specify this or uuid",
},
cli.StringFlag{
Name: "uuid",
Usage: "Specify this or alias",
},
},
Usage: "compute and store checksum of snapshot's data: \"register-snapshot-checksum --alias <LVSTORE NAME>/<LVOL NAME>\"," +
" or \"register-snapshot-checksum --uuid <LVOL UUID>\"",
Action: func(c *cli.Context) {
if err := bdevLvolRegisterSnapshotChecksum(c); err != nil {
logrus.WithError(err).Fatalf("Failed to run register snapshot checksum command")
}
},
}
}

func bdevLvolRegisterSnapshotChecksum(c *cli.Context) error {
spdkCli, err := client.NewClient(context.Background())
if err != nil {
return err
}

name := c.String("alias")
if name == "" {
name = c.String("uuid")
}

registered, err := spdkCli.BdevLvolRegisterSnapshotChecksum(name)
if err != nil {
return err
}

return util.PrintObject(registered)
}

func BdevLvolGetSnapshotChecksumCmd() cli.Command {
return cli.Command{
Name: "get-snapshot-checksum",
Flags: []cli.Flag{
cli.StringFlag{
Name: "alias",
Usage: "The alias of a snapshot is <LVSTORE NAME>/<SNAPSHOT NAME>. Specify this or uuid",
},
cli.StringFlag{
Name: "uuid",
Usage: "Specify this or alias",
},
},
Usage: "get checksum of snapshot's data: \"get-snapshot-checksum --alias <LVSTORE NAME>/<LVOL NAME>\"," +
" or \"get-snapshot-checksum --uuid <LVOL UUID>\"",
Action: func(c *cli.Context) {
if err := bdevLvolGetSnapshotChecksum(c); err != nil {
logrus.WithError(err).Fatalf("Failed to run get snapshot checksum command")
}
},
}
}

func bdevLvolGetSnapshotChecksum(c *cli.Context) error {
spdkCli, err := client.NewClient(context.Background())
if err != nil {
return err
}

name := c.String("alias")
if name == "" {
name = c.String("uuid")
}

checksum, err := spdkCli.BdevLvolGetSnapshotChecksum(name)
if err != nil {
return err
}

return util.PrintObject(*checksum)
}
43 changes: 41 additions & 2 deletions pkg/spdk/client/basic.go
Original file line number Diff line number Diff line change
Expand Up @@ -310,8 +310,9 @@ func (c *Client) BdevLvolGetWithFilter(name string, timeout uint64, filter func(
// "snapshotName": Required. the logical volume name for the newly created snapshot.
func (c *Client) BdevLvolSnapshot(name, snapshotName string, xattrs []Xattr) (uuid string, err error) {
req := spdktypes.BdevLvolSnapshotRequest{
LvolName: name,
SnapshotName: snapshotName,
LvolName: name,
SnapshotName: snapshotName,
EnableAddUpdateXattrs: true,
}

req.Xattrs = make(map[string]string)
Expand Down Expand Up @@ -502,6 +503,44 @@ func (c *Client) BdevLvolGetFragmap(name string, offset, size uint64) (*spdktype
return &result, nil
}

// BdevLvolRegisterSnapshotChecksum compute and store checksum of snapshot's data. Overwrite old checksum if already registered.
//
// "name": Required. UUID or alias of the snapshot. The alias of a snapshot is <LVSTORE NAME>/<SNAPSHOT NAME>.
func (c *Client) BdevLvolRegisterSnapshotChecksum(name string) (registered bool, err error) {
req := spdktypes.BdevLvolRegisterSnapshotChecksumRequest{
Name: name,
}

cmdOutput, err := c.jsonCli.SendCommandWithLongTimeout("bdev_lvol_register_snapshot_checksum", req)
if err != nil {
return false, err
}

return registered, json.Unmarshal(cmdOutput, &registered)
}

// BdevLvolGetSnapshotChecksum gets snapshot's stored checksum. The checksum must has been previously registered.
//
// "name": Required. UUID or alias of the snapshot. The alias of a snapshot is <LVSTORE NAME>/<SNAPSHOT NAME>.
func (c *Client) BdevLvolGetSnapshotChecksum(name string) (checksum *uint64, err error) {
req := spdktypes.BdevLvolRegisterSnapshotChecksumRequest{
Name: name,
}

cmdOutput, err := c.jsonCli.SendCommandWithLongTimeout("bdev_lvol_get_snapshot_checksum", req)
if err != nil {
return nil, err
}

var snapshotChecksum spdktypes.BdevLvolSnapshotChecksum
err = json.Unmarshal(cmdOutput, &snapshotChecksum)
if err != nil {
return nil, err
}

return &snapshotChecksum.Checksum, nil
}

// BdevLvolRename renames a logical volume.
//
// "oldName": Required. UUID or alias of the existing logical volume.
Expand Down
19 changes: 16 additions & 3 deletions pkg/spdk/types/lvol.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,10 @@ type BdevLvolDeleteRequest struct {
}

type BdevLvolSnapshotRequest struct {
LvolName string `json:"lvol_name"`
SnapshotName string `json:"snapshot_name"`
Xattrs map[string]string `json:"xattrs,omitempty"`
LvolName string `json:"lvol_name"`
SnapshotName string `json:"snapshot_name"`
Xattrs map[string]string `json:"xattrs,omitempty"`
EnableAddUpdateXattrs bool `json:"enable_add_update_xattrs,omitempty"`
}

type BdevLvolCloneRequest struct {
Expand Down Expand Up @@ -150,6 +151,18 @@ type BdevLvolRenameRequest struct {
NewName string `json:"new_name"`
}

type BdevLvolRegisterSnapshotChecksumRequest struct {
Name string `json:"name"`
}

type BdevLvolGetSnapshotChecksumRequest struct {
Name string `json:"name"`
}

type BdevLvolSnapshotChecksum struct {
Checksum uint64 `json:"checksum"`
}

func GetLvolAlias(lvsName, lvolName string) string {
return fmt.Sprintf("%s/%s", lvsName, lvolName)
}
Expand Down

0 comments on commit b5a686e

Please sign in to comment.