Thread: pg_upgrade not detecting version properly

pg_upgrade not detecting version properly

From
Chris Ernst
Date:
Hi all,

I'm trying to test using pg_upgrade to go from 9.1.6 to 9.2.1 on Ubuntu
server 10.04.  But when I run pg_upgrade, it tells me I can only run it
on 8.3 or later.

Old:
postgres=# SELECT version();
                                                    version

----------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.1.6 on x86_64-unknown-linux-gnu, compiled by gcc-4.4.real
(Ubuntu 4.4.3-4ubuntu5.1) 4.4.3, 64-bit
(1 row)


New:
postgres=# SELECT version();
                                                    version

----------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.2.1 on x86_64-unknown-linux-gnu, compiled by gcc-4.4.real
(Ubuntu 4.4.3-4ubuntu5.1) 4.4.3, 64-bit
(1 row)


Yet when I try to run pg_upgrade:

$ /usr/lib/postgresql/9.2/bin/pg_upgrade -b /usr/lib/postgresql/9.1/bin/
-d /postgresql/9.1/main -B /usr/lib/postgresql/9.2/bin/ -D
/postgresql/9.2/main -k -c -v
Running in verbose mode
Performing Consistency Checks
-----------------------------
Checking current, bin, and data directories                 ok
Checking cluster versions
This utility can only upgrade from PostgreSQL version 8.3 and later.
Failure, exiting

Any idea what could be going on here?

Thank you in advance for your help.

    - Chris



Re: pg_upgrade not detecting version properly

From
Bruce Momjian
Date:
On Tue, Oct  9, 2012 at 09:50:22PM -0600, Chris Ernst wrote:
> Hi all,
>
> I'm trying to test using pg_upgrade to go from 9.1.6 to 9.2.1 on Ubuntu
> server 10.04.  But when I run pg_upgrade, it tells me I can only run it
> on 8.3 or later.
>
> Old:
> postgres=# SELECT version();
>                                                     version
>
> ----------------------------------------------------------------------------------------------------------------
>  PostgreSQL 9.1.6 on x86_64-unknown-linux-gnu, compiled by gcc-4.4.real
> (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3, 64-bit
> (1 row)
>
>
> New:
> postgres=# SELECT version();
>                                                     version
>
> ----------------------------------------------------------------------------------------------------------------
>  PostgreSQL 9.2.1 on x86_64-unknown-linux-gnu, compiled by gcc-4.4.real
> (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3, 64-bit
> (1 row)
>
>
> Yet when I try to run pg_upgrade:
>
> $ /usr/lib/postgresql/9.2/bin/pg_upgrade -b /usr/lib/postgresql/9.1/bin/
> -d /postgresql/9.1/main -B /usr/lib/postgresql/9.2/bin/ -D
> /postgresql/9.2/main -k -c -v
> Running in verbose mode
> Performing Consistency Checks
> -----------------------------
> Checking current, bin, and data directories                 ok
> Checking cluster versions
> This utility can only upgrade from PostgreSQL version 8.3 and later.
> Failure, exiting
>
> Any idea what could be going on here?
>
> Thank you in advance for your help.

That is cetainly odd.  It is using this C code:

    if (GET_MAJOR_VERSION(old_cluster.major_version) < 803)
        pg_log(PG_FATAL, "This utility can only upgrade from PostgreSQL version 8.3 and later.\n");

which is assigned from this function:

    get_major_server_version(ClusterInfo *cluster)
    {
        FILE       *version_fd;
        char        ver_filename[MAXPGPATH];
        int         integer_version = 0;
        int         fractional_version = 0;

        snprintf(ver_filename, sizeof(ver_filename), "%s/PG_VERSION",
                 cluster->pgdata);
        if ((version_fd = fopen(ver_filename, "r")) == NULL)
            return 0;

        if (fscanf(version_fd, "%63s", cluster->major_version_str) == 0 ||
            sscanf(cluster->major_version_str, "%d.%d", &integer_version,
                   &fractional_version) != 2)
            pg_log(PG_FATAL, "could not get version from %s\n", cluster->pgdata);

        fclose(version_fd);

        return (100 * integer_version + fractional_version) * 100;
    }

Can you show me what is in the PG_VERSION file in the old cluster?  It
should be "9.1".

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +


Re: pg_upgrade not detecting version properly

From
Chris Ernst
Date:
On 10/10/2012 09:56 AM, Bruce Momjian wrote:
> Can you show me what is in the PG_VERSION file in the old cluster?  It
> should be "9.1".

Hi Bruce,

Thank you for the reply.  Indeed it is "9.1":

# cat /postgresql/9.1/main/PG_VERSION
9.1

And just for good measure:

cat /postgresql/9.2/main/PG_VERSION
9.2

And there are no other PostgreSQL versions on this machine.

Hmm... I was just about to send this when something else occurred to me.
 I had initially tried to run pg_upgrade as root and it said it couldn't
be run as root.  So I've been running it as my own user (which is in the
postgres group).  However, everything in /postgresql/9.1/main is owned
by postgres with 700 permissions.

I switched to the postgres user and now pg_upgrade is running.  Perhaps
just a more informative error message is in order.

Thank you for the shove in the right direction =)

Cheers!

    - Chris


Re: pg_upgrade not detecting version properly

From
Bruce Momjian
Date:
On Wed, Oct 10, 2012 at 10:35:06AM -0600, Chris Ernst wrote:
> On 10/10/2012 09:56 AM, Bruce Momjian wrote:
> > Can you show me what is in the PG_VERSION file in the old cluster?  It
> > should be "9.1".
>
> Hi Bruce,
>
> Thank you for the reply.  Indeed it is "9.1":
>
> # cat /postgresql/9.1/main/PG_VERSION
> 9.1
>
> And just for good measure:
>
> cat /postgresql/9.2/main/PG_VERSION
> 9.2
>
> And there are no other PostgreSQL versions on this machine.
>
> Hmm... I was just about to send this when something else occurred to me.
>  I had initially tried to run pg_upgrade as root and it said it couldn't
> be run as root.  So I've been running it as my own user (which is in the
> postgres group).  However, everything in /postgresql/9.1/main is owned
> by postgres with 700 permissions.
>
> I switched to the postgres user and now pg_upgrade is running.  Perhaps
> just a more informative error message is in order.
>
> Thank you for the shove in the right direction =)

Oops, that code was returning zero if it couldn't open the file.  The
attached, applied patch to head and 9.2 issues a proper error message.

Seems this "zero return" has been in the code since the beginning.  :-(

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +

Attachment