mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	The `pg_upgrade` tool uses `pg_dump` as an internal step, and verifies that the version of `pg_upgrade` is the same exactly the same as the version of the PostgreSQL server it is upgrading to. A mismatch (even in packaging versions) leads to it aborting: ``` /usr/lib/postgresql/14/bin/pg_upgrade -b /usr/lib/postgresql/13/bin -B /usr/lib/postgresql/14/bin -p 5432 -P 5435 -d /etc/postgresql/13/main -D /etc/postgresql/14/main --link Finding the real data directory for the source cluster ok Finding the real data directory for the target cluster ok check for "/usr/lib/postgresql/14/bin/pg_dump" failed: incorrect version: found "pg_dump (PostgreSQL) 14.6 (Ubuntu 14.6-0ubuntu0.22.04.1)", expected "pg_dump (PostgreSQL) 14.6 (Ubuntu 14.6-1.pgdg22.04+1)" Failure, exiting ``` Explicitly upgrade `postgresql-client` at the same time we upgrade `postgresql` itself, so their versions match. Fixes: #24192
		
			
				
	
	
		
			87 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env bash
 | 
						|
set -eo pipefail
 | 
						|
 | 
						|
if [ "$EUID" -ne 0 ]; then
 | 
						|
    echo "Error: This script must be run as root" >&2
 | 
						|
    exit 1
 | 
						|
fi
 | 
						|
 | 
						|
# Force a known locale; some OS X terminals set an invalid LC_CTYPE
 | 
						|
# which crashes pg_upgradecluster
 | 
						|
export LC_ALL=C.UTF-8
 | 
						|
export LANG=C.UTF-8
 | 
						|
export LANGUAGE=C.UTF-8
 | 
						|
 | 
						|
UPGRADE_TO=${1:-14}
 | 
						|
UPGRADE_FROM=$(crudini --get /etc/zulip/zulip.conf postgresql version)
 | 
						|
ZULIP_PATH="$(dirname "$0")/../.."
 | 
						|
 | 
						|
if [ "$UPGRADE_TO" = "$UPGRADE_FROM" ]; then
 | 
						|
    echo "Already running PostgreSQL $UPGRADE_TO!"
 | 
						|
    exit 1
 | 
						|
fi
 | 
						|
 | 
						|
set -x
 | 
						|
 | 
						|
"$ZULIP_PATH"/scripts/lib/setup-apt-repo
 | 
						|
apt-get install -y "postgresql-$UPGRADE_TO" "postgresql-client-$UPGRADE_TO"
 | 
						|
if pg_lsclusters -h | grep -qE "^$UPGRADE_TO\s+main\b"; then
 | 
						|
    pg_dropcluster "$UPGRADE_TO" main --stop
 | 
						|
fi
 | 
						|
 | 
						|
(
 | 
						|
    # Two-stage application of Puppet; we apply the bare-bones
 | 
						|
    # PostgreSQL configuration first, so that FTS will be configured
 | 
						|
    # prior to the pg_upgradecluster.
 | 
						|
    TEMP_CONF_DIR=$(mktemp -d)
 | 
						|
    cp /etc/zulip/zulip.conf "$TEMP_CONF_DIR"
 | 
						|
    ZULIP_CONF="${TEMP_CONF_DIR}/zulip.conf"
 | 
						|
    crudini --set "$ZULIP_CONF" postgresql version "$UPGRADE_TO"
 | 
						|
    crudini --set "$ZULIP_CONF" machine puppet_classes zulip::profile::base,zulip::postgresql_base
 | 
						|
    touch "/usr/share/postgresql/$UPGRADE_TO/pgroonga_setup.sql.applied"
 | 
						|
 | 
						|
    FACTER_LEAVE_SUPERVISOR=true "$ZULIP_PATH"/scripts/zulip-puppet-apply -f --config "$ZULIP_CONF"
 | 
						|
    rm -rf "$TEMP_CONF_DIR"
 | 
						|
)
 | 
						|
 | 
						|
# Capture the output so we know where the path to the post-upgrade scripts is
 | 
						|
UPGRADE_LOG=$(mktemp "/var/log/zulip/upgrade-postgresql-$UPGRADE_FROM-$UPGRADE_TO.XXXXXXXXX.log")
 | 
						|
pg_upgradecluster -v "$UPGRADE_TO" "$UPGRADE_FROM" main --method=upgrade --link | tee "$UPGRADE_LOG"
 | 
						|
SCRIPTS_PATH=$(grep -o "/var/log/postgresql/pg_upgradecluster-$UPGRADE_FROM-$UPGRADE_TO-main.*" "$UPGRADE_LOG" || true)
 | 
						|
 | 
						|
# If the upgrade completed successfully, lock in the new version in
 | 
						|
# our configuration immediately
 | 
						|
crudini --set /etc/zulip/zulip.conf postgresql version "$UPGRADE_TO"
 | 
						|
 | 
						|
# Make sure the new PostgreSQL is running
 | 
						|
pg_ctlcluster "$UPGRADE_TO" main start
 | 
						|
 | 
						|
# Update the statistics
 | 
						|
su postgres -c "/usr/lib/postgresql/$UPGRADE_TO/bin/vacuumdb --all --analyze-only --jobs 10"
 | 
						|
 | 
						|
# Start the database up cleanly
 | 
						|
"$ZULIP_PATH"/scripts/zulip-puppet-apply -f
 | 
						|
 | 
						|
# Drop the old data, binaries, and scripts
 | 
						|
pg_dropcluster "$UPGRADE_FROM" main
 | 
						|
apt remove -y "postgresql-$UPGRADE_FROM"
 | 
						|
if [ -n "$SCRIPTS_PATH" ]; then
 | 
						|
    if [ -f "$SCRIPTS_PATH/update_extensions.sql" ]; then
 | 
						|
        su postgres -c "psql $SCRIPTS_PATH/update_extensions.sql"
 | 
						|
    fi
 | 
						|
    su postgres -c "$SCRIPTS_PATH/delete_old_cluster.sh"
 | 
						|
    rm -rf "$SCRIPTS_PATH"
 | 
						|
else
 | 
						|
    set +x
 | 
						|
    echo
 | 
						|
    echo
 | 
						|
    echo ">>>>> pg_upgradecluster succeeded, but post-upgrade scripts path could not"
 | 
						|
    echo "      be parsed out!  Please read the pg_upgradecluster output to understand"
 | 
						|
    echo "      the current status of your cluster:"
 | 
						|
    echo "          $UPGRADE_LOG"
 | 
						|
    echo "      and report this bug with the PostgreSQL $UPGRADE_FROM -> $UPGRADE_TO upgrade to:"
 | 
						|
    echo "          https://github.com/zulip/zulip/issues"
 | 
						|
    echo
 | 
						|
    echo
 | 
						|
fi
 |