diff mbox series

blockdev: report error on block latency histogram set error

Message ID a4205609-576c-49cd-1ef6-650491222ff0@bytedance.com (mailing list archive)
State New, archived
Headers show
Series blockdev: report error on block latency histogram set error | expand

Commit Message

zhenwei pi Oct. 18, 2018, 10:42 a.m. UTC
Function block_latency_histogram_set may return error, but qapi ignore this.
This can be reproduced easily by qmp command:
virsh qemu-monitor-command INSTANCE '{"execute":"x-block-latency-histogram-set",
"arguments":{"device":"drive-virtio-disk1","boundaries":[10,200,40]}}'
In fact this command does not work, but we still get success result.

qmp_x_block_latency_histogram_set is a batch setting API, report error ASAP.

Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
---
  blockdev.c | 19 ++++++++++++++++---
  1 file changed, 16 insertions(+), 3 deletions(-)

Comments

Vladimir Sementsov-Ogievskiy Oct. 31, 2018, 9:49 a.m. UTC | #1
18.10.2018 13:42, zhenwei pi wrote:
> Function block_latency_histogram_set may return error, but qapi ignore 
> this.
> This can be reproduced easily by qmp command:
> virsh qemu-monitor-command INSTANCE 
> '{"execute":"x-block-latency-histogram-set",
> "arguments":{"device":"drive-virtio-disk1","boundaries":[10,200,40]}}'
> In fact this command does not work, but we still get success result.
>
> qmp_x_block_latency_histogram_set is a batch setting API, report error 
> ASAP.

Good catch, thank you, it's my fault!

The problem of the patch is that in case of error, boundaries for read 
(or write) may be set, when others are not.
Better thing is refactor it somehow so that in case of error nothing 
changed finally.

>
> Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
> ---
>  blockdev.c | 19 ++++++++++++++++---
>  1 file changed, 16 insertions(+), 3 deletions(-)
>
> diff --git a/blockdev.c b/blockdev.c
> index a8755bd..03b1aa3 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -4377,6 +4377,7 @@ void qmp_x_block_latency_histogram_set(
>  {
>      BlockBackend *blk = blk_by_name(device);
>      BlockAcctStats *stats;
> +    int ret;
>
>      if (!blk) {
>          error_setg(errp, "Device '%s' not found", device);
> @@ -4392,21 +4393,33 @@ void qmp_x_block_latency_histogram_set(
>      }
>
>      if (has_boundaries || has_boundaries_read) {
> -        block_latency_histogram_set(
> +        ret = block_latency_histogram_set(
>              stats, BLOCK_ACCT_READ,
>              has_boundaries_read ? boundaries_read : boundaries);
> +        if (ret) {
> +            error_setg(errp, "Device '%s' set read boundaries fail", 
> device);
> +            return;
> +        }
>      }
>
>      if (has_boundaries || has_boundaries_write) {
> -        block_latency_histogram_set(
> +        ret = block_latency_histogram_set(
>              stats, BLOCK_ACCT_WRITE,
>              has_boundaries_write ? boundaries_write : boundaries);
> +        if (ret) {
> +            error_setg(errp, "Device '%s' set write boundaries fail", 
> device);
> +            return;
> +        }
>      }
>
>      if (has_boundaries || has_boundaries_flush) {
> -        block_latency_histogram_set(
> +        ret = block_latency_histogram_set(
>              stats, BLOCK_ACCT_FLUSH,
>              has_boundaries_flush ? boundaries_flush : boundaries);
> +        if (ret) {
> +            error_setg(errp, "Device '%s' set flush boundaries fail", 
> device);
> +            return;
> +        }
>      }
>  }
>
diff mbox series

Patch

diff --git a/blockdev.c b/blockdev.c
index a8755bd..03b1aa3 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -4377,6 +4377,7 @@  void qmp_x_block_latency_histogram_set(
  {
      BlockBackend *blk = blk_by_name(device);
      BlockAcctStats *stats;
+    int ret;
  
      if (!blk) {
          error_setg(errp, "Device '%s' not found", device);
@@ -4392,21 +4393,33 @@  void qmp_x_block_latency_histogram_set(
      }
  
      if (has_boundaries || has_boundaries_read) {
-        block_latency_histogram_set(
+        ret = block_latency_histogram_set(
              stats, BLOCK_ACCT_READ,
              has_boundaries_read ? boundaries_read : boundaries);
+        if (ret) {
+            error_setg(errp, "Device '%s' set read boundaries fail", device);
+            return;
+        }
      }
  
      if (has_boundaries || has_boundaries_write) {
-        block_latency_histogram_set(
+        ret = block_latency_histogram_set(
              stats, BLOCK_ACCT_WRITE,
              has_boundaries_write ? boundaries_write : boundaries);
+        if (ret) {
+            error_setg(errp, "Device '%s' set write boundaries fail", device);
+            return;
+        }
      }
  
      if (has_boundaries || has_boundaries_flush) {
-        block_latency_histogram_set(
+        ret = block_latency_histogram_set(
              stats, BLOCK_ACCT_FLUSH,
              has_boundaries_flush ? boundaries_flush : boundaries);
+        if (ret) {
+            error_setg(errp, "Device '%s' set flush boundaries fail", device);
+            return;
+        }
      }
  }