Bug 1650175

Summary: block-commit can't be used with -blockdev [rhel-7.6.z]
Product: Red Hat Enterprise Linux 7 Reporter: Oneata Mircea Teodor <toneata>
Component: qemu-kvm-rhevAssignee: Kevin Wolf <kwolf>
Status: CLOSED ERRATA QA Contact: aihua liang <aliang>
Severity: high Docs Contact:
Priority: high    
Version: 7.5CC: aliang, areis, chayang, coli, guillaume.pavese, jsuchane, juzhang, kwolf, michen, mtessun, ngu, pingl, pkrempa, virt-maint
Target Milestone: rcKeywords: ZStream
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: qemu-kvm-rhev-2.12.0-18.el7_6.3 Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of: 1623986 Environment:
Last Closed: 2019-01-29 18:32:27 UTC Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On: 1623986    
Bug Blocks:    

Description Oneata Mircea Teodor 2018-11-15 14:15:57 UTC
This bug has been copied from bug #1623986 and has been proposed to be backported to 7.6 z-stream (EUS).

Comment 3 Miroslav Rezanina 2018-12-06 07:40:10 UTC
Fix included in qemu-kvm-rhev-2.12.0-18.el7_6.3

Comment 6 aihua liang 2019-01-16 09:46:01 UTC
Test env:
  kernel version:3.10.0-957.1.3.el7.x86_64
  qemu-kvm-rhev version:qemu-kvm-rhev-2.12.0-18.el7_6.3.x86_64

For reproduce: 
 test step:
  step1.Create 3 images offline:
    #qemu-img create -f qcow2 base 1G
    #qemu-img create -f qcow2 /home/atest/sn1 1G
    #qemu-img create -f qcow2 /home/atest/sn2 1G

  step2.Start qemu with snapshot chain: base->sn1->sn2
     /usr/libexec/qemu-kvm \
    -blockdev driver=file,node-name=file_base,filename=/home/atest/base,read-only=on \
    -blockdev driver=qcow2,file=file_base,node-name=base,read-only=on \
    -blockdev driver=file,node-name=file_sn1,filename=/home/atest/sn1,read-only=on \
    -blockdev driver=qcow2,file=file_sn1,node-name=sn1,read-only=on,backing=base \
    -blockdev driver=file,node-name=file_sn2,filename=/home/atest/sn2 \
    -blockdev driver=qcow2,file=file_sn2,node-name=sn2,backing=sn1 \
    -qmp tcp:0:5000,server,nowait \
    -monitor stdio \
    -vnc :0 \

  step3.Do block mirror: sn1->base
    {'execute': 'block-commit', 'arguments': { 'device':'sn2','base-node':'base','top-node':'sn1','job-id':'j1'}}
  
 test result:
  after step3:
    block-commit failed with following info:
    {"timestamp": {"seconds": 1547605428, "microseconds": 437870}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "j1"}}
    {"timestamp": {"seconds": 1547605428, "microseconds": 438245}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "j1"}}
    {"error": {"class": "GenericError", "desc": "Block node is read-only"}}


For verify:
  1.backend:localfs
    test steps:
     step1: same with reproduce step1

     step2: Start qemu with snapshot chain: base->sn1->sn2
     /usr/libexec/qemu-kvm \
      -blockdev driver=file,node-name=file_base,filename=/home/atest/base,auto-read-only=on \
      -blockdev driver=qcow2,file=file_base,node-name=base,auto-read-only=on \
      -blockdev driver=file,node-name=file_sn1,filename=/home/atest/sn1,auto-read-only=on \
      -blockdev driver=qcow2,file=file_sn1,node-name=sn1,read-only=on,backing=base \
      -blockdev driver=file,node-name=file_sn2,filename=/home/atest/sn2 \
      -blockdev driver=qcow2,file=file_sn2,node-name=sn2,backing=sn1 \
      -qmp tcp:0:5000,server,nowait \
      -monitor stdio \
      -vnc :0 \

     step3: same with reproduce step3
   
   test result:
     block commit executed successfully.
       {"timestamp": {"seconds": 1547606177, "microseconds": 966791}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "j1"}}
       {"timestamp": {"seconds": 1547606177, "microseconds": 967306}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "j1"}}
       {"return": {}}
       {"timestamp": {"seconds": 1547606177, "microseconds": 982351}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "j1"}}
       {"timestamp": {"seconds": 1547606177, "microseconds": 982409}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "j1"}}
       {"timestamp": {"seconds": 1547606177, "microseconds": 982900}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "j1", "len": 1073741824, "offset": 1073741824, "speed": 0, "type": "commit"}}
       {"timestamp": {"seconds": 1547606177, "microseconds": 982964}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "j1"}}
       {"timestamp": {"seconds": 1547606177, "microseconds": 982999}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "j1"}}

 2.backend:rbd
    test steps:
     step1: create 3 images
      # qemu-img create -f raw rbd:rbd/sn1_r:mon_host=10.66.144.31 1G
      # qemu-img create -f qcow2 /home/atest/sn1 1G
      # qemu-img create -f qcow2 /home/atest/sn2 1G

     step2: Start qemu with snapshot chain: base->sn1->sn2
       -blockdev driver=rbd,node-name=file_base,pool=rbd,image=base,server.0.host=10.66.144.31,server.0.port=6789,auto-read-only=on \
       -blockdev driver=raw,file=file_base,node-name=base,auto-read-only=on \
       -blockdev driver=file,node-name=file_sn1,filename=/home/atest/sn1,auto-read-only=on \
       -blockdev driver=qcow2,file=file_sn1,node-name=sn1,auto-read-only=on,backing=base \
       -blockdev driver=file,node-name=file_sn2,filename=/home/atest/sn2 \
       -blockdev driver=qcow2,file=file_sn2,node-name=sn2,backing=sn1 \
       

     step3: same with reproduce step3
   
   test result:
     block commit executed successfully.

  3.backend:ndb
    test steps:
      step1: create 3 images
       (nbd server)#qemu-img create -f raw base 1G; qemu-nbd -f raw base -p 9000 -t
       # qemu-img create -f qcow2 /home/atest/sn1 1G
       # qemu-img create -f qcow2 /home/atest/sn2 1G
      
      step2: Start qemu with snapshot chain: base->sn1->sn2
       -blockdev driver=nbd,node-name=file_base,server.host=10.73.73.83,server.port=9000,server.type=inet,auto-read-only=on \
       -blockdev driver=raw,file=file_base,node-name=base,auto-read-only=on \
       -blockdev driver=file,node-name=file_sn1,filename=/home/atest/sn1,auto-read-only=on \
       -blockdev driver=qcow2,file=file_sn1,node-name=sn1,auto-read-only=on,backing=base \
       -blockdev driver=file,node-name=file_sn2,filename=/home/atest/sn2 \
       -blockdev driver=qcow2,file=file_sn2,node-name=sn2,backing=sn1 \

      step3: same with reproduce step3

    test result:
      block commit executed successfully.

  4.backend:gluster
     test steps:
      step1: create 3 images
       # qemu-img create -f qcow2 gluster://gluster-virt-qe-01.lab.eng.pek2.redhat.com/vol0/base 1G
       # qemu-img create -f qcow2 /home/atest/sn1 1G
       # qemu-img create -f qcow2 /home/atest/sn2 1G
      
      step2: Start qemu with snapshot chain: base->sn1->sn2
       -blockdev driver=gluster,node-name=file_base,server.0.type=inet,server.0.host=gluster-virt-qe-01.lab.eng.pek2.redhat.com,server.0.port=24007,volume=vol0,path=base,auto-read-only=on \
       -blockdev driver=qcow2,file=file_base,node-name=base,auto-read-only=on \
       -blockdev driver=file,node-name=file_sn1,filename=/home/atest/sn1,auto-read-only=on \
       -blockdev driver=qcow2,file=file_sn1,node-name=sn1,auto-read-only=on,backing=base \
       -blockdev driver=file,node-name=file_sn2,filename=/home/atest/sn2 \
       -blockdev driver=qcow2,file=file_sn2,node-name=sn2,backing=sn1 \

      step3: same with reproduce step3

    test result:
      block commit executed successfully.
  
  5.backend:iscsi
     step1: create 2 images
       # qemu-img create -f qcow2 gluster://gluster-virt-qe-01.lab.eng.pek2.redhat.com/vol0/base 1G
       # qemu-img create -f qcow2 /home/atest/sn1 1G
       # qemu-img create -f qcow2 /home/atest/sn2 1G
      
      step2: Start qemu with snapshot chain: base->sn1->sn2
       -blockdev driver=iscsi,node-name=file_base,transport=tcp,portal=10.73.73.83,target=iqn.2018-02.com.example:t1,lun=0,auto-read-only=on \
       -blockdev driver=raw,file=file_base,node-name=base,auto-read-only=on \
       -blockdev driver=file,node-name=file_sn1,filename=/home/atest/sn1,auto-read-only=on \
       -blockdev driver=qcow2,file=file_sn1,node-name=sn1,auto-read-only=on,backing=base \
       -blockdev driver=file,node-name=file_sn2,filename=/home/atest/sn2 \
       -blockdev driver=qcow2,file=file_sn2,node-name=sn2,backing=sn1 \

      step3: same with reproduce step3

    test result:
      block commit executed successfully.

Comment 7 aihua liang 2019-01-17 03:25:51 UTC
  Continue:
    6.backend:curl
      driver: https
        step1: create 3 images
         (https server)# qemu-img create -f qcow2 base 1G
         # qemu-img create -f qcow2 /home/atest/sn1 1G
         # qemu-img create -f qcow2 /home/atest/sn2 1G
      
        step2: start qemu with snapshot chain: base->sn1->sn2
         -blockdev driver=iscsi,node-name=file_base,driver=https,sslverify=off,url=https://10.73.224.153/base,read-only=on,auto-read-only=on \
         -blockdev driver=raw,file=file_base,node-name=base,auto-read-only=on \
         -blockdev driver=file,node-name=file_sn1,filename=/home/atest/sn1,auto-read-only=on \
         -blockdev driver=qcow2,file=file_sn1,node-name=sn1,auto-read-only=on,backing=base \
         -blockdev driver=file,node-name=file_sn2,filename=/home/atest/sn2 \
         -blockdev driver=qcow2,file=file_sn2,node-name=sn2,backing=sn1 \

    test result:
         qemu-kvm: -blockdev driver=https,node-name=file_base,sslverify=off,url=https://10.73.224.153/base,auto-read-only=on: Driver 'https' can only be used for read-only devices

     driver: http
      test steps:
        step1: same as step1 above
        step2: start qemu with snapshot chain: base->sn1->sn2
         -blockdev driver=iscsi,node-name=file_base,driver=http,url=https://10.73.224.153/base,read-only=on,auto-read-only=on \
         -blockdev driver=raw,file=file_base,node-name=base,auto-read-only=on \
         -blockdev driver=file,node-name=file_sn1,filename=/home/atest/sn1,auto-read-only=on \
         -blockdev driver=qcow2,file=file_sn1,node-name=sn1,auto-read-only=on,backing=base \
         -blockdev driver=file,node-name=file_sn2,filename=/home/atest/sn2 \
         -blockdev driver=qcow2,file=file_sn2,node-name=sn2,backing=sn1 \
    
      test result:
         qemu start failed with info:
           qemu-kvm: -blockdev driver=http,node-name=file_base,url=http://10.73.224.153/base,read-only=on: Driver 'http' is not whitelisted
         But check img info via http success:
           qemu-img info 'json:{"file.driver":"http", "file.url":"http://10.73.224.153/base"}
           > '
             image: json:{"driver": "qcow2", "file": {"url": "http://10.73.224.153/base", "driver": "http"}}
             file format: qcow2
             virtual size: 1.0G (1073741824 bytes)
             disk size: unavailable
             cluster_size: 65536
             Format specific information:
               compat: 1.1
               lazy refcounts: false
               refcount bits: 16
               corrupt: false


Hi,John

  In your patch comment:
    curl: Support auto-read-only option

  But from my test result, curl only support read-only for https and http isn't whitelisted.
  Please help to check if my usage of "auto-read-only" for curl corret?

Thanks,
aliang

Comment 9 aihua liang 2019-01-17 03:37:21 UTC
Sorry for the mistake in comment 8, correct typo in comment 7 as bellow:
  -blockdev driver=iscsi,node-name=file_base,driver=https,sslverify=off,url=https://10.73.224.153/base,read-only=on,auto-read-only=on \
  -blockdev driver=raw,file=file_base,node-name=base,auto-read-only=on \
--->
  -blockdev node-name=file_base,driver=https,sslverify=off,url=https://10.73.224.153/base,auto-read-only=on \
  -blockdev driver=qcow2,file=file_base,node-name=base,auto-read-only=on \

  -blockdev driver=iscsi,node-name=file_base,driver=http,url=http://10.73.224.153/base,read-only=on,auto-read-only=on \
  -blockdev driver=raw,file=file_base,node-name=base,auto-read-only=on \
---->
  -blockdev node-name=file_base,driver=http,url=http://10.73.224.153/base,read-only=on \
  -blockdev driver=qcow2,file=file_base,node-name=base,read-only=on \

Comment 11 aihua liang 2019-01-18 07:19:44 UTC
Verify on qemu-kvm-rhev-2.12.0-18.el7_6.3.x86_64, no serious bug exist with param "auto-read-only=on"

For curl+ auto-read-only=on issue, will open a new bug to track it.

So, set this bug's status to "Verified".

Comment 13 errata-xmlrpc 2019-01-29 18:32:27 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHBA-2019:0209