From: Ben Pfaff Date: Tue, 25 Mar 2014 22:51:23 +0000 (-0700) Subject: ovsdb-server: Improve message for "add-db" of database already open. X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=ebed9f7859a2a051d7bb59d7d73775f0c5c0edd7 ovsdb-server: Improve message for "add-db" of database already open. Otherwise you get a fairly obscure message about a lockfile already being locked. Signed-off-by: Ben Pfaff Acked-by: Alex Wang --- diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c index 6de77e44a..a85a672a9 100644 --- a/ovsdb/ovsdb-server.c +++ b/ovsdb/ovsdb-server.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc. +/* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ #include #include #include +#include #include #include "column.h" @@ -328,6 +329,36 @@ main(int argc, char *argv[]) return 0; } +/* Returns true if 'filename' is known to be already open as a database, + * false if not. + * + * "False negatives" are possible. */ +static bool +is_already_open(struct server_config *config OVS_UNUSED, + const char *filename OVS_UNUSED) +{ +#ifndef _WIN32 + struct stat s; + + if (!stat(filename, &s)) { + struct shash_node *node; + + SHASH_FOR_EACH (node, config->all_dbs) { + struct db *db = node->data; + struct stat s2; + + if (!stat(db->filename, &s2) + && s.st_dev == s2.st_dev + && s.st_ino == s2.st_ino) { + return true; + } + } + } +#endif /* !_WIN32 */ + + return false; +} + static char * open_db(struct server_config *config, const char *filename) { @@ -335,6 +366,13 @@ open_db(struct server_config *config, const char *filename) struct db *db; char *error; + /* If we know that the file is already open, return a good error message. + * Otherwise, if the file is open, we'll fail later on with a harder to + * interpret file locking error. */ + if (is_already_open(config, filename)) { + return xasprintf("%s: already open", filename); + } + db = xzalloc(sizeof *db); db->filename = xstrdup(filename); diff --git a/tests/ovsdb-server.at b/tests/ovsdb-server.at index a64fab3fb..7e9d9fd54 100644 --- a/tests/ovsdb-server.at +++ b/tests/ovsdb-server.at @@ -194,9 +194,8 @@ AT_CHECK([ovsdb-client list-tables unix:socket constraints], [0], [ignore], [ign AT_CHECK([ovsdb-client list-tables unix:socket ordinals], [0], [ignore], [ignore]) # Add an already added database. -AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-db db2], 2, [], [stderr]) -AT_CHECK([sed 's/(.*)/(...)/' stderr], [0], - [I/O error: db2: failed to lock lockfile (...) +AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/add-db db2], 2, [], + [db2: already open ovs-appctl: ovsdb-server: server returned an error ])