Am 14.05.2013 um 18:45 hat Paolo Bonzini geschrieben: > Il 14/05/2013 17:48, Wolfgang Richter ha scritto: > > On Tue, May 14, 2013 at 6:04 AM, Paolo Bonzini <pbonz...@redhat.com > > <mailto:pbonz...@redhat.com>> wrote: > > > > Il 14/05/2013 10:50, Kevin Wolf ha scritto: > > > Or, to translate it into our existing terminology, drive-mirror > > > implements a passive mirror, you're proposing an active one (which we > > > do want to have). > > > > > > With an active mirror, we'll want to have another choice: The > > mirror can > > > be synchronous (guest writes only complete after the mirrored > > write has > > > completed) or asynchronous (completion is based only on the original > > > image). It should be easy enough to support both once an active mirror > > > exists. > > > > Right, I'm waiting for Stefan's block-backup to give me the "right" > > hooks for the active mirror. > > > > The bulk phase will always be passive, but an active-asynchronous mirror > > has some interesting properties and it makes sense to implement it. > > > > > > Do you mean you'd model the 'active' mode after 'block-backup,' or actually > > call functions provided by 'block-backup'? > > No, I'll just reuse the same hooks within block/mirror.c (almost... it > looks like I need after_write too, not just before_write :( that's a > pity).
Makes me wonder if using a real BlockDriver for the filter from the beginning wouldn't be better than accumulating more and more hooks and having to find ways to pass data from 'before' to 'after' hooks... > Basically: > > 1) before the write, if there is space in the job's buffers, allocate a > MirrorOp and a data buffer for the write. Also record whether the block > was dirty before; > > 2) after the write, do nothing if there was no room to allocate the data > buffer. Else clear the block from the dirty bitmap. If the block was > dirty, read the whole cluster from the source as in passive mirroring. > If it wasn't, copy the data from guest memory to the preallocated buffer > and write it to the destination; Does the "if there was no room" part mean that the mirror is active only sometimes? And why even bother with a dirty bitmap for an active mirror? The background job that sequentially processes the whole image only needs a counter, no bitmap. At which point it looks like implementing it separate from mirror.c could make more sense. Kevin