From: Ben Pfaff <blp@nicira.com>
Date: Tue, 26 Jul 2011 16:13:17 +0000 (-0700)
Subject: ovs-ctl: Drop back to an empty database if schema conversion fails.
X-Git-Tag: v1.2.0~48
X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=046d84c23564adbcc4ab478e756b393e906d7c38;p=sliver-openvswitch.git

ovs-ctl: Drop back to an empty database if schema conversion fails.

If the "ovsdb-tool convert" call fails, it is likely because the database
has bad contents that this version of OVSDB does not understand.  In that
case, we're better off using a fresh, empty database rather than failing
to come up at all.

Bug #6280.
---

diff --git a/utilities/ovs-ctl.in b/utilities/ovs-ctl.in
index a5ef56ad9..da6ea814d 100755
--- a/utilities/ovs-ctl.in
+++ b/utilities/ovs-ctl.in
@@ -59,20 +59,22 @@ ovsdb_tool () {
     ovsdb-tool -vANY:console:emer "$@"
 }
 
+create_db () {
+    action "Creating empty database $DB_FILE" ovsdb_tool create "$DB_FILE" "$DB_SCHEMA"
+}
+
 upgrade_db () {
     schemaver=`ovsdb_tool schema-version "$DB_SCHEMA"`
     if test ! -e "$DB_FILE"; then
         log_warning_msg "$DB_FILE does not exist"
         install -d -m 755 -o root -g root `dirname $DB_FILE`
-
-        action "Creating empty database $DB_FILE" true
-        ovsdb_tool create "$DB_FILE" "$DB_SCHEMA"
+        create_db
     elif test X"`ovsdb_tool needs-conversion "$DB_FILE" "$DB_SCHEMA"`" != Xno; then
         # Back up the old version.
         version=`ovsdb_tool db-version "$DB_FILE"`
         cksum=`ovsdb_tool db-cksum "$DB_FILE" | awk '{print $1}'`
         backup=$DB_FILE.backup$version-$cksum
-        action "Backing up database to $backup" cp "$DB_FILE" "$backup"
+        action "Backing up database to $backup" cp "$DB_FILE" "$backup" || return 1
 
         # Compact database.  This is important if the old schema did not enable
         # garbage collection (i.e. if it did not have any tables with "isRoot":
@@ -83,10 +85,20 @@ upgrade_db () {
         # does) would cause the record to be dropped by the first transaction,
         # then the second transaction would cause a referential integrity
         # failure (for a strong reference).
+        #
+        # Errors might occur on an Open vSwitch downgrade if ovsdb-tool doesn't
+        # understand some feature of the schema used in the OVSDB version that
+        # we're downgrading from, so we don't give up on error.
         action "Compacting database" ovsdb_tool compact "$DB_FILE"
 
         # Upgrade or downgrade schema.
-        action "Converting database schema" ovsdb_tool convert "$DB_FILE" "$DB_SCHEMA"
+        if action "Converting database schema" ovsdb_tool convert "$DB_FILE" "$DB_SCHEMA"; then
+            :
+        else
+            log_warning_msg "Schema conversion failed, using empty database instead"
+            rm -f "$DB_FILE"
+            create_db
+        fi
     fi
 }