mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 06:15:47 +00:00
Revert "json: New function json_serialized_length()."
This reverts commit1600fa6853
. 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 commit60533a405b
(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>
This commit is contained in:
115
lib/json.c
115
lib/json.c
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* 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.
|
||||
@@ -1640,116 +1640,3 @@ json_serialize_string(const char *string, struct ds *ds)
|
||||
}
|
||||
ds_put_char(ds, '"');
|
||||
}
|
||||
|
||||
static size_t
|
||||
json_string_serialized_length(const char *string)
|
||||
{
|
||||
size_t length;
|
||||
uint8_t c;
|
||||
|
||||
length = strlen("\"\"");
|
||||
|
||||
while ((c = *string++) != '\0') {
|
||||
switch (c) {
|
||||
case '"':
|
||||
case '\\':
|
||||
case '\b':
|
||||
case '\f':
|
||||
case '\n':
|
||||
case '\r':
|
||||
case '\t':
|
||||
length += 2;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (c >= 32) {
|
||||
length++;
|
||||
} else {
|
||||
/* \uXXXX */
|
||||
length += 6;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
static size_t
|
||||
json_object_serialized_length(const struct shash *object)
|
||||
{
|
||||
size_t length = strlen("{}");
|
||||
|
||||
if (!shash_is_empty(object)) {
|
||||
struct shash_node *node;
|
||||
|
||||
/* Commas and colons. */
|
||||
length += 2 * shash_count(object) - 1;
|
||||
|
||||
SHASH_FOR_EACH (node, object) {
|
||||
const struct json *value = node->data;
|
||||
|
||||
length += json_string_serialized_length(node->name);
|
||||
length += json_serialized_length(value);
|
||||
}
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
static size_t
|
||||
json_array_serialized_length(const struct json_array *array)
|
||||
{
|
||||
size_t length = strlen("[]");
|
||||
|
||||
if (array->n) {
|
||||
size_t i;
|
||||
|
||||
/* Commas. */
|
||||
length += array->n - 1;
|
||||
|
||||
for (i = 0; i < array->n; i++) {
|
||||
length += json_serialized_length(array->elems[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
/* Returns strlen(json_to_string(json, 0)), that is, the number of bytes in the
|
||||
* JSON output by json_to_string() for 'json' when JSSF_PRETTY is not
|
||||
* requested. (JSSF_SORT does not affect the length of json_to_string()'s
|
||||
* output.) */
|
||||
size_t
|
||||
json_serialized_length(const struct json *json)
|
||||
{
|
||||
switch (json->type) {
|
||||
case JSON_NULL:
|
||||
return strlen("null");
|
||||
|
||||
case JSON_FALSE:
|
||||
return strlen("false");
|
||||
|
||||
case JSON_TRUE:
|
||||
return strlen("true");
|
||||
|
||||
case JSON_OBJECT:
|
||||
return json_object_serialized_length(json->u.object);
|
||||
|
||||
case JSON_ARRAY:
|
||||
return json_array_serialized_length(&json->u.array);
|
||||
|
||||
case JSON_INTEGER:
|
||||
return snprintf(NULL, 0, "%lld", json->u.integer);
|
||||
|
||||
case JSON_REAL:
|
||||
return snprintf(NULL, 0, "%.*g", DBL_DIG, json->u.real);
|
||||
|
||||
case JSON_STRING:
|
||||
return json_string_serialized_length(json->u.string);
|
||||
|
||||
case JSON_N_TYPES:
|
||||
default:
|
||||
OVS_NOT_REACHED();
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2009, 2010, 2013 Nicira, Inc.
|
||||
* Copyright (c) 2009, 2010 Nicira, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -127,8 +127,6 @@ enum {
|
||||
};
|
||||
char *json_to_string(const struct json *, int flags);
|
||||
void json_to_ds(const struct json *, int flags, struct ds *);
|
||||
|
||||
size_t json_serialized_length(const struct json *);
|
||||
|
||||
/* JSON string formatting operations. */
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2009, 2010, 2013 Nicira, Inc.
|
||||
* Copyright (c) 2009, 2010 Nicira, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -42,7 +42,6 @@ print_and_free_json(struct json *json)
|
||||
ok = false;
|
||||
} else {
|
||||
char *s = json_to_string(json, JSSF_SORT | (pretty ? JSSF_PRETTY : 0));
|
||||
ovs_assert(pretty || json_serialized_length(json) == strlen(s));
|
||||
puts(s);
|
||||
free(s);
|
||||
ok = true;
|
||||
|
Reference in New Issue
Block a user