On Fri, Nov 25, 2016 at 02:28:16PM +0300, Vladimir Sementsov-Ogievskiy wrote: > With the availability of sparse storage formats, it is often needed > to query status of a particular range and read only those blocks of > data that are actually present on the block device. > > To provide such information, the patch adds the BLOCK_STATUS > extension with one new NBD_CMD_BLOCK_STATUS command, a new > structured reply chunk format, and a new transmission flag. > > There exists a concept of data dirtiness, which is required > during, for example, incremental block device backup. To express > this concept via NBD protocol, this patch also adds a flag to > NBD_CMD_BLOCK_STATUS to request dirtiness information rather than > provisioning information; however, with the current proposal, data > dirtiness is only useful with additional coordination outside of > the NBD protocol (such as a way to start and stop the server from > tracking dirty sectors). Future NBD extensions may add commands > to control dirtiness through NBD. > > Since NBD protocol has no notion of block size, and to mimic SCSI > "GET LBA STATUS" command more closely, it has been chosen to return > a list of extents in the response of NBD_CMD_BLOCK_STATUS command, > instead of a bitmap. > > CC: Pavel Borzenkov > CC: Denis V. Lunev > CC: Wouter Verhelst > CC: Paolo Bonzini > CC: Kevin Wolf > CC: Stefan Hajnoczi > Signed-off-by: Eric Blake > Signed-off-by: Vladimir Sementsov-Ogievskiy > --- > > v3: > > Hi all. This is almost a resend of v2 (by Eric Blake), The only change is > removing the restriction, that sum of status descriptor lengths must be equal > to requested length. I.e., let's permit the server to replay with less data > than required if it wants. > > Also, bit of NBD_FLAG_SEND_BLOCK_STATUS is changed to 9, as 8 is now > NBD_FLAG_CAN_MULTI_CONN in master branch. > > And, finally, I've rebased this onto current state of > extension-structured-reply branch (which itself should be rebased on > master IMHO). > > By this resend I just want to continue the diqussion, started about half > a year ago. Here is a summary of some questions and ideas from v2 > diqussion: > > 1. Q: Synchronisation. Is such data (dirty/allocated) reliable? > A: This all is for read-only disks, so the data is static and unchangeable. > > 2. Q: different granularities of dirty/allocated bitmaps. Any problems? > A: 1: server replies with status descriptors of any size, granularity > is hidden from the client > 2: dirty/allocated requests are separate and unrelated to each > other, so their granularities are not intersecting > > 3. Q: selecting of dirty bitmap to export > A: several variants: > 1: id of bitmap is in flags field of request > pros: - simple > cons: - it's a hack. flags field is for other uses. > - we'll have to map bitmap names to these "ids" > 2: introduce extended nbd requests with variable length and exploit this > feature for BLOCK_STATUS command, specifying bitmap identifier. > pros: - looks like a true way > cons: - we have to create additional extension > - possible we have to create a map, > { <=> } > 3: exteranl tool should select which bitmap to export. So, in case of Qemu > it should be something like qmp command block-export-dirty-bitmap. > pros: - simple > - we can extend it to behave like (2) later > cons: - additional qmp command to implement (possibly, the lesser evil) > note: Hmm, external tool can make chose between allocated/dirty data too, > so, we can remove 'NBD_FLAG_STATUS_DIRTY' flag at all. > > 4. Q: Should not get_{allocated,dirty} be separate commands? > cons: Two commands with almost same semantic and similar means? > pros: However here is a good point of separating clearly defined and native > for block devices GET_BLOCK_STATUS from user-driven and actually > undefined data, called 'dirtyness'. > > 5. Number of status descriptors, sent by server, should be restricted > variants: > 1: just allow server to restrict this as it wants (which was done in v3) > 2: (not excluding 1). Client specifies somehow the maximum for number > of descriptors. > 2.1: add command flag, which will request only one descriptor > (otherwise, no restrictions from the client) > 2.2: again, introduce extended nbd requests, and add field to > specify this maximum > > 6. A: What to do with unspecified flags (in request/reply)? > I think the normal variant is to make them reserved. (Server should > return EINVAL if found unknown bits, client should consider replay > with unknown bits as an error) > > ====== > > Also, an idea on 2-4: > > As we say, that dirtiness is unknown for NBD, and external tool > should specify, manage and understand, which data is actually > transmitted, why not just call it user_data and leave status field > of reply chunk unspecified in this case? > > So, I propose one flag for NBD_CMD_BLOCK_STATUS: > NBD_FLAG_STATUS_USER. If it is clear, than behaviour is defined by > Eric's 'Block provisioning status' paragraph. If it is set, we just > leave status field for some external... protocol? Who knows, what is > this user data. > > Note: I'm not sure, that I like this (my) proposal. It's just an > idea, may be someone like it. And, I think, it represents what we > are trying to do more honestly. > > Note2: the next step of generalization will be NBD_CMD_USER, with > variable request size, structured reply and no definition :) > > > Another idea, about backups themselves: > > Why do we need allocated/zero status for backup? IMHO we don't. > > Full backup: just do structured read - it will show us, which chunks > may be treaded as zeroes. > > Incremental backup: get dirty bitmap (somehow, for example through > user-defined part of proposed command), than, for dirty blocks, read > them through structured read, so information about zero/unallocated > areas are here. > > For me all the variants above are OK. Let's finally choose something. > > v2: > v1 was: https://lists.gnu.org/archive/html/qemu-devel/2016-03/msg05574.html > > Since then, we've added the STRUCTURED_REPLY extension, which > necessitates a rather larger rebase; I've also changed things > to rename the command 'NBD_CMD_BLOCK_STATUS', changed the request > modes to be determined by boolean flags (rather than by fixed > values of the 16-bit flags field), changed the reply status fields > to be bitwise-or values (with a default of 0 always being sane), > and changed the descriptor layout to drop an offset but to include > a 32-bit status so that the descriptor is nicely 8-byte aligned > without padding. > > doc/proto.md | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 154 insertions(+), 1 deletion(-) Reviewed-by: Stefan Hajnoczi