14.05.2018 13:09, Vladimir Sementsov-Ogievskiy wrote:
14.05.2018 09:41, Fam Zheng wrote:
On Wed, 04/18 17:00, Vladimir Sementsov-Ogievskiy wrote:
Hi all.
We now have the following problem:
If dirty-bitmaps migration capability is enabled, persistance flag is
dropped for all migrated bitmaps, to prevent their storing to the
storage on
inactivate.
Why do we prevent source storing persistent bitmaps by clearing the
flag instead
of making the bitmap code more BDRV_O_INACTIVE-aware, so it is _not_
stored
when/after inactivation?
Bitmaps are stored exactly on inactivation. So, we need some
flag, that on following inactivation, we don't want to save them. And
this flag
is .persistent flag.
Of course, we can't save them if BDRV_O_INACTIVE is already set
It works ok, persistence itself is migrated through the
migration channel. But on source, bitmaps becomes not persistent, so
if we,
for some reasons, want to continue using source vm, we'll lose
bitmaps on
stop/start.
It's simple to fix it: just make bitmaps persistent again on invalidate
[1].. But I have some questions.
1. What are possible cases? I think about the following:
a. migration cancel or fail, then invalidate
b. migration success, then qmp cont => invalidate
Is this "cont" on the source even though dst is already up? How will
this work?
Isn't it expected that dst is using the image?
Dr. David described this case, look at his answer.
c. migration success, then stop/start (there was no invalidate, so
[1] will
not work)
2. Is it safe at all, saving bitmaps after inactivate, even without
persistence?
This is not safe. No I/O should be done to the image after inactivation.
Inactive disk implies, that it may be changed by somebody other,
isn't it?
Yes.
Is it possible, that target will change the disk, and then we return
control
to the source? In this case bitmaps will be invalid. So, should not
we drop
all the bitmaps on inactivate?
Yes, dropping all live bitmaps upon inactivate sounds reasonable. If
the dst
fails to start, and we want to resume VM at src, we could
(optionally?) reload
the persistent bitmaps, I guess.
Reload from where? We didn't store them.
So, you agree, that dropping all bitmaps after inactivation is good
idea.. The second question, is it possible to not drop them? Is there
a way, to check that disk was not changed after pair of
inactivate-invalidate? I have an idea:
we can create small-bitmap, which will not migrate through migration
channel, but remain persistent. It will be very small (big
granularity, to not increase downtime of migration), so after
invalidate we can check this bitmap. If it is empty, we are happy, we
can "activate" all our bitmaps and make them persistent again. If not,
we have two ways:
1. drop all bitmaps
2. merge small-bitmap to all our bitmaps
However, we must not start source, if disk was changed, as memory and
devices states will not correspond to disk. So, such a small bitmap may
be used to check, can we start source or not.
--
Best regards,
Vladimir
--
Best regards,
Vladimir