[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] block replication
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[Qemu-block] block replication |
Date: |
Wed, 9 Aug 2017 17:11:02 +0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 |
Hi Wen!
I'm trying to understand block/replication code and have a question.
Why should we block the region from intersecting cow requests when read?
If I understand correctly
regardless of writes to the secondary-disk we have consistent view of it
through hidden-disk:
Even if we are intersecting with some writes to secondary-disk (and
corresponding cow-requests), the
data in secondary disk will not be updated until backed up to
hidden-disk, therefore, for read we have two
options:
1. read old data from secondary-disk (unallocated region in hidden-disk
means data in secondary-disk is not updated yet)
2. read backed-up data from hidden-disk (data in secondary-disk may be
already updated but we don't care)
(the whole region to read may consists of parts, corresponding to 1 or
2, but this should be ok too)
Where am I wrong?
======
static coroutine_fn int replication_co_readv(BlockDriverState *bs,
int64_t sector_num,
int remaining_sectors,
QEMUIOVector *qiov)
{
BDRVReplicationState *s = bs->opaque;
BdrvChild *child = s->secondary_disk;
BlockJob *job = NULL;
CowRequest req;
int ret;
if (s->mode == REPLICATION_MODE_PRIMARY) {
/* We only use it to forward primary write requests */
return -EIO;
}
ret = replication_get_io_status(s);
if (ret < 0) {
return ret;
}
if (child && child->bs) {
job = child->bs->job;
}
if (job) {
uint64_t remaining_bytes = remaining_sectors * BDRV_SECTOR_SIZE;
backup_wait_for_overlapping_requests(child->bs->job,
sector_num *
BDRV_SECTOR_SIZE,
remaining_bytes);
backup_cow_request_begin(&req, child->bs->job,
sector_num * BDRV_SECTOR_SIZE,
remaining_bytes);
ret = bdrv_co_readv(bs->file, sector_num, remaining_sectors,
qiov);
backup_cow_request_end(&req);
goto out;
}
ret = bdrv_co_readv(bs->file, sector_num, remaining_sectors, qiov);
out:
return replication_return_value(s, ret);
}
--
Best regards,
Vladimir
- [Qemu-block] block replication,
Vladimir Sementsov-Ogievskiy <=