diff --git a/docs/deploy-rbd.md b/docs/deploy-rbd.md index bdf47d6be17..29f64105859 100644 --- a/docs/deploy-rbd.md +++ b/docs/deploy-rbd.md @@ -63,6 +63,7 @@ make image-cephcsi | `mounter` | no | if set to `rbd-nbd`, use `rbd-nbd` on nodes that have `rbd-nbd` and `nbd` kernel modules to map rbd images | | `encrypted` | no | disabled by default, use `"true"` to enable LUKS encryption on PVC and `"false"` to disable it. **Do not change for existing storageclasses** | | `encryptionKMSID` | no | required if encryption is enabled and a kms is used to store passphrases | +| `thickProvision` | no | if set to `"true"`, newly created RBD images will be completely allocated by writing zeros to it | **NOTE:** An accompanying CSI configuration file, needs to be provided to the running pods. Refer to [Creating CSI configuration](../examples/README.md#creating-csi-configuration) diff --git a/examples/rbd/storageclass.yaml b/examples/rbd/storageclass.yaml index ce467293128..362780121b1 100644 --- a/examples/rbd/storageclass.yaml +++ b/examples/rbd/storageclass.yaml @@ -29,6 +29,9 @@ parameters: # eg: pool: rbdpool pool: + # Set thickProvision to true if you want RBD images to be fully allocated on + # creation (thin provisioning is the default). + thickProvision: "false" # (required) RBD image features, CSI creates image with image-format 2 # CSI RBD currently supports only `layering` feature. imageFeatures: layering diff --git a/internal/rbd/controllerserver.go b/internal/rbd/controllerserver.go index 0a5d418a56d..982b77467ca 100644 --- a/internal/rbd/controllerserver.go +++ b/internal/rbd/controllerserver.go @@ -19,6 +19,8 @@ package rbd import ( "context" "errors" + "fmt" + "strconv" csicommon "github.com/ceph/ceph-csi/internal/csi-common" "github.com/ceph/ceph-csi/internal/journal" @@ -116,6 +118,14 @@ func (cs *ControllerServer) parseVolCreateRequest(ctx context.Context, req *csi. return nil, status.Error(codes.InvalidArgument, err.Error()) } + tp := "thickProvision" + thick := req.GetParameters()[tp] + if thick != "" { + if rbdVol.ThickProvision, err = strconv.ParseBool(thick); err != nil { + return nil, fmt.Errorf("failed to parse %q: %w", tp, err) + } + } + rbdVol.RequestName = req.GetName() // Volume Size - Default is 1 GiB diff --git a/internal/rbd/rbd_util.go b/internal/rbd/rbd_util.go index 63a18c2b99d..ddc2fb17d3c 100644 --- a/internal/rbd/rbd_util.go +++ b/internal/rbd/rbd_util.go @@ -98,6 +98,7 @@ type rbdVolume struct { Encrypted bool readOnly bool Primary bool + ThickProvision bool KMS util.EncryptionKMS // Owner is the creator (tenant, Kubernetes Namespace) of the volume. Owner string