From 97f7803b8eb6f9967ed6090eec1cd2533bad2afe Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 11 Jun 2010 13:56:36 -0700 Subject: [PATCH] ovsdb-server: Improve logging for referential integrity violations. This may help with bug #2727 "ovs-vsctl transaction error while changing VM power state", if it is reproducible. --- ovsdb/transaction.c | 15 ++++++++++----- tests/ovsdb-execution.at | 2 +- tests/ovsdb-idl.at | 10 +++++----- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/ovsdb/transaction.c b/ovsdb/transaction.c index 218fbce3..bfa2fcba 100644 --- a/ovsdb/transaction.c +++ b/ovsdb/transaction.c @@ -152,7 +152,8 @@ find_txn_row(const struct ovsdb_table *table, const struct uuid *uuid) } static struct ovsdb_error * WARN_UNUSED_RESULT -ovsdb_txn_adjust_atom_refs(struct ovsdb_txn *txn, +ovsdb_txn_adjust_atom_refs(struct ovsdb_txn *txn, const struct ovsdb_row *r, + const struct ovsdb_column *c, const struct ovsdb_base_type *base, const union ovsdb_atom *atoms, unsigned int n, int delta) @@ -174,8 +175,12 @@ ovsdb_txn_adjust_atom_refs(struct ovsdb_txn *txn, txn_row = ovsdb_txn_row_modify(txn, row)->txn_row; } else { return ovsdb_error("referential integrity violation", - "reference to nonexistent row " - UUID_FMT, UUID_ARGS(uuid)); + "Table %s column %s row "UUID_FMT" " + "references nonexistent row "UUID_FMT" in " + "table %s.", + r->table->schema->name, c->name, + UUID_ARGS(ovsdb_row_get_uuid(r)), + UUID_ARGS(uuid), table->schema->name); } } txn_row->n_refs += delta; @@ -191,10 +196,10 @@ ovsdb_txn_adjust_row_refs(struct ovsdb_txn *txn, const struct ovsdb_row *r, const struct ovsdb_datum *field = &r->fields[column->index]; struct ovsdb_error *error; - error = ovsdb_txn_adjust_atom_refs(txn, &column->type.key, + error = ovsdb_txn_adjust_atom_refs(txn, r, column, &column->type.key, field->keys, field->n, delta); if (!error) { - error = ovsdb_txn_adjust_atom_refs(txn, &column->type.value, + error = ovsdb_txn_adjust_atom_refs(txn, r, column, &column->type.value, field->values, field->n, delta); } return error; diff --git a/tests/ovsdb-execution.at b/tests/ovsdb-execution.at index a6f14355..394fcba7 100644 --- a/tests/ovsdb-execution.at +++ b/tests/ovsdb-execution.at @@ -580,7 +580,7 @@ OVSDB_CHECK_EXECUTION([referential integrity -- mutual references], "table": "b", "where": [["b", "==", 1]]}]]]], [[[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]}] -[{"uuid":["uuid","<2>"]},{"details":"reference to nonexistent row <3>","error":"referential integrity violation"}] +[{"uuid":["uuid","<2>"]},{"details":"Table a column a2b row <2> references nonexistent row <3> in table b.","error":"referential integrity violation"}] [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}] [{"count":1},{"details":"cannot delete b row <1> because of 1 remaining reference(s)","error":"referential integrity violation"}] [{"count":1},{"details":"cannot delete a row <0> because of 1 remaining reference(s)","error":"referential integrity violation"}] diff --git a/tests/ovsdb-idl.at b/tests/ovsdb-idl.at index 9b90b032..9223de3b 100644 --- a/tests/ovsdb-idl.at +++ b/tests/ovsdb-idl.at @@ -265,11 +265,11 @@ OVSDB_CHECK_IDL([self-linking idl, inconsistent ops], "where": []}]' \ ]], [[000: empty -001: {"error":null,"result":[{"uuid":["uuid","<0>"]},{"details":"reference to nonexistent row <1>","error":"referential integrity violation"}]} +001: {"error":null,"result":[{"uuid":["uuid","<0>"]},{"details":"Table link1 column k row <0> references nonexistent row <1> in table link1.","error":"referential integrity violation"}]} 002: {"error":null,"result":[{"uuid":["uuid","<2>"]},{"uuid":["uuid","<3>"]}]} 003: i=1 k=1 ka=[] l2= uuid=<2> 003: i=2 k=1 ka=[] l2= uuid=<3> -004: {"error":null,"result":[{"count":2},{"details":"reference to nonexistent row <4>","error":"referential integrity violation"}]} +004: {"error":null,"result":[{"count":2},{"details":"Table link1 column k row <2> references nonexistent row <4> in table link1.","error":"referential integrity violation"}]} 005: {"error":null,"result":[{"count":1},{"details":"cannot delete link1 row <2> because of 1 remaining reference(s)","error":"referential integrity violation"}]} 006: {"error":null,"result":[{"count":1}]} 007: i=1 k=1 ka=[] l2= uuid=<2> @@ -305,8 +305,8 @@ OVSDB_CHECK_IDL([self-linking idl, sets], '["idltest", {"op": "update", "table": "link1", - "where": [], - "row": {"ka": ["set", [["uuid", "#0#"], ["uuid", "88702e78-845b-4a6e-ad08-cf68922ae84a"], ["uuid", "#2#"], ["uuid", "1ac2b12e-b767-4805-a55d-43976e40c465"]]]}}]' \ + "where": [["i", "==", 2]], + "row": {"ka": ["set", [["uuid", "#0#"], ["uuid", "88702e78-845b-4a6e-ad08-cf68922ae84a"], ["uuid", "#2#"]]]}}]' \ '+["idltest", {"op": "delete", "table": "link1", @@ -322,7 +322,7 @@ OVSDB_CHECK_IDL([self-linking idl, sets], 004: i=1 k=0 ka=[0 1 2 3] l2= uuid=<1> 004: i=2 k=0 ka=[0 1 2 3] l2= uuid=<2> 004: i=3 k=0 ka=[0 1 2 3] l2= uuid=<3> -005: {"error":null,"result":[{"count":4},{"details":"reference to nonexistent row <4>","error":"referential integrity violation"}]} +005: {"error":null,"result":[{"count":1},{"details":"Table link1 column ka row <2> references nonexistent row <4> in table link1.","error":"referential integrity violation"}]} 006: {"error":null,"result":[{"count":4}]} 007: empty 008: done -- 2.30.2