diff mbox series

[01/11] block: add new BlockDriver handler: bdrv_cancel_in_flight

Message ID 20201118180433.11931-2-vsementsov@virtuozzo.com (mailing list archive)
State New, archived
Headers show
Series mirror: cancel nbd reconnect | expand

Commit Message

Vladimir Sementsov-Ogievskiy Nov. 18, 2020, 6:04 p.m. UTC
It will be used to stop retrying NBD requests on mirror cancel.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 include/block/block.h     |  3 +++
 include/block/block_int.h |  9 +++++++++
 block/io.c                | 11 +++++++++++
 3 files changed, 23 insertions(+)

Comments

Eric Blake Jan. 20, 2021, 10:27 p.m. UTC | #1
On 11/18/20 12:04 PM, Vladimir Sementsov-Ogievskiy wrote:
> It will be used to stop retrying NBD requests on mirror cancel.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
>  include/block/block.h     |  3 +++
>  include/block/block_int.h |  9 +++++++++
>  block/io.c                | 11 +++++++++++
>  3 files changed, 23 insertions(+)
> 

How does this relate to the recent addition of the QMP yank command?


> +++ b/include/block/block_int.h
> @@ -344,6 +344,15 @@ struct BlockDriver {
>          bool want_zero, int64_t offset, int64_t bytes, int64_t *pnum,
>          int64_t *map, BlockDriverState **file);
>  
> +    /*
> +     * This informs the driver that we are not more interested in in-flight

that we are no longer interested in the result of in-flight requests, so

> +     * requests results, so don't waste the time if possible.
> +     *
> +     * The example usage is to not wait for nbd target nodedreconnect timeout on
> +     * job-cancel.

One example usage is to avoid waiting for an nbd target node reconnect
timeout during job-cancel.

Reviewed-by: Eric Blake <eblake@redhat.com>
Vladimir Sementsov-Ogievskiy Jan. 21, 2021, 6:50 p.m. UTC | #2
21.01.2021 01:27, Eric Blake wrote:
> On 11/18/20 12:04 PM, Vladimir Sementsov-Ogievskiy wrote:
>> It will be used to stop retrying NBD requests on mirror cancel.
>>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>> ---
>>   include/block/block.h     |  3 +++
>>   include/block/block_int.h |  9 +++++++++
>>   block/io.c                | 11 +++++++++++
>>   3 files changed, 23 insertions(+)
>>
> 
> How does this relate to the recent addition of the QMP yank command?

Hmm. Don't know.. Looking in spec:

# Currently implemented yank instances:
#  - nbd block device:
#    Yanking it will shut down the connection to the nbd server without
#    attempting to reconnect.

Looks like a close thing. But actually, I don't want to stop reconnecting process, but only cancel some requests which we don't want to wait for. After that, the nbd node may successfully reconnect and continue to work.

> 
> 
>> +++ b/include/block/block_int.h
>> @@ -344,6 +344,15 @@ struct BlockDriver {
>>           bool want_zero, int64_t offset, int64_t bytes, int64_t *pnum,
>>           int64_t *map, BlockDriverState **file);
>>   
>> +    /*
>> +     * This informs the driver that we are not more interested in in-flight
> 
> that we are no longer interested in the result of in-flight requests, so
> 
>> +     * requests results, so don't waste the time if possible.
>> +     *
>> +     * The example usage is to not wait for nbd target nodedreconnect timeout on
>> +     * job-cancel.
> 
> One example usage is to avoid waiting for an nbd target node reconnect
> timeout during job-cancel.
> 
> Reviewed-by: Eric Blake <eblake@redhat.com>
>
diff mbox series

Patch

diff --git a/include/block/block.h b/include/block/block.h
index c9d7c58765..3990ee3677 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -836,4 +836,7 @@  int coroutine_fn bdrv_co_copy_range(BdrvChild *src, uint64_t src_offset,
                                     BdrvChild *dst, uint64_t dst_offset,
                                     uint64_t bytes, BdrvRequestFlags read_flags,
                                     BdrvRequestFlags write_flags);
+
+void bdrv_cancel_in_flight(BlockDriverState *bs);
+
 #endif
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 95d9333be1..07a87ce5e7 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -344,6 +344,15 @@  struct BlockDriver {
         bool want_zero, int64_t offset, int64_t bytes, int64_t *pnum,
         int64_t *map, BlockDriverState **file);
 
+    /*
+     * This informs the driver that we are not more interested in in-flight
+     * requests results, so don't waste the time if possible.
+     *
+     * The example usage is to not wait for nbd target nodedreconnect timeout on
+     * job-cancel.
+     */
+    void (*bdrv_cancel_in_flight)(BlockDriverState *bs);
+
     /*
      * Invalidate any cached meta-data.
      */
diff --git a/block/io.c b/block/io.c
index ec5e152bb7..5dcb6433f9 100644
--- a/block/io.c
+++ b/block/io.c
@@ -3288,3 +3288,14 @@  out:
 
     return ret;
 }
+
+void bdrv_cancel_in_flight(BlockDriverState *bs)
+{
+    if (!bs || !bs->drv) {
+        return;
+    }
+
+    if (bs->drv->bdrv_cancel_in_flight) {
+        bs->drv->bdrv_cancel_in_flight(bs);
+    }
+}