[ovs-dev] [PATCH] ovsdb-idl: Properly handle conditional monitor update error
Andy Zhou
azhou at ovn.org
Tue Dec 20 09:50:28 UTC 2016
I have posted an updated version of this patch at:
https://patchwork.ozlabs.org/patch/707398/
On Fri, Dec 16, 2016 at 4:55 PM, Andy Zhou <azhou at ovn.org> wrote:
> When generating conditional monitoring update request, current code
> failed to update idl's 'request-id'. This bug causes the reply
> message of the update request, regardless an ACK or a NACK, be
> logged as an unexpected message at the debug level and ignored by
> the core idl logic.
>
> In addition, the idl should not generate another conditional
> monitoring update request when there is an outstanding request.
> So that the requests and their reply are properly serialized.
>
> Signed-off-by: Andy Zhou <azhou at ovn.org>
> ---
> lib/ovsdb-idl.c | 31 +++++++++++++++++++++++--------
> 1 file changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
> index 8ce228d..fa659a8 100644
> --- a/lib/ovsdb-idl.c
> +++ b/lib/ovsdb-idl.c
> @@ -454,8 +454,11 @@ ovsdb_idl_run(struct ovsdb_idl *idl)
> idl->schema = NULL;
> break;
>
> - case IDL_S_MONITORING:
> case IDL_S_MONITORING_COND:
> + /* Conditional monitor clauses were updated. */
> + break;
> +
> + case IDL_S_MONITORING:
> case IDL_S_NO_SCHEMA:
> default:
> OVS_NOT_REACHED();
> @@ -494,14 +497,22 @@ ovsdb_idl_run(struct ovsdb_idl *idl)
> idl->state = IDL_S_MONITOR_REQUESTED;
> }
> } else if (msg->type == JSONRPC_ERROR
> + && idl->state == IDL_S_MONITORING_COND
> + && idl->request_id
> + && json_equal(idl->request_id, msg->id)) {
> + json_destroy(idl->request_id);
> + idl->request_id = NULL;
> + VLOG_ERR("%s: conditional monitor update failed",
> + jsonrpc_session_get_name(idl->session));
> + } else if (msg->type == JSONRPC_ERROR
> && idl->state == IDL_S_SCHEMA_REQUESTED
> && idl->request_id
> && json_equal(idl->request_id, msg->id)) {
> - json_destroy(idl->request_id);
> - idl->request_id = NULL;
> - VLOG_ERR("%s: requested schema not found",
> - jsonrpc_session_get_name(idl->session));
> - idl->state = IDL_S_NO_SCHEMA;
> + json_destroy(idl->request_id);
> + idl->request_id = NULL;
> + VLOG_ERR("%s: requested schema not found",
> + jsonrpc_session_get_name(idl->session));
> + idl->state = IDL_S_NO_SCHEMA;
> } else if ((msg->type == JSONRPC_ERROR
> || msg->type == JSONRPC_REPLY)
> && ovsdb_idl_txn_process_reply(idl, msg)) {
> @@ -1021,8 +1032,11 @@ ovsdb_idl_send_cond_change(struct ovsdb_idl *idl)
> struct json *params, *json_uuid;
> struct jsonrpc_msg *request;
>
> + /* When 'idl-request_id' is not NULL, there is an outstanding
> + * conditional monitoring update request that we have not heard
> + * from the server yet. Don't generate another request in this case.
> */
> if (!idl->cond_changed || !jsonrpc_session_is_connected(idl->session)
> ||
> - idl->state != IDL_S_MONITORING_COND) {
> + idl->state != IDL_S_MONITORING_COND || idl->request_id) {
> return;
> }
>
> @@ -1058,7 +1072,8 @@ ovsdb_idl_send_cond_change(struct ovsdb_idl *idl)
> params = json_array_create_3(json_uuid, json_string_create(uuid),
> monitor_cond_change_requests);
>
> - request = jsonrpc_create_request("monitor_cond_change", params,
> NULL);
> + request = jsonrpc_create_request("monitor_cond_change", params,
> + &idl->request_id);
> jsonrpc_session_send(idl->session, request);
> }
> idl->cond_changed = false;
> --
> 2.7.4
>
>
More information about the dev
mailing list