mirror of
https://github.com/ceph/ceph-csi.git
synced 2025-06-14 02:43:36 +00:00
rbd: support QoS based on capacity for rbd volume
1. QoS provides settings for rbd volume read/write iops and read/write bandwidth. 2. All QoS parameters are placed in the SC, send QoS parameters from SC to Cephcsi through PVC create request. 3. We need provide QoS parameters in the SC as below: - BaseReadIops - BaseWriteIops - BaseReadBytesPerSecond - BaseWriteBytesPerSecond - ReadIopsPerGB - WriteIopsPerGB - ReadBpsPerGB - WriteBpsPerGB - BaseVolSizeBytes There are 4 base qos parameters among them, when users apply for a volume capacity equal to or less than BaseVolSizebytes, use base qos limit. For the portion of capacity exceeding BaseVolSizebytes, QoS will be increased in steps set per GB. If the step size parameter per GB is not provided, only base QoS limit will be used and not associated with capacity size. 4. If PVC has resize request, adjust the QoS limit according to the QoS parameters after resizing. Signed-off-by: Yite Gu <guyite@bytedance.com>
This commit is contained in:
@ -231,6 +231,12 @@ func (cs *ControllerServer) parseVolCreateRequest(
|
||||
return nil, status.Error(codes.InvalidArgument, err.Error())
|
||||
}
|
||||
|
||||
// Get QosParameters from SC if qos configuration existing in SC
|
||||
err = rbdVol.SetQOS(ctx, req.GetParameters())
|
||||
if err != nil {
|
||||
return nil, status.Error(codes.InvalidArgument, err.Error())
|
||||
}
|
||||
|
||||
err = rbdVol.Connect(cr)
|
||||
if err != nil {
|
||||
log.ErrorLog(ctx, "failed to connect to volume %v: %v", rbdVol.RbdImageName, err)
|
||||
@ -415,7 +421,7 @@ func (cs *ControllerServer) CreateVolume(
|
||||
}
|
||||
}()
|
||||
|
||||
err = cs.createBackingImage(ctx, cr, req.GetSecrets(), rbdVol, parentVol, rbdSnap)
|
||||
err = cs.createBackingImage(ctx, cr, req.GetSecrets(), rbdVol, parentVol, rbdSnap, req.GetParameters())
|
||||
if err != nil {
|
||||
if errors.Is(err, ErrFlattenInProgress) {
|
||||
return nil, status.Error(codes.Aborted, err.Error())
|
||||
@ -732,6 +738,7 @@ func (cs *ControllerServer) createBackingImage(
|
||||
secrets map[string]string,
|
||||
rbdVol, parentVol *rbdVolume,
|
||||
rbdSnap *rbdSnapshot,
|
||||
scParams map[string]string,
|
||||
) error {
|
||||
var err error
|
||||
|
||||
@ -786,6 +793,21 @@ func (cs *ControllerServer) createBackingImage(
|
||||
return status.Error(codes.Internal, err.Error())
|
||||
}
|
||||
|
||||
// Apply Qos parameters to rbd image.
|
||||
err = rbdVol.ApplyQOS(ctx)
|
||||
if err != nil {
|
||||
log.ErrorLog(ctx, "failed to apply QOS for rbd image: %s with error: %v", rbdVol, err)
|
||||
|
||||
return status.Error(codes.Internal, err.Error())
|
||||
}
|
||||
// Save Qos parameters from SC in Image metadata, we will use it while resize volume.
|
||||
err = rbdVol.SaveQOS(ctx, scParams)
|
||||
if err != nil {
|
||||
log.ErrorLog(ctx, "failed to save QOS for rbd image: %s with error: %v", rbdVol, err)
|
||||
|
||||
return status.Error(codes.Internal, err.Error())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -1602,6 +1624,13 @@ func (cs *ControllerServer) ControllerExpandVolume(
|
||||
if err != nil {
|
||||
log.ErrorLog(ctx, "failed to resize rbd image: %s with error: %v", rbdVol, err)
|
||||
|
||||
return nil, status.Error(codes.Internal, err.Error())
|
||||
}
|
||||
// adjust rbd qos after resize volume.
|
||||
err = rbdVol.AdjustQOS(ctx)
|
||||
if err != nil {
|
||||
log.ErrorLog(ctx, "failed to adjust QOS for rbd image: %s with error: %v", rbdVol, err)
|
||||
|
||||
return nil, status.Error(codes.Internal, err.Error())
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user