diff --git a/apps/glusterfs/app_block_volume.go b/apps/glusterfs/app_block_volume.go index 1a06375f15..5879a6fb29 100644 --- a/apps/glusterfs/app_block_volume.go +++ b/apps/glusterfs/app_block_volume.go @@ -200,52 +200,13 @@ func (a *App) BlockVolumeExpand(w http.ResponseWriter, r *http.Request) { return } - var blockvolume *BlockVolumeEntry - err = a.db.View(func(tx *bolt.Tx) error { - var err error - blockvolume, err = NewBlockVolumeEntryFromId(tx, id) - if err == ErrNotFound { - http.Error(w, err.Error(), http.StatusNotFound) - return err - } else if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return err - } - - if msg.Size == blockvolume.Info.Size { - http.Error(w, "Requested new-size is same as current block volume size, nothing to be done.", - http.StatusBadRequest) - logger.LogError("Requested new-size %v is same as current block volume size %v, nothing to be done.", - msg.Size, blockvolume.Info.Size) - return ErrInvalidRequest - } else if msg.Size < blockvolume.Info.Size { - http.Error(w, "Requested new-size is less than current block volume size, shrinking is not allowed.", - http.StatusBadRequest) - logger.LogError("Requested new-size %v is less than current block volume size %v, shrinking is not allowed.", - msg.Size, blockvolume.Info.Size) - return ErrInvalidRequest - } - - volume, err := NewVolumeEntryFromId(tx, blockvolume.Info.BlockHostingVolume) - if err != nil { - return err - } - - RequiredFeeSize := msg.Size - blockvolume.Info.Size - if volume.Info.BlockInfo.FreeSize < RequiredFeeSize { - http.Error(w, "Free size on block hosting volume is less than requested delta size.", - http.StatusBadRequest) - logger.LogError("Free size %v on block hosting volume is less than requested delta size %v.", - volume.Info.BlockInfo.FreeSize, RequiredFeeSize) - return ErrNoSpace - } - return nil - }) + bve, err := NewBlockVolumeExpandOperation(id, a.db, msg.Size) if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + logger.LogError("failed creating a new BlockVolumeExpandOperation" + err.Error()) return } - bve := NewBlockVolumeExpandOperation(blockvolume, a.db, msg.Size) if err := AsyncHttpOperation(a, w, r, bve); err != nil { OperationHttpErrorf(w, err, "Failed to allocate block volume expansion: %v", err) return diff --git a/apps/glusterfs/block_volume_entry.go b/apps/glusterfs/block_volume_entry.go index 398eee1314..bf1080ce49 100644 --- a/apps/glusterfs/block_volume_entry.go +++ b/apps/glusterfs/block_volume_entry.go @@ -320,7 +320,7 @@ func (v *BlockVolumeEntry) destroyFromHost( return nil } -func (v *BlockVolumeEntry) InfoBlockVolumeFromHost(executor executors.Executor, +func (v *BlockVolumeEntry) BlockVolumeInfoFromHost(executor executors.Executor, hvname string, h string) (*executors.BlockVolumeInfo, error) { godbc.Require(hvname != "") @@ -366,19 +366,6 @@ func (v *BlockVolumeEntry) expandBlockVolumeComponents(db wdb.DB, newSize int) e return e } -func (v *BlockVolumeEntry) expandBlockVolumeExec(executor executors.Executor, - hvname string, newSize int, h string) error { - err := executor.BlockVolumeExpand(h, hvname, v.Info.Name, newSize) - if _, ok := err.(*executors.VolumeDoesNotExistErr); ok { - logger.LogError("Block volume %v (%v) does not exist:", v.Info.Id, v.Info.Name) - return err - } else if err != nil { - logger.LogError("Unable to Expand volume: %v", err) - return err - } - return nil -} - func (v *BlockVolumeEntry) removeComponents(db wdb.DB, keepSize bool) error { return db.Update(func(tx *bolt.Tx) error { // Remove volume from cluster diff --git a/apps/glusterfs/operations_block_volume.go b/apps/glusterfs/operations_block_volume.go index e8d5d06916..aea2ccbc8a 100644 --- a/apps/glusterfs/operations_block_volume.go +++ b/apps/glusterfs/operations_block_volume.go @@ -401,10 +401,23 @@ type BlockVolumeExpandOperation struct { } // NewBlockVolumeExpandOperation creates a new BlockVolumeExpandOperation populated -// with the given blockvolume entry, db connection and newsize (in GB) that the +// with the given blockvolume id, db connection and newsize (in GB) that the // blockvolume is to be expanded by. -func NewBlockVolumeExpandOperation( - bvol *BlockVolumeEntry, db wdb.DB, newSize int) *BlockVolumeExpandOperation { +func NewBlockVolumeExpandOperation(bvolId string, db wdb.DB, newSize int) ( + *BlockVolumeExpandOperation, error) { + + var bvol *BlockVolumeEntry + err := db.View(func(tx *bolt.Tx) error { + var err error + bvol, err = NewBlockVolumeEntryFromId(tx, bvolId) + if err != nil { + return err + } + return nil + }) + if err != nil { + return nil, err + } return &BlockVolumeExpandOperation{ OperationManager: OperationManager{ @@ -413,7 +426,7 @@ func NewBlockVolumeExpandOperation( }, bvol: bvol, newSize: newSize, - } + }, nil } // loadBlockVolumeExpandOperation returns a BlockVolumeExpandOperation populated @@ -451,16 +464,43 @@ func (bve *BlockVolumeExpandOperation) ResourceUrl() string { func (bve *BlockVolumeExpandOperation) Build() error { return bve.db.Update(func(tx *bolt.Tx) error { txdb := wdb.WrapTx(tx) - v, err := NewBlockVolumeEntryFromId(tx, bve.bvol.Info.Id) + bv, err := NewBlockVolumeEntryFromId(tx, bve.bvol.Info.Id) if err != nil { return err } - bve.bvol = v + bve.bvol = bv if bve.bvol.Pending.Id != "" { logger.LogError("Pending block volume %v can not be Expanded", bve.bvol.Info.Id) return ErrConflict } + + v, err := NewVolumeEntryFromId(tx, bv.Info.BlockHostingVolume) + if err != nil { + return err + } + if v.Pending.Id != "" { + logger.LogError("Pending volume %v can not expand block volume %v", v.Info.Id, bve.bvol.Info.Id) + return ErrConflict + } + + if bve.newSize == bv.Info.Size { + logger.LogError("Requested new-size %v is same as current block volume size %v, nothing to be done.", + bve.newSize, bv.Info.Size) + return ErrInvalidRequest + } else if bve.newSize < bv.Info.Size { + logger.LogError("Requested new-size %v is less than current block volume size %v, shrinking is not allowed.", + bve.newSize, bv.Info.Size) + return ErrInvalidRequest + } + + RequiredFeeSize := bve.newSize - bv.Info.Size + if v.Info.BlockInfo.FreeSize < RequiredFeeSize { + logger.LogError("Free size %v on block hosting volume is less than requested delta size %v.", + v.Info.BlockInfo.FreeSize, RequiredFeeSize) + return ErrNoSpace + } + err = bve.bvol.expandBlockVolumeComponents(txdb, bve.newSize) if err != nil { return err @@ -509,7 +549,15 @@ func (bve *BlockVolumeExpandOperation) Exec(executor executors.Executor) error { logger.Info("executing expand of block volume %v in op:%v", bve.bvol.Info.Id, bve.op.Id) return newTryOnHosts(bvHosts).once().run(func(h string) error { - return bv.expandBlockVolumeExec(executor, hvname, bve.newSize, h) + err := executor.BlockVolumeExpand(h, hvname, bv.Info.Name, bve.newSize) + if _, ok := err.(*executors.VolumeDoesNotExistErr); ok { + logger.LogError("Block volume %v (%v) does not exist:", bv.Info.Id, bv.Info.Name) + return err + } else if err != nil { + logger.LogError("Unable to Expand volume: %v", err) + return err + } + return nil }) } @@ -579,7 +627,7 @@ func (bve *BlockVolumeExpandOperation) Clean(executor executors.Executor) error logger.Info("executing get info of block volume %v in op:%v", bve.bvol.Info.Id, bve.op.Id) err = newTryOnHosts(bvHosts).once().run(func(h string) error { - bvolInfo, err := bv.InfoBlockVolumeFromHost(executor, hvname, h) + bvolInfo, err := bv.BlockVolumeInfoFromHost(executor, hvname, h) if err != nil { return err } diff --git a/executors/cmdexec/block_volume.go b/executors/cmdexec/block_volume.go index 30d26d912d..008f0ec4a2 100644 --- a/executors/cmdexec/block_volume.go +++ b/executors/cmdexec/block_volume.go @@ -241,7 +241,7 @@ func (c *CmdExecutor) InfoBlockVolume(host string, blockhostingvolume string, type CliOutput struct { BlockName string `json:"NAME"` - blockHostingVolumeNameVolume string `json:"VOLUME"` + BlockHostingVolumeName string `json:"VOLUME"` Gbid string `json:"GBID"` Size string `json:"SIZE"` Ha int `json:"HA"` @@ -281,7 +281,7 @@ func (c *CmdExecutor) InfoBlockVolume(host string, blockhostingvolume string, blockVolumeInfo.BlockHosts = blockVolumeInfoExec.Portal blockVolumeInfo.GlusterNode = host - blockVolumeInfo.GlusterVolumeName = blockVolumeInfoExec.blockHostingVolumeNameVolume + blockVolumeInfo.GlusterVolumeName = blockVolumeInfoExec.BlockHostingVolumeName blockVolumeInfo.Hacount = blockVolumeInfoExec.Ha blockVolumeInfo.Iqn = "iqn.2016-12.org.gluster-block:" + blockVolumeInfoExec.Gbid blockVolumeInfo.Name = blockVolumeInfoExec.BlockName