From: | Andrew Dunstan <andrew(at)dunslane(dot)net> |
---|---|
To: | Michael Paquier <michael(at)paquier(dot)xyz> |
Cc: | Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, Peter Eisentraut <peter(dot)eisentraut(at)enterprisedb(dot)com>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: multi-install PostgresNode |
Date: | 2021-03-24 11:35:05 |
Message-ID: | b45a6f32-29d3-afe8-e4de-3e13bad884ad@dunslane.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | 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 | Content-Type | Size |
---|---|---|
PostgresNodePath-4.patch | text/x-patch | 9.7 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Stephen Frost | 2021-03-24 11:43:57 | Re: Disable WAL logging to speed up data loading |
Previous Message | houzj.fnst@fujitsu.com | 2021-03-24 10:52:14 | RE: fix typo in reorderbuffer.c |