I don't understand that claim. Which name column do you think we can delete, from which schema?
On Fri, Jan 10, 2020 at 05:14:44PM +0800, taoyunupt wrote: > Hi Ben, > It will be appreciated,if you give more explanation for the resaon > to summit this patch. In my opinion, it makes the "UUID" column be almost > the same with "name" column, if we need "name" column in the future? > > > > > > At 2020-01-10 11:39:22, "Han Zhou" <[email protected]> wrote: > >On Thu, Jan 9, 2020 at 12:48 PM Ben Pfaff <[email protected]> wrote: > >> > >> Requested-by: Leonid Ryzhyk <[email protected]> > >> Signed-off-by: Ben Pfaff <[email protected]> > >> --- > >> v1->v2: Improve test as suggested by Flavio Fernandes. > >> > >> Documentation/ref/ovsdb-server.7.rst | 9 +++++++++ > >> NEWS | 1 + > >> ovsdb/execution.c | 26 ++++++++++++++++++++++---- > >> ovsdb/transaction.c | 22 +++++++++++++++++++++- > >> ovsdb/transaction.h | 5 ++++- > >> tests/ovsdb-execution.at | 24 ++++++++++++++++++++++++ > >> tests/uuidfilt.py | 18 ++++++++++++++++-- > >> 7 files changed, 97 insertions(+), 8 deletions(-) > >> > >> diff --git a/Documentation/ref/ovsdb-server.7.rst > >b/Documentation/ref/ovsdb-server.7.rst > >> index bc533611cb4a..967761bdfb84 100644 > >> --- a/Documentation/ref/ovsdb-server.7.rst > >> +++ b/Documentation/ref/ovsdb-server.7.rst > >> @@ -546,6 +546,15 @@ condition can be either a 3-element JSON array as > >described in the RFC or a > >> boolean value. In case of an empty array an implicit true boolean value > >will be > >> considered. > >> > >> +5.2.1 Insert > >> +------------ > >> + > >> +As an extension, Open vSwitch 2.13 and later allow an optional ``uuid`` > >member > >> +to specify the UUID for the new row. The specified UUID must be unique > >within > >> +the table when it is inserted and not the UUID of a row previously > >deleted > >> +within the transaction. If the UUID violates these rules, then the > >operation > >> +fails with a ``duplicate uuid`` error. > >> + > >> 5.2.6 Wait, 5.2.7 Commit, 5.2.9 Comment > >> --------------------------------------- > >> > >> diff --git a/NEWS b/NEWS > >> index 965facaf852d..d8f82cd18af0 100644 > >> --- a/NEWS > >> +++ b/NEWS > >> @@ -34,6 +34,7 @@ Post-v2.12.0 > >> interval is increased to 60 seconds for the connection to the > >> replication server. This value is configurable with the unixctl > >> command - ovsdb-server/set-active-ovsdb-server-probe-interval. > >> + * ovsdb-server: New OVSDB extension to allow clients to specify row > >UUIDs. > >> > >> v2.12.0 - 03 Sep 2019 > >> --------------------- > >> diff --git a/ovsdb/execution.c b/ovsdb/execution.c > >> index f2cf3d72d45f..e45f3d6796a7 100644 > >> --- a/ovsdb/execution.c > >> +++ b/ovsdb/execution.c > >> @@ -1,4 +1,4 @@ > >> -/* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2017 Nicira, Inc. > >> +/* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2017, 2019 Nicira, Inc. > >> * > >> * Licensed under the Apache License, Version 2.0 (the "License"); > >> * you may not use this file except in compliance with the License. > >> @@ -329,11 +329,12 @@ ovsdb_execute_insert(struct ovsdb_execution *x, > >struct ovsdb_parser *parser, > >> { > >> struct ovsdb_table *table; > >> struct ovsdb_row *row = NULL; > >> - const struct json *uuid_name, *row_json; > >> + const struct json *uuid_json, *uuid_name, *row_json; > >> struct ovsdb_error *error; > >> struct uuid row_uuid; > >> > >> table = parse_table(x, parser, "table"); > >> + uuid_json = ovsdb_parser_member(parser, "uuid", OP_STRING | > >OP_OPTIONAL); > >> uuid_name = ovsdb_parser_member(parser, "uuid-name", OP_ID | > >OP_OPTIONAL); > >> row_json = ovsdb_parser_member(parser, "row", OP_OBJECT); > >> error = ovsdb_parser_get_error(parser); > >> @@ -341,6 +342,19 @@ ovsdb_execute_insert(struct ovsdb_execution *x, > >struct ovsdb_parser *parser, > >> return error; > >> } > >> > >> + if (uuid_json) { > >> + if (!uuid_from_string(&row_uuid, json_string(uuid_json))) { > >> + return ovsdb_syntax_error(uuid_json, NULL, "bad uuid"); > >> + } > >> + > >> + if (!ovsdb_txn_may_create_row(table, &row_uuid)) { > >> + return ovsdb_syntax_error(uuid_json, "duplicate uuid", > >> + "This UUID would duplicate a UUID " > >> + "already present within the table > >or " > >> + "deleted within the same > >transaction."); > >> + } > >> + } > >> + > >> if (uuid_name) { > >> struct ovsdb_symbol *symbol; > >> > >> @@ -350,9 +364,13 @@ ovsdb_execute_insert(struct ovsdb_execution *x, > >struct ovsdb_parser *parser, > >> "This \"uuid-name\" appeared on an > >" > >> "earlier \"insert\" operation."); > >> } > >> - row_uuid = symbol->uuid; > >> + if (uuid_json) { > >> + symbol->uuid = row_uuid; > >> + } else { > >> + row_uuid = symbol->uuid; > >> + } > >> symbol->created = true; > >> - } else { > >> + } else if (!uuid_json) { > >> uuid_generate(&row_uuid); > >> } > >> > >> diff --git a/ovsdb/transaction.c b/ovsdb/transaction.c > >> index 866fabe8df57..369436bffbf5 100644 > >> --- a/ovsdb/transaction.c > >> +++ b/ovsdb/transaction.c > >> @@ -1,4 +1,4 @@ > >> -/* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2017 Nicira, > >Inc. > >> +/* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2017, 2019 > >Nicira, Inc. > >> * > >> * Licensed under the Apache License, Version 2.0 (the "License"); > >> * you may not use this file except in compliance with the License. > >> @@ -1287,6 +1287,26 @@ ovsdb_txn_row_delete(struct ovsdb_txn *txn, const > >struct ovsdb_row *row_) > >> } > >> } > >> > >> +/* Returns true if 'row_uuid' may be used as the UUID for a newly > >created row > >> + * in 'table' (that is, that it is unique within 'table'), false > >otherwise. */ > >> +bool > >> +ovsdb_txn_may_create_row(const struct ovsdb_table *table, > >> + const struct uuid *row_uuid) > >> +{ > >> + /* If a row 'row_uuid' currently exists, disallow creating a > >duplicate. */ > >> + if (ovsdb_table_get_row(table, row_uuid)) { > >> + return false; > >> + } > >> + > >> + /* If a row 'row_uuid' previously existed in this transaction, > >disallow > >> + * creating a new row with the same UUID. */ > >> + if (find_txn_row(table, row_uuid)) { > >> + return false; > >> + } > >> + > >> + return true; > >> +} > >> + > >> void > >> ovsdb_txn_add_comment(struct ovsdb_txn *txn, const char *s) > >> { > >> diff --git a/ovsdb/transaction.h b/ovsdb/transaction.h > >> index ea6b53d3c2a3..6b5bb7f24b29 100644 > >> --- a/ovsdb/transaction.h > >> +++ b/ovsdb/transaction.h > >> @@ -1,4 +1,4 @@ > >> -/* Copyright (c) 2009, 2010, 2017 Nicira, Inc. > >> +/* Copyright (c) 2009, 2010, 2017, 2019 Nicira, Inc. > >> * > >> * Licensed under the Apache License, Version 2.0 (the "License"); > >> * you may not use this file except in compliance with the License. > >> @@ -53,6 +53,9 @@ struct ovsdb_row *ovsdb_txn_row_modify(struct ovsdb_txn > >*, > >> void ovsdb_txn_row_insert(struct ovsdb_txn *, struct ovsdb_row *); > >> void ovsdb_txn_row_delete(struct ovsdb_txn *, const struct ovsdb_row *); > >> > >> +bool ovsdb_txn_may_create_row(const struct ovsdb_table *, > >> + const struct uuid *row_uuid); > >> + > >> typedef bool ovsdb_txn_row_cb_func(const struct ovsdb_row *old, > >> const struct ovsdb_row *new, > >> const unsigned long int *changed, > >> diff --git a/tests/ovsdb-execution.at b/tests/ovsdb-execution.at > >> index 3129e73f4a09..e72bf0606978 100644 > >> --- a/tests/ovsdb-execution.at > >> +++ b/tests/ovsdb-execution.at > >> @@ -249,6 +249,30 @@ OVSDB_CHECK_EXECUTION([insert row, query table], > >> > > [{"rows":[{"_uuid":["uuid","<0>"],"_version":["uuid","<1>"],"name":"zero","number":0}]}] > >> ]]) > >> > >> +OVSDB_CHECK_EXECUTION([insert row with uuid, query table], > >> + [ordinal_schema], > >> +dnl Insert initial row. > >> + [[[["ordinals", > >> + {"op": "insert", > >> + "uuid": "ffffffff-971b-4cba-bf42-520515973b7e", > >> + "table": "ordinals", > >> + "row": {"number": 0, "name": "zero"}}]]], > >> +dnl Query row back. > >> + [[["ordinals", > >> + {"op": "select", > >> + "table": "ordinals", > >> + "where": []}]]], > >> +dnl Attempt to insert second row with same UUID (fails). > >> + [[["ordinals", > >> + {"op": "insert", > >> + "uuid": "ffffffff-971b-4cba-bf42-520515973b7e", > >> + "table": "ordinals", > >> + "row": {"number": 0, "name": "zero"}}]]]], > >> + [[[{"uuid":["uuid","ffffffff-971b-4cba-bf42-520515973b7e"]}] > >> > >+[{"rows":[{"_uuid":["uuid","ffffffff-971b-4cba-bf42-520515973b7e"],"_version":["uuid","<0>"],"name":"zero","number":0}]}] > >> +[{"details":"This UUID would duplicate a UUID already present within the > >table or deleted within the same transaction.","error":"duplicate > >uuid","syntax":"\"ffffffff-971b-4cba-bf42-520515973b7e\""}] > >> +]]) > >> + > >> OVSDB_CHECK_EXECUTION([insert rows, query by value], > >> [ordinal_schema], > >> [[[["ordinals", > >> diff --git a/tests/uuidfilt.py b/tests/uuidfilt.py > >> index ea7281296e22..bc49aa480e9e 100755 > >> --- a/tests/uuidfilt.py > >> +++ b/tests/uuidfilt.py > >> @@ -18,7 +18,8 @@ def sort_set(match): > >> > >> > >> u = '[0-9a-fA-F]' > >> -uuid_re = re.compile(r'%s{8}-%s{4}-%s{4}-%s{4}-%s{12}' % ((u,) * 5)) > >> +uuid_re = re.compile(r'%s{8}(?<!ffffffff)-%s{4}-%s{4}-%s{4}-%s{12}' > >> + % ((u,) * 5)) > >> set_re = re.compile(r'(\["set",\[(,?\["uuid","<\d+>"\])+\]\])') > >> > >> > >> @@ -43,7 +44,20 @@ def filter_uuids(src, dst): > >> > >> > >> if __name__ == '__main__': > >> - if len(sys.argv) > 1: > >> + if '--help' in sys.argv: > >> + print("""\ > >> +uuidfilt, for filtering UUIDs into numbered markers > >> +usage: %s [INPUT..] > OUTPUT > >> + or %s < INPUT > OUTPUT > >> + > >> +Reads each INPUT, locates UUIDs in the standard textual form, and > >> +converts them into numbered markers <0>, <1>, ..., <n>, where <0> > >> +stands in for each instance of the first unique UUID found, <1> for > >> +each instance of the second, and so on. > >> + > >> +UUIDs that begin with ffffffff are not converted to markers. > >> +""") > >> + elif len(sys.argv) > 1: > >> for src in sys.argv[1:]: > >> filter_uuids(open(src), sys.stdout) > >> else: > >> -- > >> 2.23.0 > >> > >> _______________________________________________ > >> dev mailing list > >> [email protected] > >> https://mail.openvswitch.org/mailman/listinfo/ovs-dev > > > >Acked-by: Han Zhou <[email protected]> > > > >(I also tested with ovsdb-client which works as expected. Maybe we can > >update the xxxctl tools to support specifying uuids for the "create" > >command as well) > >_______________________________________________ > >dev mailing list > >[email protected] > >https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
