X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ovsdb%2Fovsdb-server.c;h=32e2eb02f8a8ea9a608923d93fbc56ecf935276d;hb=c824c8a39854199a4221256281b1322cfae33469;hp=776bbb258ba1c60a31078fd399e56a61f96d9ac1;hpb=f125905cdd3dc0339ad968c0a70128807884b400;p=openvswitch diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c index 776bbb25..32e2eb02 100644 --- a/ovsdb/ovsdb-server.c +++ b/ovsdb/ovsdb-server.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2010, 2011 Nicira Networks +/* 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. @@ -32,6 +32,7 @@ #include "jsonrpc-server.h" #include "leak-checker.h" #include "list.h" +#include "memory.h" #include "ovsdb.h" #include "ovsdb-data.h" #include "ovsdb-types.h" @@ -39,6 +40,7 @@ #include "poll-loop.h" #include "process.h" #include "row.h" +#include "simap.h" #include "stream-ssl.h" #include "stream.h" #include "stress.h" @@ -135,6 +137,13 @@ main(int argc, char *argv[]) daemonize_complete(); + if (!run_command) { + /* ovsdb-server is usually a long-running process, in which case it + * makes plenty of sense to log the version, but --run makes + * ovsdb-server more like a command-line tool, so skip it. */ + VLOG_INFO("%s (Open vSwitch) %s", program_name, VERSION); + } + unixctl_command_register("exit", "", 0, 0, ovsdb_server_exit, &exiting); unixctl_command_register("ovsdb-server/compact", "", 0, 0, ovsdb_server_compact, file); @@ -143,6 +152,17 @@ main(int argc, char *argv[]) exiting = false; while (!exiting) { + memory_run(); + if (memory_should_report()) { + struct simap usage; + + simap_init(&usage); + ovsdb_jsonrpc_server_get_memory_usage(jsonrpc, &usage); + ovsdb_get_memory_usage(db, &usage); + memory_report(&usage); + simap_destroy(&usage); + } + reconfigure_from_db(jsonrpc, db, &remotes); ovsdb_jsonrpc_server_run(jsonrpc); unixctl_server_run(unixctl); @@ -157,6 +177,7 @@ main(int argc, char *argv[]) update_remote_status(jsonrpc, &remotes, db); } + memory_wait(); ovsdb_jsonrpc_server_wait(jsonrpc); unixctl_server_wait(unixctl); ovsdb_trigger_wait(db, time_msec()); @@ -276,7 +297,7 @@ add_remote(struct shash *remotes, const char *target) options = shash_find_data(remotes, target); if (!options) { - options = ovsdb_jsonrpc_default_options(); + options = ovsdb_jsonrpc_default_options(target); shash_add(remotes, target, options); } @@ -319,23 +340,21 @@ get_datum(struct ovsdb_row *row, const char *column_name, return &row->fields[column->index]; } -/* This function is used to read the string-string key-values from a map. - * Returns the true if the 'key' is found and returns the "value" associated - * with the 'key' in 'stringp', else returns false. */ -static bool +/* Read string-string key-values from a map. Returns the value associated with + * 'key', if found, or NULL */ +static const char * read_map_string_column(const struct ovsdb_row *row, const char *column_name, - const char **stringp, const char *key) + const char *key) { const struct ovsdb_datum *datum; union ovsdb_atom *atom_key = NULL, *atom_value = NULL; size_t i; - datum = get_datum((struct ovsdb_row *) row, column_name, OVSDB_TYPE_STRING, - OVSDB_TYPE_STRING, UINT_MAX); + datum = get_datum(CONST_CAST(struct ovsdb_row *, row), column_name, + OVSDB_TYPE_STRING, OVSDB_TYPE_STRING, UINT_MAX); if (!datum) { - *stringp = NULL; - return false; + return NULL; } for (i = 0; i < datum->n; i++) { @@ -346,8 +365,7 @@ read_map_string_column(const struct ovsdb_row *row, const char *column_name, } } - *stringp = atom_value ? atom_value->string : NULL; - return atom_value != NULL; + return atom_value ? atom_value->string : NULL; } static const union ovsdb_atom * @@ -356,8 +374,8 @@ read_column(const struct ovsdb_row *row, const char *column_name, { const struct ovsdb_datum *datum; - datum = get_datum((struct ovsdb_row *) row, column_name, type, OVSDB_TYPE_VOID, - 1); + datum = get_datum(CONST_CAST(struct ovsdb_row *, row), column_name, type, + OVSDB_TYPE_VOID, 1); return datum && datum->n ? datum->keys : NULL; } @@ -386,12 +404,24 @@ read_string_column(const struct ovsdb_row *row, const char *column_name, static void write_bool_column(struct ovsdb_row *row, const char *column_name, bool value) { - struct ovsdb_datum *datum = get_datum(row, column_name, OVSDB_TYPE_BOOLEAN, - OVSDB_TYPE_VOID, 1); + const struct ovsdb_column *column; + struct ovsdb_datum *datum; + column = ovsdb_table_schema_get_column(row->table->schema, column_name); + datum = get_datum(row, column_name, OVSDB_TYPE_BOOLEAN, + OVSDB_TYPE_VOID, 1); if (!datum) { return; } + + if (datum->n != 1) { + ovsdb_datum_destroy(datum, &column->type); + + datum->n = 1; + datum->keys = xmalloc(sizeof *datum->keys); + datum->values = NULL; + } + datum->keys[0].boolean = value; } @@ -427,21 +457,6 @@ write_string_string_column(struct ovsdb_row *row, const char *column_name, ovsdb_datum_sort_assert(datum, column->type.key.type); } -/* Get the other config for the manager from the database. */ -static void -manager_get_other_config(const struct ovsdb_row *row, - struct ovsdb_jsonrpc_options *options) -{ - const char *temp_string; - - /* Retrieve the configs and store in the options. */ - if (read_map_string_column(row, "other_config", &temp_string, "dscp")) { - options->dscp = atoi(temp_string); - } else { - options->dscp = DSCP_DEFAULT; - } -} - /* Adds a remote and options to 'remotes', based on the Manager table row in * 'row'. */ static void @@ -450,7 +465,7 @@ add_manager_options(struct shash *remotes, const struct ovsdb_row *row) static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1); struct ovsdb_jsonrpc_options *options; long long int max_backoff, probe_interval; - const char *target; + const char *target, *dscp_string; if (!read_string_column(row, "target", &target) || !target) { VLOG_INFO_RL(&rl, "Table `%s' has missing or invalid `target' column", @@ -466,7 +481,14 @@ add_manager_options(struct shash *remotes, const struct ovsdb_row *row) options->probe_interval = probe_interval; } - manager_get_other_config(row, options); + options->dscp = DSCP_DEFAULT; + dscp_string = read_map_string_column(row, "other_config", "dscp"); + if (dscp_string) { + int dscp = atoi(dscp_string); + if (dscp >= 0 && dscp <= 63) { + options->dscp = dscp; + } + } } static void @@ -798,7 +820,7 @@ parse_options(int argc, char *argv[], char **file_namep, switch (argc) { case 0: - *file_namep = xasprintf("%s/openvswitch/conf.db", ovs_sysconfdir()); + *file_namep = xasprintf("%s/conf.db", ovs_dbdir()); break; case 1: