2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-22 01:51:26 +00:00

ovsdb: relay: Fix handling of XOR updates with size constraints.

Relay servers apply updates via ovsdb_table_execute_update().  XOR
updates contain datum diffs, and datum diffs can be larger than the
type constraints.  Currently, relay will fail to parse such update
into ovsdb row triggering a syntax error and a re-connection.

Fix that by relaxing the size constraints for this kind of updates.

Fixes: 026c77c58ddb ("ovsdb: New ovsdb 'relay' service model.")
Acked-by: Dumitru Ceara <dceara@redhat.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
This commit is contained in:
Ilya Maximets 2023-07-25 11:32:19 +02:00
parent e062465a88
commit 2f1b430645
5 changed files with 24 additions and 14 deletions

View File

@ -320,7 +320,7 @@ parse_row(const struct json *json, const struct ovsdb_table *table,
}
row = ovsdb_row_create(table);
error = ovsdb_row_from_json(row, json, symtab, columns);
error = ovsdb_row_from_json(row, json, symtab, columns, false);
if (error) {
ovsdb_row_destroy(row);
return error;
@ -764,7 +764,7 @@ ovsdb_execute_wait(struct ovsdb_execution *x, struct ovsdb_parser *parser,
row = ovsdb_row_create(table);
error = ovsdb_row_from_json(row, rows->array.elems[i], x->symtab,
NULL);
NULL, false);
if (error) {
ovsdb_row_destroy(row);
break;

View File

@ -302,12 +302,14 @@ ovsdb_row_columns_to_string(const struct ovsdb_row *row,
struct ovsdb_error *
ovsdb_row_from_json(struct ovsdb_row *row, const struct json *json,
struct ovsdb_symbol_table *symtab,
struct ovsdb_column_set *included)
struct ovsdb_column_set *included, bool is_diff)
{
struct ovsdb_table_schema *schema = row->table->schema;
struct ovsdb_error *error;
struct shash_node *node;
ovs_assert(!is_diff || !symtab);
if (json->type != JSON_OBJECT) {
return ovsdb_syntax_error(json, NULL, "row must be JSON object");
}
@ -324,8 +326,13 @@ ovsdb_row_from_json(struct ovsdb_row *row, const struct json *json,
column_name, schema->name);
}
error = ovsdb_datum_from_json(&datum, &column->type, node->data,
symtab);
if (is_diff) {
error = ovsdb_transient_datum_from_json(&datum, &column->type,
node->data);
} else {
error = ovsdb_datum_from_json(&datum, &column->type, node->data,
symtab);
}
if (error) {
return error;
}

View File

@ -114,7 +114,8 @@ void ovsdb_row_columns_to_string(const struct ovsdb_row *,
struct ovsdb_error *ovsdb_row_from_json(struct ovsdb_row *,
const struct json *,
struct ovsdb_symbol_table *,
struct ovsdb_column_set *included)
struct ovsdb_column_set *included,
bool is_diff)
OVS_WARN_UNUSED_RESULT;
struct json *ovsdb_row_to_json(const struct ovsdb_row *,
const struct ovsdb_column_set *include);

View File

@ -368,7 +368,8 @@ ovsdb_table_execute_insert(struct ovsdb_txn *txn, const struct uuid *row_uuid,
struct ovsdb_row *row = ovsdb_row_create(table);
struct ovsdb_error *error = ovsdb_row_from_json(row, json_row, NULL, NULL);
struct ovsdb_error *error = ovsdb_row_from_json(row, json_row,
NULL, NULL, false);
if (!error) {
*ovsdb_row_get_uuid_rw(row) = *row_uuid;
ovsdb_txn_row_insert(txn, row);
@ -411,7 +412,7 @@ ovsdb_table_execute_update(struct ovsdb_txn *txn, const struct uuid *row_uuid,
struct ovsdb_column_set columns = OVSDB_COLUMN_SET_INITIALIZER;
struct ovsdb_row *update = ovsdb_row_create(table);
struct ovsdb_error *error = ovsdb_row_from_json(update, json_row,
NULL, &columns);
NULL, &columns, xor);
if (!error && (xor || !ovsdb_row_equal_columns(row, update, &columns))) {
error = ovsdb_row_update_columns(ovsdb_txn_row_modify(txn, row),

View File

@ -870,7 +870,8 @@ do_parse_rows(struct ovs_cmdl_context *ctx)
row = ovsdb_row_create(table);
json = unbox_json(parse_json(ctx->argv[i]));
check_ovsdb_error(ovsdb_row_from_json(row, json, NULL, &columns));
check_ovsdb_error(ovsdb_row_from_json(row, json, NULL,
&columns, false));
json_destroy(json);
print_and_free_json(ovsdb_row_to_json(row, &all_columns));
@ -937,7 +938,7 @@ do_compare_rows(struct ovs_cmdl_context *ctx)
}
names[i] = xstrdup(json->array.elems[0]->string);
check_ovsdb_error(ovsdb_row_from_json(rows[i], json->array.elems[1],
NULL, NULL));
NULL, NULL, false));
json_destroy(json);
}
for (i = 0; i < n_rows; i++) {
@ -1050,7 +1051,7 @@ do_evaluate_condition__(struct ovs_cmdl_context *ctx, int mode)
for (i = 0; i < n_rows; i++) {
rows[i] = ovsdb_row_create(table);
check_ovsdb_error(ovsdb_row_from_json(rows[i], json->array.elems[i],
NULL, NULL));
NULL, NULL, false));
}
json_destroy(json);
@ -1224,7 +1225,7 @@ do_execute_mutations(struct ovs_cmdl_context *ctx)
for (i = 0; i < n_rows; i++) {
rows[i] = ovsdb_row_create(table);
check_ovsdb_error(ovsdb_row_from_json(rows[i], json->array.elems[i],
NULL, NULL));
NULL, NULL, false));
}
json_destroy(json);
@ -1338,7 +1339,7 @@ do_query(struct ovs_cmdl_context *ctx)
struct ovsdb_row *row = ovsdb_row_create(table);
uuid_generate(ovsdb_row_get_uuid_rw(row));
check_ovsdb_error(ovsdb_row_from_json(row, json->array.elems[i],
NULL, NULL));
NULL, NULL, false));
if (ovsdb_table_get_row(table, ovsdb_row_get_uuid(row))) {
ovs_fatal(0, "duplicate UUID "UUID_FMT" in table",
UUID_ARGS(ovsdb_row_get_uuid(row)));
@ -1445,7 +1446,7 @@ do_query_distinct(struct ovs_cmdl_context *ctx)
row = ovsdb_row_create(table);
uuid_generate(ovsdb_row_get_uuid_rw(row));
check_ovsdb_error(ovsdb_row_from_json(row, json->array.elems[i],
NULL, NULL));
NULL, NULL, false));
/* Initialize row and find equivalence class. */
rows[i].uuid = *ovsdb_row_get_uuid(row);