Re: multi-install PostgresNode - Mailing list pgsql-hackers

From Andrew Dunstan
Subject Re: multi-install PostgresNode
Date
Msg-id b45a6f32-29d3-afe8-e4de-3e13bad884ad@dunslane.net
Whole thread Raw
In response to Re: multi-install PostgresNode  (Andrew Dunstan <andrew@dunslane.net>)
Responses Re: multi-install PostgresNode
List pgsql-hackers
On 3/23/21 7:09 PM, Andrew Dunstan wrote:
> On 3/23/21 6:36 PM, Michael Paquier wrote:
>> On Thu, Jan 28, 2021 at 10:19:57AM -0500, Andrew Dunstan wrote:
>>> +BEGIN
>>> +{
>>> +
>>> +    # putting this in a BEGIN block means it's run and checked by perl -c
>>> +
>>> +
>>> +    # everything other than info and get_new_node that we need to override.
>>> +    # they are all instance methods, so we can use the same template for all.
>>> +    my @instance_overrides = qw(init backup start kill9 stop reload restart
>>> +      promote logrotate safe_psql psql background_psql
>>> +      interactive_psql poll_query_until command_ok
>>> +      command_fails command_like command_checks_all
>>> +      issues_sql_like run_log pg_recvlogical_upto
>>> +    );
>> No actual objections here, but it would be easy to miss the addition
>> of a new routine.  Would an exclusion filter be more adapted, aka
>> override everything except get_new_node() and info()?
>
>
> Actually, following a brief offline discussion today I've thought of a
> way that doesn't require subclassing. Will post that probably tomorrow.
>


And here it is. No subclass, no eval, no magic :-) Some of my colleagues
are a lot happier ;-)

The downside is that we need to litter PostgresNode with a bunch of
lines like:

    local %ENV = %ENV;
    _set_install_env($self);

The upside is that there's no longer a possibility that someone will add
a new routine to PostgresNode and forget to update the subclass.

Here is my simple test program:

    #!/usr/bin/perl

    use lib '/home/andrew/pgl/pg_head/src/test/perl';

    # PostgresNode (via TestLib) hijacks stdout, so make a dup before it
    gets a chance
    use vars qw($out);
    BEGIN
    {
        open ($out, ">&STDOUT");
    }

    use PostgresNode;

    my $node = PostgresNode->get_new_node('v12', install_path =>
    '/home/andrew/pgl/inst.12.5711');

    $ENV{PG_REGRESS} = '/bin/true'; # stupid but necessary

    $node->init();

    $node->start();

    my $version = $node->safe_psql('postgres', 'select version()');

    $node->stop();

    print $out "Version: $version\n";
    print $out $node->info();


cheers


andrew


--
Andrew Dunstan
EDB: https://www.enterprisedb.com


Attachment

pgsql-hackers by date:

Previous
From: "houzj.fnst@fujitsu.com"
Date:
Subject: RE: fix typo in reorderbuffer.c
Next
From: Stephen Frost
Date:
Subject: Re: Disable WAL logging to speed up data loading