From: Ben Pfaff Date: Tue, 8 Dec 2009 17:48:37 +0000 (-0800) Subject: ovsdb-idl: Update IDL data when "set" functions are called. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8bc915de7a08d5b4210ba768d56f15211927d1e7;p=openvswitch ovsdb-idl: Update IDL data when "set" functions are called. Until now, the "set" functions generated by the IDL updated the data in the database (during commit) but not the data exposed by the IDL in its data structures. This was just an oversight, so this commit causes the data exposed by IDL to be updated also. --- diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c index 32eddb19..22e20db0 100644 --- a/lib/ovsdb-idl.c +++ b/lib/ovsdb-idl.c @@ -212,6 +212,7 @@ ovsdb_idl_run(struct ovsdb_idl *idl) { int i; + assert(!idl->txn); jsonrpc_session_run(idl->session); for (i = 0; jsonrpc_session_is_connected(idl->session) && i < 50; i++) { struct jsonrpc_msg *msg, *reply; @@ -889,6 +890,11 @@ ovsdb_idl_txn_disassemble(struct ovsdb_idl_txn *txn) HMAP_FOR_EACH_SAFE (row, next, struct ovsdb_idl_row, txn_node, &txn->txn_rows) { + if (row->old && row->written) { + (row->table->class->unparse)(row); + ovsdb_idl_row_clear_arcs(row, false); + (row->table->class->parse)(row); + } ovsdb_idl_row_clear_new(row); free(row->prereqs); diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in index 98077387..d6fc14ab 100755 --- a/ovsdb/ovsdb-idlc.in +++ b/ovsdb/ovsdb-idlc.in @@ -159,13 +159,18 @@ def cBaseType(prefix, type, refTable=None): 'boolean': 'bool ', 'string': 'char *'}[type] -def cCopyType(dst, src, type, refTable=None): +def cCopyType(indent, dstVar, dst, src, type, refTable=None): + args = {'indent': indent, + 'dstVar': dstVar, + 'dst': dst, + 'src': src} if type == 'uuid' and refTable: - return "%s = %s->header_.uuid;" % (dst, src) + return ("%(indent)s%(dstVar)s = %(src)s;\n" + + "%(indent)s%(dst)s = %(src)s->header_.uuid;") % args elif type == 'string': - return "%s = xstrdup(%s);" % (dst, src) + return "%(indent)s%(dstVar)s = %(dst)s = xstrdup(%(src)s);" % args else: - return "%s = %s;" % (dst, src) + return "%(dstVar)s = %(dst)s = %(src)s;" % args def typeIsOptionalPointer(type): return (type.min == 0 and type.max == 1 and not type.value @@ -495,10 +500,10 @@ void print print " datum.n = 1;" print " datum.keys = xmalloc(sizeof *datum.keys);" - print " %s" % cCopyType("datum.keys[0].%s" % type.key, keyVar, type.key, type.keyRefTable) + print cCopyType(" ", "row->%s" % keyVar, "datum.keys[0].%s" % type.key, keyVar, type.key, type.keyRefTable) if type.value: print " datum.values = xmalloc(sizeof *datum.values);" - print " %s" % cCopyType("datum.values[0].%s" % type.value, valueVar, type.value, type.valueRefTable) + print cCopyType(" ", "row->%s" % valueVar, "datum.values[0].%s" % type.value, valueVar, type.value, type.valueRefTable) else: print " datum.values = NULL;" elif typeIsOptionalPointer(type): @@ -506,15 +511,22 @@ void print " if (%s) {" % keyVar print " datum.n = 1;" print " datum.keys = xmalloc(sizeof *datum.keys);" - print " %s" % cCopyType("datum.keys[0].%s" % type.key, keyVar, type.key, type.keyRefTable) + print cCopyType(" ", "row->%s" % keyVar, "datum.keys[0].%s" % type.key, keyVar, type.key, type.keyRefTable) print " } else {" print " datum.n = 0;" print " datum.keys = NULL;" + print " row->%s = NULL;" % keyVar print " }" print " datum.values = NULL;" else: print " size_t i;" print + print " free(row->%s);" % keyVar + print " row->%s = %s ? xmalloc(%s * sizeof *row->%s) : NULL;" % (keyVar, nVar, nVar, keyVar) + print " row->%s = %s;" % (nVar, nVar) + if type.value: + print " free(row->%s);" % valueVar + print " row->%s = xmalloc(%s * sizeof *row->%s);" % (valueVar, nVar, valueVar) print " datum.n = %s;" % nVar print " datum.keys = xmalloc(%s * sizeof *datum.keys);" % nVar if type.value: @@ -522,9 +534,9 @@ void else: print " datum.values = NULL;" print " for (i = 0; i < %s; i++) {" % nVar - print " %s" % cCopyType("datum.keys[i].%s" % type.key, "%s[i]" % keyVar, type.key, type.keyRefTable) + print cCopyType(" ", "row->%s[i]" % keyVar, "datum.keys[i].%s" % type.key, "%s[i]" % keyVar, type.key, type.keyRefTable) if type.value: - print " %s" % cCopyType("datum.values[i].%s" % type.value, "%s[i]" % valueVar, type.value, type.valueRefTable) + print cCopyType(" ", "row->%s[i]" % valueVar, "datum.values[i].%s" % type.value, "%s[i]" % valueVar, type.value, type.valueRefTable) print " }" print " ovsdb_idl_txn_write(&row->header_, &%(s)s_columns[%(S)s_COL_%(C)s], &datum);" \ % {'s': structName, diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c index 4949e393..1f697b4f 100644 --- a/tests/test-ovsdb.c +++ b/tests/test-ovsdb.c @@ -1476,13 +1476,8 @@ idl_set(struct ovsdb_idl *idl, char *commands, int step) } } - for (;;) { + while ((status = ovsdb_idl_txn_commit(txn)) == TXN_INCOMPLETE) { ovsdb_idl_run(idl); - status = ovsdb_idl_txn_commit(txn); - if (status != TXN_INCOMPLETE) { - break; - } - ovsdb_idl_wait(idl); poll_block(); }