Revert "ovsdb-data: New functions for predicting serialized length of data."
authorBen Pfaff <blp@nicira.com>
Wed, 2 Apr 2014 14:10:40 +0000 (07:10 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 3 Apr 2014 14:53:48 +0000 (07:53 -0700)
This reverts commit 0ea7bec76d804a2c4efccd3dbdaa3e30cf536a5c.

Connections that queue up too much data, because they are monitoring a
table that is changing quickly and failing to keep up with the updates,
cause problems with buffer management.  Since commit 60533a405b2e
(jsonrpc-server: Disconnect connections that queue too much data.),
ovsdb-server has dealt with them by disconnecting the connection and
letting them start up again with a fresh copy of the database.  However,
this is not ideal because of situations where disconnection happens
repeatedly.  For example:

     - A manager toggles a column back and forth between two or more values
       quickly (in which case the data transmitted over the monitoring
       connections always increases quickly, without bound).

     - A manager repeatedly extends the contents of some column in some row
       (in which case the data transmitted over the monitoring connection
       grows with O(n**2) in the length of the string).

A better way to deal with this problem is to combine updates when they are
sent to the monitoring connection, if that connection is not keeping up.
In both the above cases, this reduces the data that must be sent to a
manageable amount.  An upcoming patch implements this new way.  This commit
reverts part of the previous solution that disconnects backlogged
connections, since it is no longer useful.

Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Andy Zhou <azhou@nicira.com>
lib/ovsdb-data.c
lib/ovsdb-data.h
tests/test-ovsdb.c

index b4b28db..3aae9f4 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
+/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -467,47 +467,6 @@ ovsdb_atom_to_json(const union ovsdb_atom *atom, enum ovsdb_atomic_type type)
     }
 }
 
-/* Returns strlen(json_to_string(ovsdb_atom_to_json(atom, type), 0)). */
-size_t
-ovsdb_atom_json_length(const union ovsdb_atom *atom,
-                       enum ovsdb_atomic_type type)
-{
-    struct json json;
-
-    switch (type) {
-    case OVSDB_TYPE_VOID:
-        OVS_NOT_REACHED();
-
-    case OVSDB_TYPE_INTEGER:
-        json.type = JSON_INTEGER;
-        json.u.integer = atom->integer;
-        break;
-
-    case OVSDB_TYPE_REAL:
-        json.type = JSON_REAL;
-        json.u.real = atom->real;
-        break;
-
-    case OVSDB_TYPE_BOOLEAN:
-        json.type = atom->boolean ? JSON_TRUE : JSON_FALSE;
-        break;
-
-    case OVSDB_TYPE_STRING:
-        json.type = JSON_STRING;
-        json.u.string = atom->string;
-        break;
-
-    case OVSDB_TYPE_UUID:
-        return strlen("[\"uuid\",\"00000000-0000-0000-0000-000000000000\"]");
-
-    case OVSDB_N_TYPES:
-    default:
-        OVS_NOT_REACHED();
-    }
-
-    return json_serialized_length(&json);
-}
-
 static char *
 ovsdb_atom_from_string__(union ovsdb_atom *atom,
                          const struct ovsdb_base_type *base, const char *s,
@@ -1349,56 +1308,6 @@ ovsdb_datum_to_json(const struct ovsdb_datum *datum,
     }
 }
 
-/* Returns strlen(json_to_string(ovsdb_datum_to_json(datum, type), 0)). */
-size_t
-ovsdb_datum_json_length(const struct ovsdb_datum *datum,
-                        const struct ovsdb_type *type)
-{
-    if (ovsdb_type_is_map(type)) {
-        size_t length;
-
-        /* ["map",[...]]. */
-        length = 10;
-        if (datum->n > 0) {
-            size_t i;
-
-            /* Commas between pairs in the inner [...] */
-            length += datum->n - 1;
-
-            /* [,] in each pair. */
-            length += datum->n * 3;
-
-            /* Data. */
-            for (i = 0; i < datum->n; i++) {
-                length += ovsdb_atom_json_length(&datum->keys[i],
-                                                 type->key.type);
-                length += ovsdb_atom_json_length(&datum->values[i],
-                                                 type->value.type);
-            }
-        }
-        return length;
-    } else if (datum->n == 1) {
-        return ovsdb_atom_json_length(&datum->keys[0], type->key.type);
-    } else {
-        size_t length;
-        size_t i;
-
-        /* ["set",[...]]. */
-        length = 10;
-        if (datum->n > 0) {
-            /* Commas between elements in the inner [...]. */
-            length += datum->n - 1;
-
-            /* Data. */
-            for (i = 0; i < datum->n; i++) {
-                length += ovsdb_atom_json_length(&datum->keys[i],
-                                                 type->key.type);
-            }
-        }
-        return length;
-    }
-}
-
 static const char *
 skip_spaces(const char *p)
 {
index ece1672..2e31cc5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
+/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -88,8 +88,6 @@ struct ovsdb_error *ovsdb_atom_from_json(union ovsdb_atom *,
     WARN_UNUSED_RESULT;
 struct json *ovsdb_atom_to_json(const union ovsdb_atom *,
                                 enum ovsdb_atomic_type);
-size_t ovsdb_atom_json_length(const union ovsdb_atom *,
-                              enum ovsdb_atomic_type);
 
 char *ovsdb_atom_from_string(union ovsdb_atom *,
                              const struct ovsdb_base_type *, const char *,
@@ -165,8 +163,6 @@ struct ovsdb_error *ovsdb_datum_from_json(struct ovsdb_datum *,
     WARN_UNUSED_RESULT;
 struct json *ovsdb_datum_to_json(const struct ovsdb_datum *,
                                  const struct ovsdb_type *);
-size_t ovsdb_datum_json_length(const struct ovsdb_datum *,
-                               const struct ovsdb_type *);
 
 char *ovsdb_datum_from_string(struct ovsdb_datum *,
                               const struct ovsdb_type *, const char *,
index 3b48778..aeb7a5e 100644 (file)
@@ -218,16 +218,13 @@ unbox_json(struct json *json)
     }
 }
 
-static size_t
+static void
 print_and_free_json(struct json *json)
 {
     char *string = json_to_string(json, JSSF_SORT);
-    size_t length = strlen(string);
     json_destroy(json);
     puts(string);
     free(string);
-
-    return length;
 }
 
 static void
@@ -445,10 +442,7 @@ do_parse_atoms(int argc, char *argv[])
         if (error) {
             print_and_free_ovsdb_error(error);
         } else {
-            size_t length;
-
-            length = print_and_free_json(ovsdb_atom_to_json(&atom, base.type));
-            ovs_assert(length == ovsdb_atom_json_length(&atom, base.type));
+            print_and_free_json(ovsdb_atom_to_json(&atom, base.type));
             ovsdb_atom_destroy(&atom, base.type);
         }
     }
@@ -500,14 +494,12 @@ do_parse_data__(int argc, char *argv[],
 
     for (i = 2; i < argc; i++) {
         struct ovsdb_datum datum;
-        size_t length;
 
         json = unbox_json(parse_json(argv[i]));
         check_ovsdb_error(parse(&datum, &type, json, NULL));
         json_destroy(json);
 
-        length = print_and_free_json(ovsdb_datum_to_json(&datum, &type));
-        ovs_assert(length == ovsdb_datum_json_length(&datum, &type));
+        print_and_free_json(ovsdb_datum_to_json(&datum, &type));
 
         ovsdb_datum_destroy(&datum, &type);
     }