Skip to content
This repository was archived by the owner on Sep 22, 2020. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions block/etcd.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,37 @@ func (b *blockEtcd) DeleteVolume() error {

}

func (b *blockEtcd) ResizeVolume(size uint64) error {
vid := uint64(b.vid)
volumeKey := etcd.MkKey("volumeid", etcd.Uint64ToHex(vid))
resp, err := b.Etcd.Client.Get(b.getContext(), volumeKey)
if err != nil {
return err
}
var version int64
var value []byte
kv := resp.Kvs[0]
version = kv.Version
value = kv.Value
var volume models.Volume
err = volume.Unmarshal(value)
volume.MaxBytes = size
vbytes, err := volume.Marshal()
tx := b.Etcd.Client.Txn(b.getContext()).If(
etcdv3.Compare(etcdv3.Version(volumeKey), "=", version),
).Then(
etcdv3.OpPut(etcd.MkKey("volumeid", etcd.Uint64ToHex(vid)), string(vbytes)),
)
txresp, err := tx.Commit()
if err != nil {
return err
}
if !txresp.Succeeded {
return torus.ErrCompareFailed
}
return nil
}

func (b *blockEtcd) getContext() context.Context {
return context.TODO()
}
Expand Down
1 change: 1 addition & 0 deletions block/metadata.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ type blockMetadata interface {

CreateBlockVolume(vol *models.Volume) error
DeleteVolume() error
ResizeVolume(size uint64) error

SaveSnapshot(name string) error
GetSnapshots() ([]Snapshot, error)
Expand Down
15 changes: 15 additions & 0 deletions block/temp.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,21 @@ func (b *blockTempMetadata) DeleteVolume() error {
return b.Client.DeleteVolume(b.name)
}

func (b *blockTempMetadata) ResizeVolume(size uint64) error {
b.LockData()
defer b.UnlockData()
v, ok := b.GetData(fmt.Sprint(b.vid))
if !ok {
return torus.ErrNotExist
}
d := v.(*blockTempVolumeData)
if d.locked != b.UUID() {
return torus.ErrLocked
}
return b.Client.ResizeVolume(b.name, size)

}

func (b *blockTempMetadata) SaveSnapshot(name string) error {
b.LockData()
defer b.UnlockData()
Expand Down
20 changes: 20 additions & 0 deletions block/volume.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,26 @@ func DeleteBlockVolume(mds torus.MetadataService, volume string) error {
return bmds.DeleteVolume()
}

func (s *BlockVolume) ResizeBlockVolume(mds torus.MetadataService, volume string, size uint64) error {
vol, err := mds.GetVolume(volume)
if err != nil {
return err
}
bmds, err := createBlockMetadata(mds, vol.Name, torus.VolumeID(vol.Id))
if err != nil {
return err
}
if err = bmds.Lock(s.srv.Lease()); err != nil {
return err
}
defer func() {
if err != nil {
s.mds.Unlock()
}
}()
return bmds.ResizeVolume(size)
}

func (s *BlockVolume) SaveSnapshot(name string) error { return s.mds.SaveSnapshot(name) }
func (s *BlockVolume) GetSnapshots() ([]Snapshot, error) { return s.mds.GetSnapshots() }
func (s *BlockVolume) DeleteSnapshot(name string) error { return s.mds.DeleteSnapshot(name) }
Expand Down
41 changes: 41 additions & 0 deletions cmd/torusctl/volume.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,18 @@ var volumeCreateBlockCommand = &cobra.Command{
Run: volumeCreateBlockAction,
}

var volumeResizeBlockCommand = &cobra.Command{
Use: "resize-block NAME SIZE",
Short: "resize a block volume in the cluster",
Long: "resize a block volume named NAME of size SIZE bytes (G,GiB,M,MiB,etc suffixes accepted)",
Run: volumeResizeBlockAction,
}

func init() {
volumeCommand.AddCommand(volumeDeleteCommand)
volumeCommand.AddCommand(volumeListCommand)
volumeCommand.AddCommand(volumeCreateBlockCommand)
volumeCommand.AddCommand(volumeResizeBlockCommand)
volumeListCommand.Flags().BoolVarP(&outputAsCSV, "csv", "", false, "output as csv instead")
}

Expand Down Expand Up @@ -78,6 +86,7 @@ func volumeDeleteAction(cmd *cobra.Command, args []string) {
}
name := args[0]
mds := mustConnectToMDS()

vol, err := mds.GetVolume(name)
if err != nil {
die("cannot get volume %s (perhaps it doesn't exist): %v", name, err)
Expand Down Expand Up @@ -108,3 +117,35 @@ func volumeCreateBlockAction(cmd *cobra.Command, args []string) {
die("error creating volume %s: %v", args[0], err)
}
}

func volumeResizeBlockAction(cmd *cobra.Command, args []string) {
mds := mustConnectToMDS()
if len(args) != 2 {
cmd.Usage()
os.Exit(1)
}
name := args[0]
size, err := humanize.ParseBytes(args[1])
if err != nil {
die("error parsing size %s: %v", args[1], err)
}
vol, err := mds.GetVolume(name)
if err != nil {
die("cannot get volume %s (perhaps it doesn't exist): %v", name, err)
}
switch vol.Type {
case "block":
srv := createServer()
defer srv.Close()
blockvol, err := block.OpenBlockVolume(srv, vol.Name)
if err != nil {
die("couldn't open block volume %s: %v", vol.Name, err)
}
err = blockvol.ResizeBlockVolume(mds, args[0], size)
default:
die("unknown volume type %s", vol.Type)
}
if err != nil {
die("error resizing volume %s: %v", name, err)
}
}
12 changes: 12 additions & 0 deletions metadata/temp/temp.go
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,18 @@ func (t *Client) CreateVolume(volume *models.Volume) error {
return nil
}

func (t *Client) ResizeVolume(name string, size uint64) error {
t.srv.mut.Lock()
defer t.srv.mut.Unlock()
volume, err := t.srv.volIndex[name]
if err {
return torus.ErrBlockNotExist
}
volume.MaxBytes = size
t.srv.volIndex[volume.Name] = volume
return nil
}

func (t *Client) GetVolume(volume string) (*models.Volume, error) {
t.srv.mut.Lock()
defer t.srv.mut.Unlock()
Expand Down