X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=qapi%2Fblock.json;h=998008cfa8fe4792837dde83fa0f4596d368782c;hb=cf03a152c5d749fd0083bfe540df9524f1d2ff1d;hp=5a79d639e8c5aceb74230845615839ece164d07a;hpb=51c1c135608e155d01eea774974d2b9caee9befb;p=mirror_qemu.git diff --git a/qapi/block.json b/qapi/block.json index 5a79d639e8..998008cfa8 100644 --- a/qapi/block.json +++ b/qapi/block.json @@ -1,4 +1,5 @@ # -*- Mode: Python -*- +# vim: filetype=python ## # = Block devices @@ -18,26 +19,26 @@ # translate logical CHS to physical; instead, they will use logical # block addressing. # -# @auto: If cylinder/heads/sizes are passed, choose between none and LBA -# depending on the size of the disk. If they are not passed, -# choose none if QEMU can guess that the disk had 16 or fewer -# heads, large if QEMU can guess that the disk had 131072 or -# fewer tracks across all heads (i.e. cylinders*heads<131072), -# otherwise LBA. +# @auto: If cylinder/heads/sizes are passed, choose between none and +# LBA depending on the size of the disk. If they are not passed, +# choose none if QEMU can guess that the disk had 16 or fewer +# heads, large if QEMU can guess that the disk had 131072 or fewer +# tracks across all heads (i.e. cylinders*heads<131072), otherwise +# LBA. # # @none: The physical disk geometry is equal to the logical geometry. # # @lba: Assume 63 sectors per track and one of 16, 32, 64, 128 or 255 -# heads (if fewer than 255 are enough to cover the whole disk -# with 1024 cylinders/head). The number of cylinders/head is -# then computed based on the number of sectors and heads. +# heads (if fewer than 255 are enough to cover the whole disk with +# 1024 cylinders/head). The number of cylinders/head is then +# computed based on the number of sectors and heads. # -# @large: The number of cylinders per head is scaled down to 1024 -# by correspondingly scaling up the number of heads. +# @large: The number of cylinders per head is scaled down to 1024 by +# correspondingly scaling up the number of heads. # # @rechs: Same as @large, but first convert a 16-head geometry to -# 15-head, by proportionally scaling up the number of -# cylinders/head. +# 15-head, by proportionally scaling up the number of +# cylinders/head. # # Since: 2.0 ## @@ -49,10 +50,14 @@ # # Type of Floppy drive to be emulated by the Floppy Disk Controller. # -# @144: 1.44MB 3.5" drive -# @288: 2.88MB 3.5" drive -# @120: 1.2MB 5.25" drive +# @144: 1.44MB 3.5" drive +# +# @288: 2.88MB 3.5" drive +# +# @120: 1.2MB 5.25" drive +# # @none: No drive connected +# # @auto: Automatically determined by inserted media at boot # # Since: 2.6 @@ -60,23 +65,6 @@ { 'enum': 'FloppyDriveType', 'data': ['144', '288', '120', 'none', 'auto']} -## -# @BlockdevSnapshotInternal: -# -# @device: the device name or node-name of a root node to generate the snapshot -# from -# -# @name: the name of the internal snapshot to be created -# -# Notes: In transaction, if @name is empty, or any snapshot matching @name -# exists, the operation will fail. Only some image formats support it, -# for example, qcow2, rbd, and sheepdog. -# -# Since: 1.7 -## -{ 'struct': 'BlockdevSnapshotInternal', - 'data': { 'device': 'str', 'name': 'str' } } - ## # @PRManagerInfo: # @@ -84,8 +72,8 @@ # # @id: the identifier of the persistent reservation manager # -# @connected: true if the persistent reservation manager is connected to -# the underlying storage or helper +# @connected: true if the persistent reservation manager is connected +# to the underlying storage or helper # # Since: 3.0 ## @@ -95,235 +83,318 @@ ## # @query-pr-managers: # -# Returns a list of information about each persistent reservation manager. +# Returns a list of information about each persistent reservation +# manager. # -# Returns: a list of @PRManagerInfo for each persistent reservation manager +# Returns: a list of @PRManagerInfo for each persistent reservation +# manager # # Since: 3.0 ## { 'command': 'query-pr-managers', 'returns': ['PRManagerInfo'], 'allow-preconfig': true } - ## -# @blockdev-snapshot-internal-sync: +# @eject: # -# Synchronously take an internal snapshot of a block device, when the -# format of the image used supports it. If the name is an empty -# string, or a snapshot with name already exists, the operation will -# fail. +# Ejects the medium from a removable drive. # -# For the arguments, see the documentation of BlockdevSnapshotInternal. +# @device: Block device name # -# Returns: nothing on success +# @id: The name or QOM path of the guest device (since: 2.8) # -# If @device is not a valid block device, GenericError +# @force: If true, eject regardless of whether the drive is locked. +# If not specified, the default value is false. # -# If any snapshot matching @name exists, or @name is empty, -# GenericError +# Features: # -# If the format of the image used does not support it, -# BlockFormatFeatureNotSupported +# @deprecated: Member @device is deprecated. Use @id instead. # -# Since: 1.7 +# Returns: +# - Nothing on success +# - If @device is not a valid block device, DeviceNotFound +# +# Notes: Ejecting a device with no media results in success +# +# Since: 0.14 # # Example: # -# -> { "execute": "blockdev-snapshot-internal-sync", -# "arguments": { "device": "ide-hd0", -# "name": "snapshot0" } -# } +# -> { "execute": "eject", "arguments": { "id": "ide1-0-1" } } # <- { "return": {} } -# ## -{ 'command': 'blockdev-snapshot-internal-sync', - 'data': 'BlockdevSnapshotInternal' } +{ 'command': 'eject', + 'data': { '*device': { 'type': 'str', 'features': [ 'deprecated' ] }, + '*id': 'str', + '*force': 'bool' } } ## -# @blockdev-snapshot-delete-internal-sync: +# @blockdev-open-tray: # -# Synchronously delete an internal snapshot of a block device, when the format -# of the image used support it. The snapshot is identified by name or id or -# both. One of the name or id is required. Return SnapshotInfo for the -# successfully deleted snapshot. +# Opens a block device's tray. If there is a block driver state tree +# inserted as a medium, it will become inaccessible to the guest (but +# it will remain associated to the block device, so closing the tray +# will make it accessible again). # -# @device: the device name or node-name of a root node to delete the snapshot -# from +# If the tray was already open before, this will be a no-op. # -# @id: optional the snapshot's ID to be deleted +# Once the tray opens, a DEVICE_TRAY_MOVED event is emitted. There +# are cases in which no such event will be generated, these include: # -# @name: optional the snapshot's name to be deleted +# - if the guest has locked the tray, @force is false and the guest +# does not respond to the eject request +# - if the BlockBackend denoted by @device does not have a guest +# device attached to it +# - if the guest device does not have an actual tray # -# Returns: SnapshotInfo on success -# If @device is not a valid block device, GenericError -# If snapshot not found, GenericError -# If the format of the image used does not support it, -# BlockFormatFeatureNotSupported -# If @id and @name are both not specified, GenericError +# @device: Block device name # -# Since: 1.7 +# @id: The name or QOM path of the guest device (since: 2.8) +# +# @force: if false (the default), an eject request will be sent to the +# guest if it has locked the tray (and the tray will not be opened +# immediately); if true, the tray will be opened regardless of +# whether it is locked +# +# Features: +# +# @deprecated: Member @device is deprecated. Use @id instead. +# +# Since: 2.5 # # Example: # -# -> { "execute": "blockdev-snapshot-delete-internal-sync", -# "arguments": { "device": "ide-hd0", -# "name": "snapshot0" } -# } -# <- { "return": { -# "id": "1", -# "name": "snapshot0", -# "vm-state-size": 0, -# "date-sec": 1000012, -# "date-nsec": 10, -# "vm-clock-sec": 100, -# "vm-clock-nsec": 20 -# } -# } -# -## -{ 'command': 'blockdev-snapshot-delete-internal-sync', - 'data': { 'device': 'str', '*id': 'str', '*name': 'str'}, - 'returns': 'SnapshotInfo' } +# -> { "execute": "blockdev-open-tray", +# "arguments": { "id": "ide0-1-0" } } +# +# <- { "timestamp": { "seconds": 1418751016, +# "microseconds": 716996 }, +# "event": "DEVICE_TRAY_MOVED", +# "data": { "device": "ide1-cd0", +# "id": "ide0-1-0", +# "tray-open": true } } +# +# <- { "return": {} } +## +{ 'command': 'blockdev-open-tray', + 'data': { '*device': { 'type': 'str', 'features': [ 'deprecated' ] }, + '*id': 'str', + '*force': 'bool' } } ## -# @eject: -# -# Ejects a device from a removable drive. +# @blockdev-close-tray: # -# @device: Block device name (deprecated, use @id instead) +# Closes a block device's tray. If there is a block driver state tree +# associated with the block device (which is currently ejected), that +# tree will be loaded as the medium. # -# @id: The name or QOM path of the guest device (since: 2.8) +# If the tray was already closed before, this will be a no-op. # -# @force: If true, eject regardless of whether the drive is locked. -# If not specified, the default value is false. +# @device: Block device name # -# Returns: Nothing on success +# @id: The name or QOM path of the guest device (since: 2.8) # -# If @device is not a valid block device, DeviceNotFound +# Features: # -# Notes: Ejecting a device with no media results in success +# @deprecated: Member @device is deprecated. Use @id instead. # -# Since: 0.14.0 +# Since: 2.5 # # Example: # -# -> { "execute": "eject", "arguments": { "id": "ide1-0-1" } } +# -> { "execute": "blockdev-close-tray", +# "arguments": { "id": "ide0-1-0" } } +# +# <- { "timestamp": { "seconds": 1418751345, +# "microseconds": 272147 }, +# "event": "DEVICE_TRAY_MOVED", +# "data": { "device": "ide1-cd0", +# "id": "ide0-1-0", +# "tray-open": false } } +# # <- { "return": {} } ## -{ 'command': 'eject', - 'data': { '*device': 'str', - '*id': 'str', - '*force': 'bool' } } +{ 'command': 'blockdev-close-tray', + 'data': { '*device': { 'type': 'str', 'features': [ 'deprecated' ] }, + '*id': 'str' } } ## -# @nbd-server-start: +# @blockdev-remove-medium: # -# Start an NBD server listening on the given host and port. Block -# devices can then be exported using @nbd-server-add. The NBD -# server will present them as named exports; for example, another -# QEMU instance could refer to them as "nbd:HOST:PORT:exportname=NAME". +# Removes a medium (a block driver state tree) from a block device. +# That block device's tray must currently be open (unless there is no +# attached guest device). # -# @addr: Address on which to listen. -# @tls-creds: (optional) ID of the TLS credentials object. Since 2.6 +# If the tray is open and there is no medium inserted, this will be a +# no-op. # -# Returns: error if the server is already running. +# @id: The name or QOM path of the guest device # -# Since: 1.3.0 -## -{ 'command': 'nbd-server-start', - 'data': { 'addr': 'SocketAddressLegacy', - '*tls-creds': 'str'} } - -## -# @nbd-server-add: +# Since: 2.12 # -# Export a block node to QEMU's embedded NBD server. +# Example: # -# @device: The device name or node name of the node to be exported +# -> { "execute": "blockdev-remove-medium", +# "arguments": { "id": "ide0-1-0" } } # -# @name: Export name. If unspecified, the @device parameter is used as the -# export name. (Since 2.12) +# <- { "error": { "class": "GenericError", +# "desc": "Tray of device 'ide0-1-0' is not open" } } # -# @writable: Whether clients should be able to write to the device via the -# NBD connection (default false). - -# @bitmap: Also export the dirty bitmap reachable from @device, so the -# NBD client can use NBD_OPT_SET_META_CONTEXT with -# "qemu:dirty-bitmap:NAME" to inspect the bitmap. (since 4.0) +# -> { "execute": "blockdev-open-tray", +# "arguments": { "id": "ide0-1-0" } } # -# Returns: error if the server is not running, or export with the same name -# already exists. +# <- { "timestamp": { "seconds": 1418751627, +# "microseconds": 549958 }, +# "event": "DEVICE_TRAY_MOVED", +# "data": { "device": "ide1-cd0", +# "id": "ide0-1-0", +# "tray-open": true } } +# +# <- { "return": {} } # -# Since: 1.3.0 +# -> { "execute": "blockdev-remove-medium", +# "arguments": { "id": "ide0-1-0" } } +# +# <- { "return": {} } ## -{ 'command': 'nbd-server-add', - 'data': {'device': 'str', '*name': 'str', '*writable': 'bool', - '*bitmap': 'str' } } +{ 'command': 'blockdev-remove-medium', + 'data': { 'id': 'str' } } ## -# @NbdServerRemoveMode: +# @blockdev-insert-medium: +# +# Inserts a medium (a block driver state tree) into a block device. +# That block device's tray must currently be open (unless there is no +# attached guest device) and there must be no medium inserted already. # -# Mode for removing an NBD export. +# @id: The name or QOM path of the guest device # -# @safe: Remove export if there are no existing connections, fail otherwise. +# @node-name: name of a node in the block driver state graph # -# @hard: Drop all connections immediately and remove export. +# Since: 2.12 # -# Potential additional modes to be added in the future: +# Example: # -# hide: Just hide export from new clients, leave existing connections as is. -# Remove export after all clients are disconnected. +# -> { "execute": "blockdev-add", +# "arguments": { +# "node-name": "node0", +# "driver": "raw", +# "file": { "driver": "file", +# "filename": "fedora.iso" } } } +# <- { "return": {} } # -# soft: Hide export from new clients, answer with ESHUTDOWN for all further -# requests from existing clients. +# -> { "execute": "blockdev-insert-medium", +# "arguments": { "id": "ide0-1-0", +# "node-name": "node0" } } # -# Since: 2.12 +# <- { "return": {} } ## -{'enum': 'NbdServerRemoveMode', 'data': ['safe', 'hard']} +{ 'command': 'blockdev-insert-medium', + 'data': { 'id': 'str', + 'node-name': 'str'} } ## -# @nbd-server-remove: +# @BlockdevChangeReadOnlyMode: # -# Remove NBD export by name. +# Specifies the new read-only mode of a block device subject to the +# @blockdev-change-medium command. # -# @name: Export name. +# @retain: Retains the current read-only mode # -# @mode: Mode of command operation. See @NbdServerRemoveMode description. -# Default is 'safe'. +# @read-only: Makes the device read-only # -# Returns: error if -# - the server is not running -# - export is not found -# - mode is 'safe' and there are existing connections +# @read-write: Makes the device writable # -# Since: 2.12 +# Since: 2.3 ## -{ 'command': 'nbd-server-remove', - 'data': {'name': 'str', '*mode': 'NbdServerRemoveMode'} } +{ 'enum': 'BlockdevChangeReadOnlyMode', + 'data': ['retain', 'read-only', 'read-write'] } ## -# @nbd-server-stop: +# @blockdev-change-medium: +# +# Changes the medium inserted into a block device by ejecting the +# current medium and loading a new image file which is inserted as the +# new medium (this command combines blockdev-open-tray, +# blockdev-remove-medium, blockdev-insert-medium and +# blockdev-close-tray). +# +# @device: Block device name +# +# @id: The name or QOM path of the guest device (since: 2.8) +# +# @filename: filename of the new image to be loaded +# +# @format: format to open the new image with (defaults to the probed +# format) +# +# @read-only-mode: change the read-only mode of the device; defaults +# to 'retain' +# +# @force: if false (the default), an eject request through +# blockdev-open-tray will be sent to the guest if it has locked +# the tray (and the tray will not be opened immediately); if true, +# the tray will be opened regardless of whether it is locked. +# (since 7.1) # -# Stop QEMU's embedded NBD server, and unregister all devices previously -# added via @nbd-server-add. +# Features: # -# Since: 1.3.0 +# @deprecated: Member @device is deprecated. Use @id instead. +# +# Since: 2.5 +# +# Examples: +# +# 1. Change a removable medium +# +# -> { "execute": "blockdev-change-medium", +# "arguments": { "id": "ide0-1-0", +# "filename": "/srv/images/Fedora-12-x86_64-DVD.iso", +# "format": "raw" } } +# <- { "return": {} } +# +# 2. Load a read-only medium into a writable drive +# +# -> { "execute": "blockdev-change-medium", +# "arguments": { "id": "floppyA", +# "filename": "/srv/images/ro.img", +# "format": "raw", +# "read-only-mode": "retain" } } +# +# <- { "error": +# { "class": "GenericError", +# "desc": "Could not open '/srv/images/ro.img': Permission denied" } } +# +# -> { "execute": "blockdev-change-medium", +# "arguments": { "id": "floppyA", +# "filename": "/srv/images/ro.img", +# "format": "raw", +# "read-only-mode": "read-only" } } +# +# <- { "return": {} } ## -{ 'command': 'nbd-server-stop' } +{ 'command': 'blockdev-change-medium', + 'data': { '*device': { 'type': 'str', 'features': [ 'deprecated' ] }, + '*id': 'str', + 'filename': 'str', + '*format': 'str', + '*force': 'bool', + '*read-only-mode': 'BlockdevChangeReadOnlyMode' } } ## # @DEVICE_TRAY_MOVED: # -# Emitted whenever the tray of a removable device is moved by the guest or by -# HMP/QMP commands +# Emitted whenever the tray of a removable device is moved by the +# guest or by HMP/QMP commands # -# @device: Block device name. This is always present for compatibility -# reasons, but it can be empty ("") if the image does not -# have a device name associated. +# @device: Block device name. This is always present for +# compatibility reasons, but it can be empty ("") if the image +# does not have a device name associated. # # @id: The name or QOM path of the guest device (since 2.8) # -# @tray-open: true if the tray has been opened or false if it has been closed +# @tray-open: true if the tray has been opened or false if it has been +# closed # # Since: 1.1 # @@ -335,7 +406,6 @@ # "tray-open": true # }, # "timestamp": { "seconds": 1265044230, "microseconds": 450486 } } -# ## { 'event': 'DEVICE_TRAY_MOVED', 'data': { 'device': 'str', 'id': 'str', 'tray-open': 'bool' } } @@ -359,91 +429,167 @@ # "connected": true # }, # "timestamp": { "seconds": 1519840375, "microseconds": 450486 } } -# ## { 'event': 'PR_MANAGER_STATUS_CHANGED', 'data': { 'id': 'str', 'connected': 'bool' } } ## -# @QuorumOpType: +# @block_set_io_throttle: # -# An enumeration of the quorum operation types +# Change I/O throttle limits for a block drive. # -# @read: read operation +# Since QEMU 2.4, each device with I/O limits is member of a throttle +# group. # -# @write: write operation +# If two or more devices are members of the same group, the limits +# will apply to the combined I/O of the whole group in a round-robin +# fashion. Therefore, setting new I/O limits to a device will affect +# the whole group. # -# @flush: flush operation +# The name of the group can be specified using the 'group' parameter. +# If the parameter is unset, it is assumed to be the current group of +# that device. If it's not in any group yet, the name of the device +# will be used as the name for its group. # -# Since: 2.6 +# The 'group' parameter can also be used to move a device to a +# different group. In this case the limits specified in the +# parameters will be applied to the new group only. +# +# I/O limits can be disabled by setting all of them to 0. In this case +# the device will be removed from its group and the rest of its +# members will not be affected. The 'group' parameter is ignored. +# +# Returns: +# - Nothing on success +# - If @device is not a valid block device, DeviceNotFound +# +# Since: 1.1 +# +# Examples: +# +# -> { "execute": "block_set_io_throttle", +# "arguments": { "id": "virtio-blk-pci0/virtio-backend", +# "bps": 0, +# "bps_rd": 0, +# "bps_wr": 0, +# "iops": 512, +# "iops_rd": 0, +# "iops_wr": 0, +# "bps_max": 0, +# "bps_rd_max": 0, +# "bps_wr_max": 0, +# "iops_max": 0, +# "iops_rd_max": 0, +# "iops_wr_max": 0, +# "bps_max_length": 0, +# "iops_size": 0 } } +# <- { "return": {} } +# +# -> { "execute": "block_set_io_throttle", +# "arguments": { "id": "ide0-1-0", +# "bps": 1000000, +# "bps_rd": 0, +# "bps_wr": 0, +# "iops": 0, +# "iops_rd": 0, +# "iops_wr": 0, +# "bps_max": 8000000, +# "bps_rd_max": 0, +# "bps_wr_max": 0, +# "iops_max": 0, +# "iops_rd_max": 0, +# "iops_wr_max": 0, +# "bps_max_length": 60, +# "iops_size": 0 } } +# <- { "return": {} } ## -{ 'enum': 'QuorumOpType', - 'data': [ 'read', 'write', 'flush' ] } +{ 'command': 'block_set_io_throttle', 'boxed': true, + 'data': 'BlockIOThrottle', + 'allow-preconfig': true } ## -# @QUORUM_FAILURE: -# -# Emitted by the Quorum block driver if it fails to establish a quorum +# @block-latency-histogram-set: # -# @reference: device name if defined else node name +# Manage read, write and flush latency histograms for the device. # -# @sector-num: number of the first sector of the failed read operation +# If only @id parameter is specified, remove all present latency +# histograms for the device. Otherwise, add/reset some of (or all) +# latency histograms. # -# @sectors-count: failed read operation sector count +# @id: The name or QOM path of the guest device. # -# Note: This event is rate-limited. +# @boundaries: list of interval boundary values (see description in +# BlockLatencyHistogramInfo definition). If specified, all latency +# histograms are removed, and empty ones created for all io types +# with intervals corresponding to @boundaries (except for io +# types, for which specific boundaries are set through the +# following parameters). # -# Since: 2.0 +# @boundaries-read: list of interval boundary values for read latency +# histogram. If specified, old read latency histogram is removed, +# and empty one created with intervals corresponding to +# @boundaries-read. The parameter has higher priority then +# @boundaries. # -# Example: +# @boundaries-write: list of interval boundary values for write +# latency histogram. # -# <- { "event": "QUORUM_FAILURE", -# "data": { "reference": "usr1", "sector-num": 345435, "sectors-count": 5 }, -# "timestamp": { "seconds": 1344522075, "microseconds": 745528 } } +# @boundaries-zap: list of interval boundary values for zone append +# write latency histogram. # -## -{ 'event': 'QUORUM_FAILURE', - 'data': { 'reference': 'str', 'sector-num': 'int', 'sectors-count': 'int' } } - -## -# @QUORUM_REPORT_BAD: +# @boundaries-flush: list of interval boundary values for flush +# latency histogram. # -# Emitted to report a corruption of a Quorum file +# Returns: error if device is not found or any boundary arrays are +# invalid. # -# @type: quorum operation type (Since 2.6) +# Since: 4.0 # -# @error: error message. Only present on failure. This field -# contains a human-readable error message. There are no semantics other -# than that the block layer reported an error and clients should not -# try to interpret the error string. +# Example: # -# @node-name: the graph node name of the block driver state +# Set new histograms for all io types with intervals [0, 10), [10, +# 50), [50, 100), [100, +inf): # -# @sector-num: number of the first sector of the failed read operation +# -> { "execute": "block-latency-histogram-set", +# "arguments": { "id": "drive0", +# "boundaries": [10, 50, 100] } } +# <- { "return": {} } # -# @sectors-count: failed read operation sector count +# Example: # -# Note: This event is rate-limited. +# Set new histogram only for write, other histograms will remain not +# changed (or not created): # -# Since: 2.0 +# -> { "execute": "block-latency-histogram-set", +# "arguments": { "id": "drive0", +# "boundaries-write": [10, 50, 100] } } +# <- { "return": {} } # # Example: # -# 1. Read operation +# Set new histograms with the following intervals: read, flush: [0, +# 10), [10, 50), [50, 100), [100, +inf) write: [0, 1000), [1000, +# 5000), [5000, +inf) # -# { "event": "QUORUM_REPORT_BAD", -# "data": { "node-name": "node0", "sector-num": 345435, "sectors-count": 5, -# "type": "read" }, -# "timestamp": { "seconds": 1344522075, "microseconds": 745528 } } +# -> { "execute": "block-latency-histogram-set", +# "arguments": { "id": "drive0", +# "boundaries": [10, 50, 100], +# "boundaries-write": [1000, 5000] } } +# <- { "return": {} } # -# 2. Flush operation +# Example: # -# { "event": "QUORUM_REPORT_BAD", -# "data": { "node-name": "node0", "sector-num": 0, "sectors-count": 2097120, -# "type": "flush", "error": "Broken pipe" }, -# "timestamp": { "seconds": 1456406829, "microseconds": 291763 } } +# Remove all latency histograms: # +# -> { "execute": "block-latency-histogram-set", +# "arguments": { "id": "drive0" } } +# <- { "return": {} } ## -{ 'event': 'QUORUM_REPORT_BAD', - 'data': { 'type': 'QuorumOpType', '*error': 'str', 'node-name': 'str', - 'sector-num': 'int', 'sectors-count': 'int' } } +{ 'command': 'block-latency-histogram-set', + 'data': {'id': 'str', + '*boundaries': ['uint64'], + '*boundaries-read': ['uint64'], + '*boundaries-write': ['uint64'], + '*boundaries-zap': ['uint64'], + '*boundaries-flush': ['uint64'] }, + 'allow-preconfig': true }