Hi, Ilya,

After applying the patch, the test suite has passed.

Looking forward to your complete fix.



Ilya Maximets <[email protected]> 于2023年7月21日周五 21:09写道:

> On 7/21/23 14:44, Peng He wrote:
> > Hi, Ilya,
> >
> > Suppose you have a column which is a set with limited integers (suppose
> min: 0, max: 2), the following operation will generate a record in db file
> with 3 integers:
> >
> > first, set column A to [0],
> > then, set column A to [1,2],
> >
> > after that the column A is recorded as [0,1,2], as [0] diff [1,2] == [0,
> 1, 2].
>
> Hmm, good catch!
>
> The file is correct.  However, the ovsdb-server is too strict while reading
> these records.  Could you try the following change:
>
> diff --git a/ovsdb/file.c b/ovsdb/file.c
> index 400b34794..6e7e47ca6 100644
> --- a/ovsdb/file.c
> +++ b/ovsdb/file.c
> @@ -107,7 +107,14 @@ ovsdb_file_update_row_from_json(struct ovsdb_row
> *row, bool converting,
>                                        column_name, schema->name);
>          }
>
> -        error = ovsdb_datum_from_json(&datum, &column->type, node->data,
> NULL);
> +        if (row_contains_diff) {
> +            /* Diff may violate the type size rules. */
> +            error = ovsdb_transient_datum_from_json(&datum, &column->type,
> +                                                    node->data);
> +        } else {
> +            error = ovsdb_datum_from_json(&datum, &column->type,
> +                                          node->data, NULL);
> +        }
>          if (error) {
>              return error;
>          }
> ---
>
> ?
>
> The type constraints will be evaluated later while applying the diff
> to the existing row.
>
> Best regards, Ilya Maximets.
>
> > Such a bug can be reproduced by a test suite below:
> >
> >
> > AT_SETUP([ovsdb-server diff columns])
> > on_exit 'kill `cat *.pid`'
> > AT_DATA([schema],
> >   [[{"name": "mydb",
> >      "tables": {
> >        "Root": {
> >          "columns": {
> >            "managers": {
> >              "type": {
> >                "key": {"type": "uuid", "refTable": "Manager"},
> >                "min": 0,
> >                "max": "unlimited"}}}},
> >        "Manager": {
> >          "columns": {
> >            "target": {
> >              "type": "string"},
> >            "read_only": {
> >              "type": {
> >                "key": "boolean",
> >                "min": 0,
> >                "max": 1}},
> >            "is_connected": {
> >              "type": {
> >                "key": "boolean",
> >                "min": 0,
> >                "max": 1}}}},
> >        "ordinals": {
> >          "columns": {
> >            "number": {"type": {
> >                       "key": {"type" : "integer"},
> >                       "min": 0,
> >                       "max": 2}},
> >            "name": {"type": "string"}},
> >          "indexes": [["name"]]}
> >     },
> >      "version": "5.1.3",
> >      "cksum": "12345678 9"
> > }
> > ]])
> > AT_CHECK([ovsdb-tool create db schema], [0], [ignore], [ignore])
> > AT_CHECK(
> >   [[ovsdb-tool transact db \
> >      '["mydb",
> >        {"op": "insert",
> >         "table": "Root",
> >         "row": {
> >           "managers": ["set", [["named-uuid", "x"]]]}},
> >        {"op": "insert",
> >         "table": "Manager",
> >         "uuid-name": "x",
> >         "row": {"target": "ptcp:0:127.0.0.1",
> >                "read_only": false}}]']], [0], [ignore], [ignore])
> >
> > AT_CHECK([ovsdb-server --detach --no-chdir --log-file --pidfile
> --remote=db:mydb,Root,managers db], [0], [ignore], [ignore])
> > PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
> > AT_CHECK([ovsdb-client get-schema-version tcp:127.0.0.1:$TCP_PORT
> mydb], [0], [5.1.3
> > ])
> >
> > AT_CHECK([ovsdb-client transact tcp:127.0.0.1:$TCP_PORT \
> >         ['["mydb",
> >          {"op": "insert",
> >           "table": "ordinals",
> >           "row": {"name": "two", "number": 0}}
> >          ]']], [0], [stdout], [ignore])
> >
> > AT_CHECK([ovsdb-client transact tcp:127.0.0.1:$TCP_PORT \
> >         ['["mydb",
> >          {"op": "update",
> >           "table": "ordinals",
> >           "where": [["name", "==", "two"]],
> >           "row": {"number": ["set", [1,2]]}}
> >          ]']], [0], [stdout], [ignore])
> >
> > AT_CHECK([ovs-appctl -t ovsdb-server exit])
> > AT_CHECK([ovsdb-server --detach --no-chdir --log-file --pidfile
> --remote=db:mydb,Root,managers db], [0], [ignore], [ignore])
> >
> > OVSDB_SERVER_SHUTDOWN(["
> >   /No status column present in the Manager table/d
> > "])
> > AT_CLEANUP
> >
> > when reboot ovsdb-server, it will warn in the log:
> > 2023-07-21T12:43:55Z|00001|vlog|INFO|opened log file
> /root/ovs/tests/testsuite.dir/2044/ovsdb-server.log
> > 2023-07-21T12:43:55Z|00002|ovsdb_server|ERR|syntax "["set",[0,1,2]]":
> syntax error: set must have 0 to 2 members but 3 are present
> >
> >
> > --
> > hepeng
>
>

-- 
hepeng
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to