query-block command is missing device name. Deprecated?

2020-01-30 Thread Mike Lee
Hello All,

I've discovered that when I run the command "query-block" command, the
"device:" attribute's value is now blank.  I use this to help execute
incremental backups of my VMs. In previous versions this worked but now
that I'm on a rolling distro I no longer receive this info.  I'm
wondering if this is a bug or intended, and if so why.  Details of my
findings are below.


PREVIOUS SYSTEM:
Distro: Mint 19.1
Kernel: 4.15.0-74-generic #84-Ubuntu SMP
Virsh ver: 4.0
QEMU Version: 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.21)

In the old Mint distro I could run something like the below to create
the dirty bitmap and then kick-off a backup (I'm aware I can combine
the two into one trasaction but I am separating them out here for
readability):

CREATE BITMAP: (drive-virtio-disk0 was the "device" name that was
always returned by the qemu-monitor "query-block" command.)

virsh qemu-monitor-command manjaro-xfce --pretty \
'{"execute": "transaction",' \
'"arguments":' \
'{' \
'"actions":' \
'[' \
'{"type": "block-dirty-bitmap-add",' \
' "data": {"node": "drive-virtio-disk0", "name":
"bitmap0"}' \
'}' \
']' \
'}' \
'}'


KICK-OFF BACKUP:

virsh qemu-monitor-command manjaro-xfce --pretty \
'{"execute": "transaction",' \
'"arguments":' \
'{' \
'"actions":' \
'[' \
'{"type": "drive-backup",' \
' "data": {"device": "drive-virtio-disk0",' \
'  "target": "/libvirt-backups/manjaro-xfce-full-
backup.qcow2",' \
'  "sync": "full", "format": "qcow2"' \
' }' \
'}' \
']' \
'}' \
'}'



CURRENT SYSTEM:
Distro: Manjaro
Kernel: 5.4.15-2-MANJARO #1 SMP PREEMPT
Virsh ver: 5.10.0
QEMU Version: 4.2.0

Now when I run the above command to create the dirty bitmap I get:
--
virsh qemu-monitor-command manjaro-xfce --pretty \
> '{"execute": "transaction",' \
> '"arguments":' \
> '{' \
> '"actions":' \
> '[' \
> '{"type": "block-dirty-bitmap-add",' \
> ' "data": {"node": "drive-virtio-disk0", "name":
"bitmap0"}' \
> '}' \
> ']' \
> '}' \
> '}'
{
  "id": "libvirt-389",
  "error": {
"class": "GenericError",
"desc": "Cannot find device=drive-virtio-disk0 nor node_name=drive-
virtio-disk0"
  }
}
--


Querying the manjaro-xfce VM for block info I get the below.  NOTE the
blank "device" entry.  Previously this was populated with "drive-
virtio-disk0"  .  So what do I use for the device now on the new
version of qemu?

--
virsh qemu-monitor-command manjaro-xfce --pretty '{"execute":"query-
block"}'
{
  "return": [
{
  "io-status": "ok",
 --->> "device": "", <<-
  "locked": false,
  "removable": false,
  "inserted": {
"iops_rd": 0,
"detect_zeroes": "off",
"image": {
  "virtual-size": 8589934592,
  "filename": "/var/lib/libvirt/images/manjaro-xfce.qcow2",
  "cluster-size": 65536,
  "format": "qcow2",
  "actual-size": 8591200256,
  "format-specific": {
"type": "qcow2",
"data": {
  "compat": "1.1",
  "lazy-refcounts": true,
  "refcount-bits": 16,
  "corrupt": false
}
  },
  "dirty-flag": false
},
"iops_wr": 0,
"ro": false,
"node-name": "libvirt-3-format",
"backing_file_depth": 0,
"drv": "qcow2",
"iops": 0,
"bps_wr": 0,
"write_threshold": 0,
"encrypted": false,
"bps": 0,
"bps_rd": 0,
"cache": {
  "no-flush": false,
  "direct": false,
  "writeback": true
},
"file": "/var/lib/libvirt/images/manjaro-xfce.qcow2",
"encryption_key_missing": false
  },
  "qdev": "/machine/peripheral/virtio-disk0/virtio-backend",
  "type": "unknown"
},
{
  "io-status": "ok",
  "device": "",
  "locked": false,
  "removable": false,
  "inserted": {
"iops_rd": 0,
"detect_zeroes": "off",
"image": {
  "virtual-size": 2147483648,
  "filename": "/var/lib/libvirt/images/manjaro-xfce-1.qcow2",
  "cluster-size": 65536,
  "format": "qcow2",
  "actual-size": 2148020224,
  "format-specific": {
"type": "qcow2",
"data": {
  "compat": "1.1",
  "lazy-refcounts": true

Re: query-block command is missing device name. Deprecated?

2020-02-04 Thread Max Reitz
On 31.01.20 05:06, Mike Lee wrote:
> Hello All,

Hi Mike,

Most of the changes you’re seeing are probably due to libvirt using node
names to create block devices now.  So every node in the block graph
(e.g. a file node to read a file from the normal filesystem, or a qcow2
node to interpret the qcow2 format) is now created explicitly by
libvirt, and every such node needs a node name.

Before this (very recent) change, libvirt used -drive (I think), which
either creates a guest device along with an attached full block node
tree, or just the tree without the device – but that tree still gets a
name as whole, and that was the name shown by query-block.  (The guest
device name is shown under @qdev.)

With libvirt now using -blockdev instead of -drive and thus creating
single block nodes, there is no such tree name anymore.  That’s why it’s
shown as empty.

> IN CLOSING:
> 1.) I suspect the error I get when starting the backup is simply a bug.
> Am I correct in assuming this, since the backup actually starts?  If
> I'm wrong what do I need to change to not get the error?

This is also related to the libvirt change described above.  You used to
have to specify the tree name (generally called “device name” in QAPI),
but now there is no such name.  As such, you have to specify the node
name now.  You did that, but you also need to specify a job-id then.

The documentation isn’t really clear about this, but job-id will only
default to the device name, not to what @device says.  There is no
device name (or “tree name”, as I’ve called it above), so it cannot
default to anything.  Hence the error message, that an empty job ID is
not permissible.

So long story short, you need to specify something for @job-id.  (And
then all further job commands/events will use that for their respective
@device field.  That will be a bit confusing, but, well, we had to for
compatibility.)

> 2.) Has the "device" attribute in the "query-block" command been
> deprecated and is that why that attribute's value is now blank?  I've
> gone back through all of the QEMU release notes and see no mention of
> this.  

It hasn’t, but when using -blockdev instead of -drive for block devices,
it will be empty.  (And libvirt does use -blockdev now.)

> 3.) What's with the "libvirt-X-format" node name?  The "drive-virtio-
> diskX" seemed more logical.  Is this naming change a libvirt thing and
> not qemu?

That has the same reason, libvirt now uses -blockdev, so it specifies
node names.  “libvirt-X-format” looks like a typical node name (“format”
is a type of node that interprets image formats, like qcow2 or raw),
whereas “drive-virtio-diskX” seems like a name for a whole tree of block
nodes (i.e., a device name).

Max



signature.asc
Description: OpenPGP digital signature


Re: query-block command is missing device name. Deprecated?

2020-02-05 Thread Mike Lee
Max,

Thanks for the thorough explanation.  I finaly found some QEMU pdf docs
out there describing that -blockdev was the way of the furture.

I'll try providing a job-id for the backups.  Again thanks for the
reply/feedback.  It's great to see how fast this stuff is progressing,
even if it causes some usage gotchas from time to time.  Have a good
one!

Mike

On Tue, 2020-02-04 at 12:29 +0100, Max Reitz wrote:
> On 31.01.20 05:06, Mike Lee wrote:
> > Hello All,
> 
> Hi Mike,
> 
> Most of the changes you’re seeing are probably due to libvirt using
> node
> names to create block devices now.  So every node in the block graph
> (e.g. a file node to read a file from the normal filesystem, or a
> qcow2
> node to interpret the qcow2 format) is now created explicitly by
> libvirt, and every such node needs a node name.
> 
> Before this (very recent) change, libvirt used -drive (I think),
> which
> either creates a guest device along with an attached full block node
> tree, or just the tree without the device – but that tree still gets
> a
> name as whole, and that was the name shown by query-block.  (The
> guest
> device name is shown under @qdev.)
> 
> With libvirt now using -blockdev instead of -drive and thus creating
> single block nodes, there is no such tree name anymore.  That’s why
> it’s
> shown as empty.
> 
> > IN CLOSING:
> > 1.) I suspect the error I get when starting the backup is simply a
> > bug.
> > Am I correct in assuming this, since the backup actually
> > starts?  If
> > I'm wrong what do I need to change to not get the error?
> 
> This is also related to the libvirt change described above.  You used
> to
> have to specify the tree name (generally called “device name” in
> QAPI),
> but now there is no such name.  As such, you have to specify the node
> name now.  You did that, but you also need to specify a job-id then.
> 
> The documentation isn’t really clear about this, but job-id will only
> default to the device name, not to what @device says.  There is no
> device name (or “tree name”, as I’ve called it above), so it cannot
> default to anything.  Hence the error message, that an empty job ID
> is
> not permissible.
> 
> So long story short, you need to specify something for @job-id.  (And
> then all further job commands/events will use that for their
> respective
> @device field.  That will be a bit confusing, but, well, we had to
> for
> compatibility.)
> 
> > 2.) Has the "device" attribute in the "query-block" command been
> > deprecated and is that why that attribute's value is now
> > blank?  I've
> > gone back through all of the QEMU release notes and see no mention
> > of
> > this.  
> 
> It hasn’t, but when using -blockdev instead of -drive for block
> devices,
> it will be empty.  (And libvirt does use -blockdev now.)
> 
> > 3.) What's with the "libvirt-X-format" node name?  The "drive-
> > virtio-
> > diskX" seemed more logical.  Is this naming change a libvirt thing
> > and
> > not qemu?
> 
> That has the same reason, libvirt now uses -blockdev, so it specifies
> node names.  “libvirt-X-format” looks like a typical node name
> (“format”
> is a type of node that interprets image formats, like qcow2 or raw),
> whereas “drive-virtio-diskX” seems like a name for a whole tree of
> block
> nodes (i.e., a device name).
> 
> Max
>