feat(mastercli): hybrid cloud vol.volStorageClass can be changed by "cfs-cli volume update"

Signed-off-by: true1064 <tangjingyu@oppo.com>
This commit is contained in:
true1064 2023-11-28 11:32:36 +08:00 committed by AmazingChi
parent 347208f189
commit 7a7b663b6c
6 changed files with 49 additions and 1 deletions

View File

@ -304,6 +304,8 @@ func newVolUpdateCmd(client *master.MasterClient) *cobra.Command {
var optTrashInterval int64
var optAccessTimeValidInterval int64
var optEnablePersistAccessTime string
var optVolStorageClass int
confirmString := strings.Builder{}
var vv *proto.SimpleVolView
cmd := &cobra.Command{
@ -662,6 +664,21 @@ func newVolUpdateCmd(client *master.MasterClient) *cobra.Command {
confirmString.WriteString(fmt.Sprintf(" EnableAutoDpMetaRepair : %v", vv.EnableAutoDpMetaRepair))
}
if optVolStorageClass != 0 {
if !proto.IsValidStorageClass(uint32(optVolStorageClass)) {
err = fmt.Errorf("invalid param VolStorageClass: %v\n", optVolStorageClass)
return
}
isChange = true
confirmString.WriteString(fmt.Sprintf(" VolStorageClass : %v -> %v\n",
vv.VolStorageClass, optVolStorageClass))
vv.VolStorageClass = uint32(optVolStorageClass)
} else {
confirmString.WriteString(fmt.Sprintf(" VolStorageClass : %v\n",
proto.StorageClassString(vv.VolStorageClass)))
}
if err != nil {
return
}
@ -721,6 +738,7 @@ func newVolUpdateCmd(client *master.MasterClient) *cobra.Command {
cmd.Flags().Int64Var(&optDeleteLockTime, CliFlagDeleteLockTime, -1, "Specify delete lock time[Unit: hour] for volume")
cmd.Flags().StringVar(&clientIDKey, CliFlagClientIDKey, client.ClientIDKey(), CliUsageClientIDKey)
cmd.Flags().StringVar(&optEnableDpAutoMetaRepair, CliFlagAutoDpMetaRepair, "", "Enable or disable dp auto meta repair")
cmd.Flags().IntVar(&optVolStorageClass, CliFlagVolStorageClass, 0, "specify volStorageClass")
cmd.Flags().Int64Var(&optTrashInterval, CliFlagTrashInterval, -1, "The retention period for files in trash")
cmd.Flags().Int64Var(&optAccessTimeValidInterval, CliFlagAccessTimeValidInterval, -1, "Effective time interval for accesstime, at least 1800 [Unit: second]")

View File

@ -419,6 +419,7 @@ type updateVolReq struct {
enableAutoDpMetaRepair bool
accessTimeValidInterval int64
enablePersistAccessTime bool
volStorageClass uint32
}
func parseColdVolUpdateArgs(r *http.Request, vol *Vol) (args *coldVolArgs, err error) {
@ -579,6 +580,31 @@ func parseVolUpdateReq(r *http.Request, vol *Vol, req *updateVolReq) (err error)
req.dpSelectorParm = vol.dpSelectorParm
}
if req.volStorageClass, err = extractUint32WithDefault(r, volStorageClassKey, vol.volStorageClass); err != nil {
err = fmt.Errorf("failed to extract key: %v", volStorageClassKey)
log.LogErrorf("[parseVolUpdateReq] err: %v", err.Error())
return
}
if vol.volStorageClass == proto.StorageClass_BlobStore {
if req.volStorageClass != vol.volStorageClass {
err = fmt.Errorf(" vol.volStorageClass is StorageClass_BlobStore, not allow to change it")
log.LogErrorf("[parseVolUpdateReq] err: %v", err.Error())
return
}
} else if proto.IsStorageClassReplica(vol.volStorageClass) {
if !proto.IsStorageClassReplica(req.volStorageClass) {
err = fmt.Errorf(" vol.volStorageClass is replica, not allow to change to: %v",
proto.StorageClassString(req.volStorageClass))
log.LogErrorf("[parseVolUpdateReq] err: %v", err.Error())
return
}
if req.volStorageClass != vol.volStorageClass {
log.LogInfof("[parseVolUpdateReq] vol.volStorageClass(%v) will be changed to: %v",
proto.StorageClassString(vol.volStorageClass), proto.StorageClassString(req.volStorageClass))
}
}
if proto.IsCold(vol.VolType) {
req.followerRead = true
req.coldArgs, err = parseColdVolUpdateArgs(r, vol)

View File

@ -2352,6 +2352,7 @@ func (m *Server) updateVol(w http.ResponseWriter, r *http.Request) {
newArgs.dpReplicaNum = uint8(req.replicaNum)
newArgs.dpReadOnlyWhenVolFull = req.dpReadOnlyWhenVolFull
newArgs.enableAutoDpMetaRepair = req.enableAutoDpMetaRepair
newArgs.volStorageClass = req.volStorageClass
log.LogWarnf("[updateVolOut] name [%s], z1 [%s], z2[%s] replicaNum[%v]", req.name, req.zoneName, vol.Name, req.replicaNum)
if err = m.cluster.updateVol(req.name, req.authKey, newArgs); err != nil {

View File

@ -3411,7 +3411,6 @@ func (c *Cluster) deleteMetaNodeFromCache(metaNode *MetaNode) {
go metaNode.clean()
}
//TODO:tangjingyu: need to update volStorageClass or allowedStorageClass?
func (c *Cluster) updateVol(name, authKey string, newArgs *VolVarargs) (err error) {
var (
vol *Vol

View File

@ -57,6 +57,7 @@ type VolVarargs struct {
enableAutoDpMetaRepair bool
accessTimeValidInterval int64
enablePersistAccessTime bool
volStorageClass uint32
}
type CacheSubItem struct {
@ -1697,6 +1698,7 @@ func setVolFromArgs(args *VolVarargs, vol *Vol) {
vol.AccessTimeInterval = args.accessTimeInterval
vol.EnableAutoMetaRepair.Store(args.enableAutoDpMetaRepair)
vol.EnablePersistAccessTime = args.enablePersistAccessTime
vol.volStorageClass = args.volStorageClass
}
func getVolVarargs(vol *Vol) *VolVarargs {
@ -1739,6 +1741,7 @@ func getVolVarargs(vol *Vol) *VolVarargs {
trashInterval: vol.TrashInterval,
enablePersistAccessTime: vol.EnablePersistAccessTime,
enableAutoDpMetaRepair: vol.EnableAutoMetaRepair.Load(),
volStorageClass: vol.volStorageClass,
}
}

View File

@ -299,6 +299,7 @@ func (api *AdminAPI) UpdateVolume(
request.addParam("trashInterval", strconv.FormatInt(vv.TrashInterval, 10))
request.addParam("accessTimeValidInterval", strconv.FormatInt(vv.AccessTimeInterval, 10))
request.addParam("enablePersistAccessTime", strconv.FormatBool(vv.EnablePersistAccessTime))
request.addParam("volStorageClass", strconv.FormatUint(uint64(vv.VolStorageClass), 10))
if txMask != "" {
request.addParam("enableTxMask", txMask)