From patchwork Fri Oct 2 17:52:07 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gurucharan Shetty X-Patchwork-Id: 525690 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from archives.nicira.com (li376-54.members.linode.com [96.126.127.54]) by ozlabs.org (Postfix) with ESMTP id 5102914030F for ; Sat, 3 Oct 2015 03:55:18 +1000 (AEST) Received: from archives.nicira.com (localhost [127.0.0.1]) by archives.nicira.com (Postfix) with ESMTP id DAB8510BEE; Fri, 2 Oct 2015 10:55:17 -0700 (PDT) X-Original-To: dev@openvswitch.org Delivered-To: dev@openvswitch.org Received: from mx1e3.cudamail.com (mx1.cudamail.com [69.90.118.67]) by archives.nicira.com (Postfix) with ESMTPS id 9733F10BE3 for ; Fri, 2 Oct 2015 10:55:16 -0700 (PDT) Received: from bar2.cudamail.com (localhost [127.0.0.1]) by mx1e3.cudamail.com (Postfix) with ESMTPS id 06DAE42027A for ; Fri, 2 Oct 2015 11:55:16 -0600 (MDT) X-ASG-Debug-ID: 1443808515-03dc537fe2a933b0001-byXFYA Received: from mx1-pf2.cudamail.com ([192.168.24.2]) by bar2.cudamail.com with ESMTP id wmxdM0RMYM1AP1k3 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 02 Oct 2015 11:55:15 -0600 (MDT) X-Barracuda-Envelope-From: shettyg@nicira.com X-Barracuda-RBL-Trusted-Forwarder: 192.168.24.2 Received: from unknown (HELO mail-pa0-f49.google.com) (209.85.220.49) by mx1-pf2.cudamail.com with ESMTPS (RC4-SHA encrypted); 2 Oct 2015 17:55:15 -0000 Received-SPF: unknown (mx1-pf2.cudamail.com: Multiple SPF records returned) X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.49 Received: by pacex6 with SMTP id ex6so112544828pac.0 for ; Fri, 02 Oct 2015 10:55:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=YYs7ChFd+a42ivgwyJXKzun9CRw60VOJr86CRxo1CT8=; b=HY3AzbEaQ6hHNkJJneCGGnk8H6lzQLYO3W5WqG7sE8eabZJhssloYtpGRQ0nYUjfQT cugBUeYMCB1gIJYkbkMvgWquGFv9fQR2uCZ47X6aabui8gcGz+de/7EJorVrDapeQrVM SjAhPBMNasksxNRcSEl+dlfP6ziXuMxKVx73sL5gfdbSJM6X+GaA+y4noGMJSwDgVGro zILFJWIQojeeZ9MsJc8ImxClV+Puo6zhVKU3t9pMNVlI+cb2TAXo6e6o0jr1WpQntVf+ nbD/cT4OBFlSWnXy9zG8C0ni1TaF1rDfeVyAwI0WkbkORJ8k2Q39ZPPLX+arH151L8nr WLJA== X-Gm-Message-State: ALoCoQk4pOsKyXJzIYIVSfENFUKoKaHAjccFC04r2/+FGubaT2sCUSQc85VyZt5ICZTxtrH/2q7D X-Received: by 10.66.163.136 with SMTP id yi8mr21478804pab.124.1443808514629; Fri, 02 Oct 2015 10:55:14 -0700 (PDT) Received: from ubuntu-test.eng.vmware.com ([208.91.1.34]) by smtp.gmail.com with ESMTPSA id rb8sm13069686pbb.63.2015.10.02.10.55.13 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 02 Oct 2015 10:55:13 -0700 (PDT) X-CudaMail-Envelope-Sender: shettyg@nicira.com X-Barracuda-Apparent-Source-IP: 208.91.1.34 From: Gurucharan Shetty X-Google-Original-From: Gurucharan Shetty To: dev@openvswitch.org X-CudaMail-Whitelist-To: dev@openvswitch.org X-CudaMail-MID: CM-E2-1001060059 X-CudaMail-DTE: 100215 X-CudaMail-Originating-IP: 209.85.220.49 Date: Fri, 2 Oct 2015 10:52:07 -0700 X-ASG-Orig-Subj: [##CM-E2-1001060059##][PATCH v2] ovn-ctl: Ability to upgrade databases. Message-Id: <1443808327-2260-1-git-send-email-gshetty@nicira.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: UNKNOWN[192.168.24.2] X-Barracuda-Start-Time: 1443808515 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://web.cudamail.com:443/cgi-mod/mark.cgi X-ASG-Whitelist: Header =?UTF-8?B?eFwtY3VkYW1haWxcLXdoaXRlbGlzdFwtdG8=?= X-Virus-Scanned: by bsmtpd at cudamail.com X-Barracuda-BRTS-Status: 1 Cc: Gurucharan Shetty Subject: [ovs-dev] [PATCH v2] ovn-ctl: Ability to upgrade databases. X-BeenThere: dev@openvswitch.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dev-bounces@openvswitch.org Sender: "dev" From: Gurucharan Shetty Signed-off-by: Gurucharan Shetty Acked-by: Ben Pfaff --- This patch has already been applied. A nice way of handling upgrade_db errors can be figured out after some real use of the script. --- ovn/utilities/ovn-ctl | 37 +++++++++++++++++-------------------- utilities/ovs-ctl.in | 41 +---------------------------------------- utilities/ovs-lib.in | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 60 deletions(-) diff --git a/ovn/utilities/ovn-ctl b/ovn/utilities/ovn-ctl index 9f16021..3e2ccf9 100755 --- a/ovn/utilities/ovn-ctl +++ b/ovn/utilities/ovn-ctl @@ -30,31 +30,28 @@ done ## start ## ## ----- ## -check_ovn_dbs () { - if test ! -e "$DB_NB_FILE"; then - create_db "$DB_NB_FILE" "$DB_NB_SCHEMA" - fi - - if test ! -e "$DB_SB_FILE"; then - create_db "$DB_SB_FILE" "$DB_SB_SCHEMA" - fi - - running_ovn_dbs=$(ovs-appctl -t ovsdb-server ovsdb-server/list-dbs | grep OVN | wc -l) - if [ "$running_ovn_dbs" != "2" ] ; then - ovs-appctl -t ovsdb-server ovsdb-server/add-db $DB_NB_FILE - ovs-appctl -t ovsdb-server ovsdb-server/add-db $DB_SB_FILE - running_ovn_dbs=$(ovs-appctl -t ovsdb-server ovsdb-server/list-dbs | grep OVN | wc -l) - if [ "$running_ovn_dbs" != "2" ] ; then - echo >&2 "$0: Failed to add OVN dbs to ovsdb-server" - exit 1 - fi - fi +upgrade_ovn_dbs () { + ovn_dbs=$(ovs-appctl -t ovsdb-server ovsdb-server/list-dbs 2>/dev/null) + for db in $ovn_dbs; do + case $db in + OVN*) + action "Removing $db from ovsdb-server" \ + ovs-appctl -t ovsdb-server ovsdb-server/remove-db $db + ;; + esac + done + upgrade_db "$DB_NB_FILE" "$DB_NB_SCHEMA" + upgrade_db "$DB_SB_FILE" "$DB_SB_SCHEMA" + for db in $DB_NB_FILE $DB_SB_FILE; do + action "Adding $db to ovsdb-server" \ + ovs-appctl -t ovsdb-server ovsdb-server/add-db $db || exit 1 + done } start_northd () { # We expect ovn-northd to be co-located with ovsdb-server handling both the # OVN_Northbound and OVN_Southbound dbs. - check_ovn_dbs + upgrade_ovn_dbs set ovn-northd set "$@" -vconsole:emer -vsyslog:err -vfile:info diff --git a/utilities/ovs-ctl.in b/utilities/ovs-ctl.in index 322e420..0082bed 100755 --- a/utilities/ovs-ctl.in +++ b/utilities/ovs-ctl.in @@ -76,45 +76,6 @@ ovs_vsctl () { ovs-vsctl --no-wait "$@" } -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` - create_db "$DB_FILE" "$DB_SCHEMA" - 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" || 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": - # true) but the new schema does. In that situation the old database - # may contain a transaction that creates a record followed by a - # transaction that creates the first use of the record. Replaying that - # series of transactions against the new database schema (as "convert" - # 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. - 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 "$DB_FILE" "$DB_SCHEMA" - fi - fi -} - set_system_ids () { set ovs_vsctl set Open_vSwitch . @@ -182,7 +143,7 @@ start_ovsdb () { log_success_msg "ovsdb-server is already running" else # Create initial database or upgrade database schema. - upgrade_db || return 1 + upgrade_db $DB_FILE $DB_SCHEMA || return 1 # Start ovsdb-server. set ovsdb-server "$DB_FILE" diff --git a/utilities/ovs-lib.in b/utilities/ovs-lib.in index ef3150a..dd8a1e9 100644 --- a/utilities/ovs-lib.in +++ b/utilities/ovs-lib.in @@ -335,3 +335,45 @@ create_db () { DB_SCHEMA="$2" action "Creating empty database $DB_FILE" ovsdb_tool create "$DB_FILE" "$DB_SCHEMA" } + +upgrade_db () { + DB_FILE="$1" + DB_SCHEMA="$2" + + 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` + create_db "$DB_FILE" "$DB_SCHEMA" + 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" || 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": + # true) but the new schema does. In that situation the old database + # may contain a transaction that creates a record followed by a + # transaction that creates the first use of the record. Replaying that + # series of transactions against the new database schema (as "convert" + # 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. + 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 "$DB_FILE" "$DB_SCHEMA" + fi + fi +}