diff mbox series

[8/9] mirror: return the remaining dirty bytes upon query

Message ID 20230224144825.466375-9-f.ebner@proxmox.com
State New
Headers show
Series mirror: allow switching from background to active mode | expand

Commit Message

Fiona Ebner Feb. 24, 2023, 2:48 p.m. UTC
This can be used by management applications starting with a job in
background mode to determine when the switch to active mode should
happen.

Suggested-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
 block/mirror.c       | 1 +
 qapi/block-core.json | 4 +++-
 2 files changed, 4 insertions(+), 1 deletion(-)

Comments

Vladimir Sementsov-Ogievskiy March 1, 2023, 4:31 p.m. UTC | #1
On 24.02.23 17:48, Fiona Ebner wrote:
> This can be used by management applications starting with a job in
> background mode to determine when the switch to active mode should
> happen.
> 
> Suggested-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
> Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
> ---
>   block/mirror.c       | 1 +
>   qapi/block-core.json | 4 +++-
>   2 files changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/block/mirror.c b/block/mirror.c
> index 02b5bd8bd2..ac83309b82 100644
> --- a/block/mirror.c
> +++ b/block/mirror.c
> @@ -1259,6 +1259,7 @@ static void mirror_query(BlockJob *job, BlockJobInfo *info)
>   
>       info->u.mirror = (BlockJobInfoMirror) {
>           .actively_synced = s->actively_synced,
> +        .remaining_dirty = bdrv_get_dirty_count(s->dirty_bitmap),

Doesn't it duplicate info->len - info->offset in meaning?

>       };
>   }
>   
> diff --git a/qapi/block-core.json b/qapi/block-core.json
> index 07e0f30492..91594eace4 100644
> --- a/qapi/block-core.json
> +++ b/qapi/block-core.json
> @@ -1308,10 +1308,12 @@
>   # @actively-synced: Whether the source is actively synced to the target, i.e.
>   #                   same data and new writes are done synchronously to both.
>   #
> +# @remaining-dirty: How much of the source is dirty relative to the target.
> +#
>   # Since 8.0
>   ##
>   { 'struct': 'BlockJobInfoMirror',
> -  'data': { 'actively-synced': 'bool' } }
> +  'data': { 'actively-synced': 'bool', 'remaining-dirty': 'int64' } }
>   
>   ##
>   # @BlockJobInfo:
Fiona Ebner March 2, 2023, 10 a.m. UTC | #2
Am 01.03.23 um 17:31 schrieb Vladimir Sementsov-Ogievskiy:
> On 24.02.23 17:48, Fiona Ebner wrote:
>> This can be used by management applications starting with a job in
>> background mode to determine when the switch to active mode should
>> happen.
>>
>> Suggested-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
>> Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
>> ---
>>   block/mirror.c       | 1 +
>>   qapi/block-core.json | 4 +++-
>>   2 files changed, 4 insertions(+), 1 deletion(-)
>>
>> diff --git a/block/mirror.c b/block/mirror.c
>> index 02b5bd8bd2..ac83309b82 100644
>> --- a/block/mirror.c
>> +++ b/block/mirror.c
>> @@ -1259,6 +1259,7 @@ static void mirror_query(BlockJob *job,
>> BlockJobInfo *info)
>>         info->u.mirror = (BlockJobInfoMirror) {
>>           .actively_synced = s->actively_synced,
>> +        .remaining_dirty = bdrv_get_dirty_count(s->dirty_bitmap),
> 
> Doesn't it duplicate info->len - info->offset in meaning?
> 

Essentially yes, apart from the in-flight bytes:
>         job_progress_set_remaining(&s->common.job,
>                                    s->bytes_in_flight + cnt +
>                                    s->active_write_bytes_in_flight);

Should I rather use that value (and rename it to e.g. data_remaining to
be more similar to data_sent from 9/9)?

But I'd argue the same way as in 9/9: it's not transparent to users what
offset and len mean for the mirror job, because their documentation is
for a generic block job. E.g. len is documented to be able to change in
both directions while the job runs.

Best Regards,
Fiona
Vladimir Sementsov-Ogievskiy March 2, 2023, 10:13 a.m. UTC | #3
On 02.03.23 13:00, Fiona Ebner wrote:
> Am 01.03.23 um 17:31 schrieb Vladimir Sementsov-Ogievskiy:
>> On 24.02.23 17:48, Fiona Ebner wrote:
>>> This can be used by management applications starting with a job in
>>> background mode to determine when the switch to active mode should
>>> happen.
>>>
>>> Suggested-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
>>> Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
>>> ---
>>>    block/mirror.c       | 1 +
>>>    qapi/block-core.json | 4 +++-
>>>    2 files changed, 4 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/block/mirror.c b/block/mirror.c
>>> index 02b5bd8bd2..ac83309b82 100644
>>> --- a/block/mirror.c
>>> +++ b/block/mirror.c
>>> @@ -1259,6 +1259,7 @@ static void mirror_query(BlockJob *job,
>>> BlockJobInfo *info)
>>>          info->u.mirror = (BlockJobInfoMirror) {
>>>            .actively_synced = s->actively_synced,
>>> +        .remaining_dirty = bdrv_get_dirty_count(s->dirty_bitmap),
>>
>> Doesn't it duplicate info->len - info->offset in meaning?
>>
> 
> Essentially yes, apart from the in-flight bytes:

Is it worth reporting to user?

>>          job_progress_set_remaining(&s->common.job,
>>                                     s->bytes_in_flight + cnt +
>>                                     s->active_write_bytes_in_flight);
> 
> Should I rather use that value (and rename it to e.g. data_remaining to
> be more similar to data_sent from 9/9)?
> 
> But I'd argue the same way as in 9/9: it's not transparent to users what
> offset and len mean for the mirror job, because their documentation is
> for a generic block job. E.g. len is documented to be able to change in
> both directions while the job runs.
> 

Still I'm not sure that we need new status values. I.e. if you need some new ones, you should explain the case and why existing information is not enough.

Especially when documentation of existing things is unclear, its better to start from improving it. And when we understand what len and offset means for mirror, it would probably be enough.
Fiona Ebner March 2, 2023, 12:34 p.m. UTC | #4
Am 02.03.23 um 11:13 schrieb Vladimir Sementsov-Ogievskiy:
> On 02.03.23 13:00, Fiona Ebner wrote:
>> Am 01.03.23 um 17:31 schrieb Vladimir Sementsov-Ogievskiy:
>>> On 24.02.23 17:48, Fiona Ebner wrote:
>>>> This can be used by management applications starting with a job in
>>>> background mode to determine when the switch to active mode should
>>>> happen.
>>>>
>>>> Suggested-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
>>>> Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
>>>> ---
>>>>    block/mirror.c       | 1 +
>>>>    qapi/block-core.json | 4 +++-
>>>>    2 files changed, 4 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/block/mirror.c b/block/mirror.c
>>>> index 02b5bd8bd2..ac83309b82 100644
>>>> --- a/block/mirror.c
>>>> +++ b/block/mirror.c
>>>> @@ -1259,6 +1259,7 @@ static void mirror_query(BlockJob *job,
>>>> BlockJobInfo *info)
>>>>          info->u.mirror = (BlockJobInfoMirror) {
>>>>            .actively_synced = s->actively_synced,
>>>> +        .remaining_dirty = bdrv_get_dirty_count(s->dirty_bitmap),
>>>
>>> Doesn't it duplicate info->len - info->offset in meaning?
>>>
>>
>> Essentially yes, apart from the in-flight bytes:
> 
> Is it worth reporting to user?
> 

You suggested that data_sent and remaining_dirty are important:
https://lists.nongnu.org/archive/html/qemu-devel/2023-02/msg03831.html

But I guess info->len - info->offset is just as good as part of a
heuristic to decide when the switch to active mode should happen.

For us, it doesn't really matter right now, because our users didn't
report issues with convergence, so our plan is to just switch to active
mode after the job is ready. We just need actively_synced to infer when
the switch is complete.

>>>          job_progress_set_remaining(&s->common.job,
>>>                                     s->bytes_in_flight + cnt +
>>>                                     s->active_write_bytes_in_flight);
>>
>> Should I rather use that value (and rename it to e.g. data_remaining to
>> be more similar to data_sent from 9/9)?
>>
>> But I'd argue the same way as in 9/9: it's not transparent to users what
>> offset and len mean for the mirror job, because their documentation is
>> for a generic block job. E.g. len is documented to be able to change in
>> both directions while the job runs.
>>
> 
> Still I'm not sure that we need new status values. I.e. if you need some
> new ones, you should explain the case and why existing information is
> not enough.
> 
> Especially when documentation of existing things is unclear, its better
> to start from improving it. And when we understand what len and offset
> means for mirror, it would probably be enough.
> 

Okay, makes sense! But I'm not sure how. Should I just add a paragraph
describing what the values mean for mirror in the description of @len
and @offset in @BlockJobInfo? Or where should this be documented?
Vladimir Sementsov-Ogievskiy March 2, 2023, 4:31 p.m. UTC | #5
On 02.03.23 15:34, Fiona Ebner wrote:
> Am 02.03.23 um 11:13 schrieb Vladimir Sementsov-Ogievskiy:
>> On 02.03.23 13:00, Fiona Ebner wrote:
>>> Am 01.03.23 um 17:31 schrieb Vladimir Sementsov-Ogievskiy:
>>>> On 24.02.23 17:48, Fiona Ebner wrote:
>>>>> This can be used by management applications starting with a job in
>>>>> background mode to determine when the switch to active mode should
>>>>> happen.
>>>>>
>>>>> Suggested-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
>>>>> Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
>>>>> ---
>>>>>     block/mirror.c       | 1 +
>>>>>     qapi/block-core.json | 4 +++-
>>>>>     2 files changed, 4 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/block/mirror.c b/block/mirror.c
>>>>> index 02b5bd8bd2..ac83309b82 100644
>>>>> --- a/block/mirror.c
>>>>> +++ b/block/mirror.c
>>>>> @@ -1259,6 +1259,7 @@ static void mirror_query(BlockJob *job,
>>>>> BlockJobInfo *info)
>>>>>           info->u.mirror = (BlockJobInfoMirror) {
>>>>>             .actively_synced = s->actively_synced,
>>>>> +        .remaining_dirty = bdrv_get_dirty_count(s->dirty_bitmap),
>>>>
>>>> Doesn't it duplicate info->len - info->offset in meaning?
>>>>
>>>
>>> Essentially yes, apart from the in-flight bytes:
>>
>> Is it worth reporting to user?
>>
> 
> You suggested that data_sent and remaining_dirty are important:
> https://lists.nongnu.org/archive/html/qemu-devel/2023-02/msg03831.html
> 

Yes, sorry if it made you implement these fields :/ I was just thinking.


> But I guess info->len - info->offset is just as good as part of a
> heuristic to decide when the switch to active mode should happen.
> 
> For us, it doesn't really matter right now, because our users didn't
> report issues with convergence, so our plan is to just switch to active
> mode after the job is ready. We just need actively_synced to infer when
> the switch is complete.
> 

Hmm. But mirror can't become "actively_synced" until it not switched to active mode?

>>>>           job_progress_set_remaining(&s->common.job,
>>>>                                      s->bytes_in_flight + cnt +
>>>>                                      s->active_write_bytes_in_flight);
>>>
>>> Should I rather use that value (and rename it to e.g. data_remaining to
>>> be more similar to data_sent from 9/9)?
>>>
>>> But I'd argue the same way as in 9/9: it's not transparent to users what
>>> offset and len mean for the mirror job, because their documentation is
>>> for a generic block job. E.g. len is documented to be able to change in
>>> both directions while the job runs.
>>>
>>
>> Still I'm not sure that we need new status values. I.e. if you need some
>> new ones, you should explain the case and why existing information is
>> not enough.
>>
>> Especially when documentation of existing things is unclear, its better
>> to start from improving it. And when we understand what len and offset
>> means for mirror, it would probably be enough.
>>
> 
> Okay, makes sense! But I'm not sure how. Should I just add a paragraph
> describing what the values mean for mirror in the description of @len
> and @offset in @BlockJobInfo? Or where should this be documented?
> 

Hmm, or just in description of blockdev-mirror command. Still, I don't mean that you should do it.

If we want additional similar fields - then yes, we should describe why and what is different with existing fields, and good start for it - add details to documentation.
If we don't add them - current heuristical understanding that "remaining ~= len - offset" is enough.
So, I think better not add these fields now if you don't need them.
Fiona Ebner March 3, 2023, 7:47 a.m. UTC | #6
Am 02.03.23 um 17:31 schrieb Vladimir Sementsov-Ogievskiy:
> On 02.03.23 15:34, Fiona Ebner wrote:
>> Am 02.03.23 um 11:13 schrieb Vladimir Sementsov-Ogievskiy:
>>> On 02.03.23 13:00, Fiona Ebner wrote:
>>>> Am 01.03.23 um 17:31 schrieb Vladimir Sementsov-Ogievskiy:
>>>>> On 24.02.23 17:48, Fiona Ebner wrote:
>>>>>> This can be used by management applications starting with a job in
>>>>>> background mode to determine when the switch to active mode should
>>>>>> happen.
>>>>>>
>>>>>> Suggested-by: Vladimir Sementsov-Ogievskiy
>>>>>> <vsementsov@yandex-team.ru>
>>>>>> Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
>>>>>> ---
>>>>>>     block/mirror.c       | 1 +
>>>>>>     qapi/block-core.json | 4 +++-
>>>>>>     2 files changed, 4 insertions(+), 1 deletion(-)
>>>>>>
>>>>>> diff --git a/block/mirror.c b/block/mirror.c
>>>>>> index 02b5bd8bd2..ac83309b82 100644
>>>>>> --- a/block/mirror.c
>>>>>> +++ b/block/mirror.c
>>>>>> @@ -1259,6 +1259,7 @@ static void mirror_query(BlockJob *job,
>>>>>> BlockJobInfo *info)
>>>>>>           info->u.mirror = (BlockJobInfoMirror) {
>>>>>>             .actively_synced = s->actively_synced,
>>>>>> +        .remaining_dirty = bdrv_get_dirty_count(s->dirty_bitmap),
>>>>>
>>>>> Doesn't it duplicate info->len - info->offset in meaning?
>>>>>
>>>>
>>>> Essentially yes, apart from the in-flight bytes:
>>>
>>> Is it worth reporting to user?
>>>
>>
>> You suggested that data_sent and remaining_dirty are important:
>> https://lists.nongnu.org/archive/html/qemu-devel/2023-02/msg03831.html
>>
> 
> Yes, sorry if it made you implement these fields :/ I was just thinking.

It was no big deal :)

> 
>> But I guess info->len - info->offset is just as good as part of a
>> heuristic to decide when the switch to active mode should happen.
>>
>> For us, it doesn't really matter right now, because our users didn't
>> report issues with convergence, so our plan is to just switch to active
>> mode after the job is ready. We just need actively_synced to infer when
>> the switch is complete.
>>
> 
> Hmm. But mirror can't become "actively_synced" until it not switched to
> active mode?

Yes, but that's fine. We'd wait for the job to be ready, then switch to
active mode and once actively_synced is true, we'd start migration. Then
we don't need to worry about triggering the assertion after inactivating
block devices upon switchover.

> 
>>>>>           job_progress_set_remaining(&s->common.job,
>>>>>                                      s->bytes_in_flight + cnt +
>>>>>                                      s->active_write_bytes_in_flight);
>>>>
>>>> Should I rather use that value (and rename it to e.g. data_remaining to
>>>> be more similar to data_sent from 9/9)?
>>>>
>>>> But I'd argue the same way as in 9/9: it's not transparent to users
>>>> what
>>>> offset and len mean for the mirror job, because their documentation is
>>>> for a generic block job. E.g. len is documented to be able to change in
>>>> both directions while the job runs.
>>>>
>>>
>>> Still I'm not sure that we need new status values. I.e. if you need some
>>> new ones, you should explain the case and why existing information is
>>> not enough.
>>>
>>> Especially when documentation of existing things is unclear, its better
>>> to start from improving it. And when we understand what len and offset
>>> means for mirror, it would probably be enough.
>>>
>>
>> Okay, makes sense! But I'm not sure how. Should I just add a paragraph
>> describing what the values mean for mirror in the description of @len
>> and @offset in @BlockJobInfo? Or where should this be documented?
>>
> 
> Hmm, or just in description of blockdev-mirror command. Still, I don't
> mean that you should do it.
> 
> If we want additional similar fields - then yes, we should describe why
> and what is different with existing fields, and good start for it - add
> details to documentation.
> If we don't add them - current heuristical understanding that "remaining
> ~= len - offset" is enough.
> So, I think better not add these fields now if you don't need them.
> 

Okay, sure. I'll let the people that actually need additional fields add
them :)

Best Regards,
Fiona
diff mbox series

Patch

diff --git a/block/mirror.c b/block/mirror.c
index 02b5bd8bd2..ac83309b82 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -1259,6 +1259,7 @@  static void mirror_query(BlockJob *job, BlockJobInfo *info)
 
     info->u.mirror = (BlockJobInfoMirror) {
         .actively_synced = s->actively_synced,
+        .remaining_dirty = bdrv_get_dirty_count(s->dirty_bitmap),
     };
 }
 
diff --git a/qapi/block-core.json b/qapi/block-core.json
index 07e0f30492..91594eace4 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -1308,10 +1308,12 @@ 
 # @actively-synced: Whether the source is actively synced to the target, i.e.
 #                   same data and new writes are done synchronously to both.
 #
+# @remaining-dirty: How much of the source is dirty relative to the target.
+#
 # Since 8.0
 ##
 { 'struct': 'BlockJobInfoMirror',
-  'data': { 'actively-synced': 'bool' } }
+  'data': { 'actively-synced': 'bool', 'remaining-dirty': 'int64' } }
 
 ##
 # @BlockJobInfo: