ovsdb-server: Improve message for "add-db" of database already open.
authorBen Pfaff <blp@nicira.com>
Tue, 25 Mar 2014 22:51:23 +0000 (15:51 -0700)
committerBen Pfaff <blp@nicira.com>
Mon, 7 Apr 2014 17:23:35 +0000 (10:23 -0700)
Otherwise you get a fairly obscure message about a lockfile already being
locked.

Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Alex Wang <alexw@nicira.com>
ovsdb/ovsdb-server.c
tests/ovsdb-server.at

index 6de77e4..a85a672 100644 (file)
@@ -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 <getopt.h>
 #include <inttypes.h>
 #include <signal.h>
+#include <sys/stat.h>
 #include <unistd.h>
 
 #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);
 
index a64fab3..7e9d9fd 100644 (file)
@@ -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
 ])