From: Ben Pfaff 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-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=046d84c23564adbcc4ab478e756b393e906d7c38;p=openvswitch 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 a5ef56ad..da6ea814 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 }