qmp event: Refactor QUORUM_REPORT_BAD
Introduce QuorumOpType, and make QUORUM_REPORT_BAD compatible with it. Cc: Dr. David Alan Gilbert <dgilbert@redhat.com> Cc: Wen Congyang <wency@cn.fujitsu.com> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> Signed-off-by: Changlong Xie <xiecl.fnst@cn.fujitsu.com> Reviewed-by: Alberto Garcia <berto@igalia.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									58346b82ed
								
							
						
					
					
						commit
						0ae053b7e1
					
				| 
						 | 
					@ -215,14 +215,16 @@ static QuorumAIOCB *quorum_aio_get(BDRVQuorumState *s,
 | 
				
			||||||
    return acb;
 | 
					    return acb;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void quorum_report_bad(QuorumAIOCB *acb, char *node_name, int ret)
 | 
					static void quorum_report_bad(QuorumOpType type, uint64_t sector_num,
 | 
				
			||||||
 | 
					                              int nb_sectors, char *node_name, int ret)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const char *msg = NULL;
 | 
					    const char *msg = NULL;
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        msg = strerror(-ret);
 | 
					        msg = strerror(-ret);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    qapi_event_send_quorum_report_bad(!!msg, msg, node_name,
 | 
					
 | 
				
			||||||
                                      acb->sector_num, acb->nb_sectors, &error_abort);
 | 
					    qapi_event_send_quorum_report_bad(type, !!msg, msg, node_name,
 | 
				
			||||||
 | 
					                                      sector_num, nb_sectors, &error_abort);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void quorum_report_failure(QuorumAIOCB *acb)
 | 
					static void quorum_report_failure(QuorumAIOCB *acb)
 | 
				
			||||||
| 
						 | 
					@ -282,6 +284,7 @@ static void quorum_aio_cb(void *opaque, int ret)
 | 
				
			||||||
    QuorumChildRequest *sacb = opaque;
 | 
					    QuorumChildRequest *sacb = opaque;
 | 
				
			||||||
    QuorumAIOCB *acb = sacb->parent;
 | 
					    QuorumAIOCB *acb = sacb->parent;
 | 
				
			||||||
    BDRVQuorumState *s = acb->common.bs->opaque;
 | 
					    BDRVQuorumState *s = acb->common.bs->opaque;
 | 
				
			||||||
 | 
					    QuorumOpType type;
 | 
				
			||||||
    bool rewrite = false;
 | 
					    bool rewrite = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (acb->is_read && s->read_pattern == QUORUM_READ_PATTERN_FIFO) {
 | 
					    if (acb->is_read && s->read_pattern == QUORUM_READ_PATTERN_FIFO) {
 | 
				
			||||||
| 
						 | 
					@ -300,12 +303,14 @@ static void quorum_aio_cb(void *opaque, int ret)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    type = acb->is_read ? QUORUM_OP_TYPE_READ : QUORUM_OP_TYPE_WRITE;
 | 
				
			||||||
    sacb->ret = ret;
 | 
					    sacb->ret = ret;
 | 
				
			||||||
    acb->count++;
 | 
					    acb->count++;
 | 
				
			||||||
    if (ret == 0) {
 | 
					    if (ret == 0) {
 | 
				
			||||||
        acb->success_count++;
 | 
					        acb->success_count++;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        quorum_report_bad(acb, sacb->aiocb->bs->node_name, ret);
 | 
					        quorum_report_bad(type, acb->sector_num, acb->nb_sectors,
 | 
				
			||||||
 | 
					                          sacb->aiocb->bs->node_name, ret);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    assert(acb->count <= s->num_children);
 | 
					    assert(acb->count <= s->num_children);
 | 
				
			||||||
    assert(acb->success_count <= s->num_children);
 | 
					    assert(acb->success_count <= s->num_children);
 | 
				
			||||||
| 
						 | 
					@ -338,7 +343,9 @@ static void quorum_report_bad_versions(BDRVQuorumState *s,
 | 
				
			||||||
            continue;
 | 
					            continue;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        QLIST_FOREACH(item, &version->items, next) {
 | 
					        QLIST_FOREACH(item, &version->items, next) {
 | 
				
			||||||
            quorum_report_bad(acb, s->children[item->index]->bs->node_name, 0);
 | 
					            quorum_report_bad(QUORUM_OP_TYPE_READ, acb->sector_num,
 | 
				
			||||||
 | 
					                              acb->nb_sectors,
 | 
				
			||||||
 | 
					                              s->children[item->index]->bs->node_name, 0);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -325,6 +325,7 @@ Emitted to report a corruption of a Quorum file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Data:
 | 
					Data:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- "type":          Quorum operation type
 | 
				
			||||||
- "error":         Error message (json-string, optional)
 | 
					- "error":         Error message (json-string, optional)
 | 
				
			||||||
                   Only present on failure.  This field contains a human-readable
 | 
					                   Only present on failure.  This field contains a human-readable
 | 
				
			||||||
                   error message.  There are no semantics other than that the
 | 
					                   error message.  There are no semantics other than that the
 | 
				
			||||||
| 
						 | 
					@ -336,10 +337,18 @@ Data:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Example:
 | 
					Example:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Read operation:
 | 
				
			||||||
{ "event": "QUORUM_REPORT_BAD",
 | 
					{ "event": "QUORUM_REPORT_BAD",
 | 
				
			||||||
     "data": { "node-name": "node0", "sector-num": 345435, "sectors-count": 5 },
 | 
					     "data": { "node-name": "node0", "sector-num": 345435, "sectors-count": 5,
 | 
				
			||||||
 | 
					               "type": "read" },
 | 
				
			||||||
     "timestamp": { "seconds": 1344522075, "microseconds": 745528 } }
 | 
					     "timestamp": { "seconds": 1344522075, "microseconds": 745528 } }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Flush operation:
 | 
				
			||||||
 | 
					{ "event": "QUORUM_REPORT_BAD",
 | 
				
			||||||
 | 
					     "data": { "node-name": "node0", "sector-num": 0, "sectors-count": 2097120,
 | 
				
			||||||
 | 
					               "type": "flush", "error": "Broken pipe" },
 | 
				
			||||||
 | 
					     "timestamp": { "seconds": 1456406829, "microseconds": 291763 } }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Note: this event is rate-limited.
 | 
					Note: this event is rate-limited.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RESET
 | 
					RESET
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -196,3 +196,19 @@
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
{ 'event': 'DEVICE_TRAY_MOVED',
 | 
					{ 'event': 'DEVICE_TRAY_MOVED',
 | 
				
			||||||
  'data': { 'device': 'str', 'tray-open': 'bool' } }
 | 
					  'data': { 'device': 'str', 'tray-open': 'bool' } }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##
 | 
				
			||||||
 | 
					# @QuorumOpType
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# An enumeration of the quorum operation types
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# @read: read operation
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# @write: write operation
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# @flush: flush operation
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Since: 2.6
 | 
				
			||||||
 | 
					##
 | 
				
			||||||
 | 
					{ 'enum': 'QuorumOpType',
 | 
				
			||||||
 | 
					  'data': [ 'read', 'write', 'flush' ] }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -325,6 +325,8 @@
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Emitted to report a corruption of a Quorum file
 | 
					# Emitted to report a corruption of a Quorum file
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					# @type: quorum operation type (Since 2.6)
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
# @error: #optional, error message. Only present on failure. This field
 | 
					# @error: #optional, error message. Only present on failure. This field
 | 
				
			||||||
#         contains a human-readable error message. There are no semantics other
 | 
					#         contains a human-readable error message. There are no semantics other
 | 
				
			||||||
#         than that the block layer reported an error and clients should not
 | 
					#         than that the block layer reported an error and clients should not
 | 
				
			||||||
| 
						 | 
					@ -339,7 +341,7 @@
 | 
				
			||||||
# Since: 2.0
 | 
					# Since: 2.0
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
{ 'event': 'QUORUM_REPORT_BAD',
 | 
					{ 'event': 'QUORUM_REPORT_BAD',
 | 
				
			||||||
  'data': { '*error': 'str', 'node-name': 'str',
 | 
					  'data': { 'type': 'QuorumOpType', '*error': 'str', 'node-name': 'str',
 | 
				
			||||||
            'sector-num': 'int', 'sectors-count': 'int' } }
 | 
					            'sector-num': 'int', 'sectors-count': 'int' } }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##
 | 
					##
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue