Uploaded image for project: 'OpenShift Virtualization'
  1. OpenShift Virtualization
  2. CNV-15431

[2033191] Cloning a Block DV to VM with Filesystem with not big enough size comes to endless loop - using pvc api

XMLWordPrintable

    • Medium

      Created attachment 1846503 [details]
      full-log-and-o-yamls-of-pvc-and-vm

      Created attachment 1846503 [details]
      full-log-and-o-yamls-of-pvc-and-vm

      Description of problem:
      Cloning a Block DV to VM with Filesystem with not big enough size comes to endless loop - using pvc api

      Version-Release number of selected component (if applicable):
      4.10, 4.9, 4.8

      How reproducible:
      Always

      Steps to Reproduce:
      1. Create DV with Block volume mode, size: 30Gi.
      2. Create a VM with Filesystem volume mode from this DV, size: 30Gi.
      3. See that VM's DV import restarts over and over, with no clear error message (except in the log).

      Actual results:
      The endless loop of attempts to clone

      Expected results:
      If the target size is too small (considering overhead),
      we should either get a clear error message before starting to clone/import or
      resize requested pvc size.

      Additional info:
      This doesn't happen when using 'storage' api for target vm:
      dataVolumeTemplates:
      spec:
      storage:

      Source dv and target vm yamls:
      $ cat dv-src.yaml
      apiVersion: cdi.kubevirt.io/v1alpha1
      kind: DataVolume
      metadata:
      namespace: "openshift-virtualization-os-images"
      name: cirros-dv
      spec:
      source:
      http:
      url: "http://.../rhel-images/rhel-83.qcow2"
      secretRef: ""
      pvc:
      accessModes:

      • ReadWriteOnce
        resources:
        requests:
        storage: 30Gi
        storageClassName: ocs-storagecluster-ceph-rbd
        volumeMode: Block

      $ cat vm-dv-clone-30.yaml
      apiVersion: kubevirt.io/v1
      kind: VirtualMachine
      metadata:
      labels:
      kubevirt.io/vm: vm-dv-clone
      name: vm-dv-clone
      spec:
      running: true
      template:
      metadata:
      labels:
      kubevirt.io/vm: vm-dv-clone
      spec:
      domain:
      devices:
      disks:

      • disk:
        bus: virtio
        name: root-disk
        resources:
        requests:
        memory: 64M
        volumes:
      • dataVolume:
        name: target-dv-vm-clone
        name: root-disk
        dataVolumeTemplates:
      • metadata:
        name: target-dv-vm-clone
        spec:
        pvc:
        storageClassName: hostpath-provisioner
        volumeMode: Filesystem
        accessModes:
      • ReadWriteOnce
        resources:
        requests:
        storage: 30Gi
        source:
        pvc:
        namespace: "openshift-virtualization-os-images"
        name: "cirros-dv"

      $ oc get pvc -A
      NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
      default target-dv-vm-clone Bound pvc-243763c7-e0e4-45bc-903c-853525139eb3 68Gi RWO hostpath-provisioner 14m
      openshift-storage ocs-deviceset-0-data-0cb4kz Bound local-pv-c63a60c0 70Gi RWO local-block 10h
      openshift-storage ocs-deviceset-0-data-1cxt7d Bound local-pv-a82afe98 70Gi RWO local-block 10h
      openshift-storage ocs-deviceset-0-data-2vvt2x Bound local-pv-f3ca87ab 70Gi RWO local-block 10h
      openshift-virtualization-os-images cirros-dv Bound pvc-87536c65-b6dd-4898-a5dc-dca020b5d74c 30Gi RWO ocs-storagecluster-ceph-rbd 17m

      $ oc logs cdi-upload-target-dv-vm-clone
      I1216 07:01:31.857162 1 uploadserver.go:69] Running server on 0.0.0.0:8443
      I1216 07:01:51.261542 1 uploadserver.go:374] Content type header is "blockdevice-clone"
      I1216 07:01:51.261636 1 data-processor.go:340] Calculating available size
      I1216 07:01:51.261767 1 data-processor.go:352] Checking out file system volume size.
      I1216 07:01:51.261803 1 data-processor.go:360] Request image size not empty.
      I1216 07:01:51.261828 1 data-processor.go:365] Target size 30Gi.
      I1216 07:01:51.262002 1 data-processor.go:243] New phase: TransferDataFile
      I1216 07:01:51.262161 1 util.go:174] Writing data...
      I1216 07:04:57.516880 1 data-processor.go:243] New phase: Resize
      W1216 07:04:57.692691 1 data-processor.go:322] Available space less than requested size, resizing image to available space 30440161280.
      I1216 07:04:57.692708 1 data-processor.go:330] Calculated new size is < than current size, not resizing: requested size 30440161280, virtual size: 32212254720.
      I1216 07:04:57.692719 1 data-processor.go:249] Validating image
      E1216 07:04:57.895010 1 data-processor.go:240] Virtual image size 32212254720 is larger than available size 30440580710 (PVC size 32212254720, reserved overhead 0.055000%). A larger PVC is required.
      Unable to resize disk image to requested size
      kubevirt.io/containerized-data-importer/pkg/importer.(*DataProcessor).ProcessDataWithPause
      /remote-source/app/pkg/importer/data-processor.go:229
      kubevirt.io/containerized-data-importer/pkg/importer.(*DataProcessor).ProcessData
      /remote-source/app/pkg/importer/data-processor.go:172
      kubevirt.io/containerized-data-importer/pkg/uploadserver.newUploadStreamProcessor
      /remote-source/app/pkg/uploadserver/uploadserver.go:439
      kubevirt.io/containerized-data-importer/pkg/uploadserver.(*uploadServerApp).processUpload
      /remote-source/app/pkg/uploadserver/uploadserver.go:381
      kubevirt.io/containerized-data-importer/pkg/uploadserver.(*uploadServerApp).uploadHandler.func1
      /remote-source/app/pkg/uploadserver/uploadserver.go:407
      net/http.HandlerFunc.ServeHTTP
      /usr/lib/golang/src/net/http/server.go:2049
      net/http.(*ServeMux).ServeHTTP
      /usr/lib/golang/src/net/http/server.go:2428
      kubevirt.io/containerized-data-importer/pkg/uploadserver.(*uploadServerApp).ServeHTTP
      /remote-source/app/pkg/uploadserver/uploadserver.go:256
      net/http.serverHandler.ServeHTTP
      /usr/lib/golang/src/net/http/server.go:2867
      net/http.(*conn).serve
      /usr/lib/golang/src/net/http/server.go:1932
      runtime.goexit
      /usr/lib/golang/src/runtime/asm_amd64.s:1371
      E1216 07:04:57.895161 1 uploadserver.go:387] Saving stream failed: Unable to resize disk image to requested size: Virtual image size 32212254720 is larger than available size 30440580710 (PVC size 32212254720, reserved overhead 0.055000%). A larger PVC is required.
      I1216 07:04:59.676727 1 uploadserver.go:374] Content type header is "blockdevice-clone"
      I1216 07:04:59.676820 1 data-processor.go:340] Calculating available size
      E1216 07:04:59.678141 1 data-processor.go:344] exit status 1, blockdev: ioctl error on BLKGETSIZE64: Inappropriate ioctl for device
      I1216 07:04:59.678160 1 data-processor.go:352] Checking out file system volume size.
      I1216 07:04:59.678172 1 data-processor.go:360] Request image size not empty.
      I1216 07:04:59.678181 1 data-processor.go:365] Target size 30Gi.
      I1216 07:04:59.678275 1 util.go:39] deleting file: /data/disk.img
      I1216 07:04:59.899644 1 data-processor.go:243] New phase: TransferDataFile
      I1216 07:04:59.899811 1 util.go:174] Writing data...
      I1216 07:07:36.388073 1 data-processor.go:243] New phase: Resize
      W1216 07:07:36.574707 1 data-processor.go:322] Available space less than requested size, resizing image to available space 30440161280.
      I1216 07:07:36.574733 1 data-processor.go:330] Calculated new size is < than current size, not resizing: requested size 30440161280, virtual size: 32212254720.
      I1216 07:07:36.574743 1 data-processor.go:249] Validating image
      E1216 07:07:36.767359 1 data-processor.go:240] Virtual image size 32212254720 is larger than available size 30440580710 (PVC size 32212254720, reserved overhead 0.055000%). A larger PVC is required.
      Unable to resize disk image to requested size
      kubevirt.io/containerized-data-importer/pkg/importer.(*DataProcessor).ProcessDataWithPause
      /remote-source/app/pkg/importer/data-processor.go:229
      kubevirt.io/containerized-data-importer/pkg/importer.(*DataProcessor).ProcessData
      /remote-source/app/pkg/importer/data-processor.go:172
      kubevirt.io/containerized-data-importer/pkg/uploadserver.newUploadStreamProcessor
      /remote-source/app/pkg/uploadserver/uploadserver.go:439
      kubevirt.io/containerized-data-importer/pkg/uploadserver.(*uploadServerApp).processUpload
      /remote-source/app/pkg/uploadserver/uploadserver.go:381
      kubevirt.io/containerized-data-importer/pkg/uploadserver.(*uploadServerApp).uploadHandler.func1
      /remote-source/app/pkg/uploadserver/uploadserver.go:407
      net/http.HandlerFunc.ServeHTTP
      /usr/lib/golang/src/net/http/server.go:2049
      net/http.(*ServeMux).ServeHTTP
      /usr/lib/golang/src/net/http/server.go:2428
      kubevirt.io/containerized-data-importer/pkg/uploadserver.(*uploadServerApp).ServeHTTP
      /remote-source/app/pkg/uploadserver/uploadserver.go:256
      net/http.serverHandler.ServeHTTP
      /usr/lib/golang/src/net/http/server.go:2867
      net/http.(*conn).serve
      /usr/lib/golang/src/net/http/server.go:1932
      runtime.goexit
      /usr/lib/golang/src/runtime/asm_amd64.s:1371

      P.S. It would be great to edit the message in the log "reserved overhead 0.055000%" so it'll be either 5.5% or 0.055000 (without %)

            mrashish Maya Rashish (Inactive)
            jpeimer@redhat.com Jenia Peimer
            Jenia Peimer Jenia Peimer
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: