cephfs: round to cephfs size to multiple of 4Mib

Due to the bug in the df stat we need to round off
the subvolume size to align with 4Mib.

Note:- Minimum supported size in cephcsi is 1Mib,
we dont need to take care of Kib.

fixes #3240

More details at https://github.com/ceph/ceph/pull/46905

Signed-off-by: Madhu Rajanna <madhupr007@gmail.com>
This commit is contained in:
Madhu Rajanna 2022-07-12 14:19:25 +05:30 committed by mergify[bot]
parent 1856647506
commit f171143135
3 changed files with 68 additions and 2 deletions

View File

@ -277,7 +277,7 @@ func (cs *ControllerServer) CreateVolume(
defer volOptions.Destroy() defer volOptions.Destroy()
if req.GetCapacityRange() != nil { if req.GetCapacityRange() != nil {
volOptions.Size = util.RoundOffBytes(req.GetCapacityRange().GetRequiredBytes()) volOptions.Size = util.RoundOffCephFSVolSize(req.GetCapacityRange().GetRequiredBytes())
} }
parentVol, pvID, sID, err := checkContentSource(ctx, req, cr) parentVol, pvID, sID, err := checkContentSource(ctx, req, cr)
@ -672,7 +672,8 @@ func (cs *ControllerServer) ControllerExpandVolume(
return nil, status.Error(codes.InvalidArgument, "cannot expand snapshot-backed volume") return nil, status.Error(codes.InvalidArgument, "cannot expand snapshot-backed volume")
} }
RoundOffSize := util.RoundOffBytes(req.GetCapacityRange().GetRequiredBytes()) RoundOffSize := util.RoundOffCephFSVolSize(req.GetCapacityRange().GetRequiredBytes())
volClient := core.NewSubVolume(volOptions.GetConnection(), &volOptions.SubVolume, volOptions.ClusterID) volClient := core.NewSubVolume(volOptions.GetConnection(), &volOptions.SubVolume, volOptions.ClusterID)
if err = volClient.ResizeVolume(ctx, RoundOffSize); err != nil { if err = volClient.ResizeVolume(ctx, RoundOffSize); err != nil {
log.ErrorLog(ctx, "failed to expand volume %s: %v", fsutil.VolumeID(volIdentifier.FsSubvolName), err) log.ErrorLog(ctx, "failed to expand volume %s: %v", fsutil.VolumeID(volIdentifier.FsSubvolName), err)

View File

@ -58,6 +58,22 @@ func RoundOffBytes(bytes int64) int64 {
return num return num
} }
// RoundOffCephFSVolSize rounds up the bytes to 4MiB if the request is less
// than 4MiB or if its greater it rounds up to multiple of 4MiB.
func RoundOffCephFSVolSize(bytes int64) int64 {
// Minimum supported size is 1MiB in CephCSI, if the request is <4MiB,
// round off to 4MiB.
if bytes < helpers.MiB {
return 4 * helpers.MiB
}
bytes /= helpers.MiB
bytes = int64(math.Ceil(float64(bytes)/4) * 4)
return RoundOffBytes(bytes * helpers.MiB)
}
// variables which will be set during the build time. // variables which will be set during the build time.
var ( var (
// GitCommit tell the latest git commit image is built from. // GitCommit tell the latest git commit image is built from.

View File

@ -352,3 +352,52 @@ func TestCheckKernelSupport(t *testing.T) {
} }
} }
} }
func TestRoundOffCephFSVolSize(t *testing.T) {
t.Parallel()
tests := []struct {
name string
size int64
want int64
}{
{
"1000kiB conversion",
1000,
4194304, // 4 MiB
},
{
"1MiB conversions",
1048576,
4194304, // 4 MiB
},
{
"1.5Mib conversion",
1677722,
4194304, // 4 MiB
},
{
"1023MiB conversion",
1072693248,
1073741824, // 1024 MiB
},
{
"1.5GiB conversion",
1585446912,
2147483648, // 2 GiB
},
{
"1555MiB conversion",
1630535680,
2147483648, // 2 GiB
},
}
for _, tt := range tests {
ts := tt
t.Run(ts.name, func(t *testing.T) {
t.Parallel()
if got := RoundOffCephFSVolSize(ts.size); got != ts.want {
t.Errorf("RoundOffCephFSVolSize() = %v, want %v", got, ts.want)
}
})
}
}