Re: Fwd: Add tablespace tap test to pg_rewind

2019-05-10 Thread Michael Paquier
On Thu, May 09, 2019 at 02:36:48PM +0900, Michael Paquier wrote:
> Yes, I can see that.  The issue is that even if we do a backup with
> --tablespace-mapping then we still need a tweak to allow the copy of
> symlinks.  I am not sure that this is completely what we are looking
> for either, as it means that any test setting a primary with a
> tablespace and two standbys initialized from the same base backup
> would fail.  That's not really portable.

So for now I am marking the patch as returned with feedback.  I can
see a simple way to put us through that by having an equivalent of
--tablespace-mapping for the file-level backup routine which passes it
down to RecursiveCopy.pm as well as PostgresNode::init_from_backup.
At the end of the day, we would need to be able to point the path to
different locations for:
- the primary
- any backup tables
- any standbys which are restored from the previous backups.

And on top of that there is of course the argument of pg_rewind which
would need an option similar to pg_basebackup's --tablespace-mapping
so as a target instance does not finish by using the same tablespace
path as the source where there is a tablespace of difference during
the operation.  And it does not prevent an overlap if a tablespace
needs to be created when the target instance replays WAL up to the
consistent point of the source.  So that's a lot of work which may be
hard to justify.
--
Michael


signature.asc
Description: PGP signature


Re: Fwd: Add tablespace tap test to pg_rewind

2019-05-08 Thread Michael Paquier
On Fri, Mar 22, 2019 at 04:25:53PM +0800, Shaoqi Bai wrote:
> Deleted the test for group permissions in updated patch.

Well, there are a couple of things I am not really happy about in this
patch:
- There is not much point to have has_tablespace_mapping as it is not
extensible.  Instead I'd rather use a single "extra" parameter which
can define a range of options.  An example of that is within
PostgresNode::init for "extra" and "auth_extra".
- CREATE TABLESPACE is run once on the primary *before* promoting the
standby, which causes the tablespace paths to map between both of
them.  This is not correct.  Creating a tablespace on the primary
before creating the standby, and use --tablespace-map would be the way
to go...  However per the next point...
- standby_afterpromotion is created on the promoted standby, and then
immediately dropped.  pg_rewind is able to handle this case when
working on different hosts.  But with this test we finish by having
the same problem as pg_basebackup: the source and the target server
finish by eating each other.  I think that this could actually be an
interesting feature for pg_rewind.
- A comment at the end refers to databases, and not tablespaces.

You could work out the first problem with the backup by changing the
backup()/init_from_backup() in RewindTest::create_standby by a pure
call to pg_basebackup, but you still have the second problem, which we
should still be able to test, and this requires more facility in
pg_rewind so as it is basically possible to hijack
create_target_symlink() to create a symlink to a different path than
the initial one.

> Checking the RecursiveCopy::copypath being called, only _backup_fs and
> init_from_backup called it.
> After runing cmd make -C src/bin check in updated patch, seeing no failure.

Yes, I can see that.  The issue is that even if we do a backup with
--tablespace-mapping then we still need a tweak to allow the copy of
symlinks.  I am not sure that this is completely what we are looking
for either, as it means that any test setting a primary with a
tablespace and two standbys initialized from the same base backup
would fail.  That's not really portable.
--
Michael


signature.asc
Description: PGP signature


Re: Fwd: Add tablespace tap test to pg_rewind

2019-04-26 Thread Michael Paquier
On Fri, Apr 26, 2019 at 11:21:48AM -0400, Tom Lane wrote:
> I don't think feature freeze precludes adding new test cases.

I think as well that adding this stuff into v12 would be fine.  Now if
there is any objection let's wait for later.
--
Michael


signature.asc
Description: PGP signature


Re: Fwd: Add tablespace tap test to pg_rewind

2019-04-26 Thread Tom Lane
Alvaro Herrera  writes:
> On 2019-Apr-26, Michael Paquier wrote:
>> On Fri, Apr 26, 2019 at 10:11:24AM -0400, Alvaro Herrera wrote:
>>> I just noticed this thread.  What do we think of adding this test to
>>> pg12?  (The patch doesn't apply verbatim, but it's a small update to get
>>> it to apply.)

>> Could you let me have a look at it?

> Absolutely.  I was just trying to get a sense of how frozen the water is
> at this point.

I don't think feature freeze precludes adding new test cases.

regards, tom lane




Re: Fwd: Add tablespace tap test to pg_rewind

2019-04-26 Thread Alvaro Herrera
On 2019-Apr-26, Michael Paquier wrote:

> On Fri, Apr 26, 2019 at 10:11:24AM -0400, Alvaro Herrera wrote:
> > I just noticed this thread.  What do we think of adding this test to
> > pg12?  (The patch doesn't apply verbatim, but it's a small update to get
> > it to apply.)
> 
> Could you let me have a look at it?

Absolutely.  I was just trying to get a sense of how frozen the water is
at this point.

-- 
Álvaro Herrerahttps://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services




Re: Fwd: Add tablespace tap test to pg_rewind

2019-04-26 Thread Michael Paquier
On Fri, Apr 26, 2019 at 10:11:24AM -0400, Alvaro Herrera wrote:
> I just noticed this thread.  What do we think of adding this test to
> pg12?  (The patch doesn't apply verbatim, but it's a small update to get
> it to apply.)

Could you let me have a look at it?  I have not tested on Windows, but
I suspect that because of the symlink() part this would fail, so we
may need to skip the tests.
--
Michael


signature.asc
Description: PGP signature


Re: Fwd: Add tablespace tap test to pg_rewind

2019-04-26 Thread Alvaro Herrera
I just noticed this thread.  What do we think of adding this test to
pg12?  (The patch doesn't apply verbatim, but it's a small update to get
it to apply.)

-- 
Álvaro Herrerahttps://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services




Re: Fwd: Add tablespace tap test to pg_rewind

2019-03-22 Thread Shaoqi Bai
On Fri, Mar 22, 2019 at 1:34 PM Michael Paquier  wrote:

> On Thu, Mar 21, 2019 at 11:41:01PM +0800, Shaoqi Bai wrote:
> > Have updated the patch doing as you suggested
>
> +   RewindTest::setup_cluster($test_mode, ['-g']);
> +   RewindTest::start_master();
>
> There is no need to test for group permissions here, 002_databases.pl
> already looks after that.
>
>
Deleted the test for group permissions in updated patch.


> +   # Check for symlink -- needed only on source dir, only allow symlink
> +   # when under pg_tblspc
> +   # (note: this will fall through quietly if file is already gone)
> +   if (-l $srcpath)
> So you need that but in RecursiveCopy.pm because of init_from_backup
> when creating the standby, which makes sense when it comes to
> pg_tblspc.  I am wondering about any side effects though, and if it
> would make sense to just remove the restriction for symlinks in
> _copypath_recurse().
> --
> Michael
>

Checking the RecursiveCopy::copypath being called, only _backup_fs and
init_from_backup called it.
After runing cmd make -C src/bin check in updated patch, seeing no failure.


0002-Add-new-test-with-integration-in-RewindTest.pm.patch
Description: Binary data


0001-Refactors-the-code-for-the-new-option-in-PostgresNod.patch
Description: Binary data


Re: Fwd: Add tablespace tap test to pg_rewind

2019-03-21 Thread Michael Paquier
On Thu, Mar 21, 2019 at 11:41:01PM +0800, Shaoqi Bai wrote:
> Have updated the patch doing as you suggested

+   RewindTest::setup_cluster($test_mode, ['-g']);
+   RewindTest::start_master();

There is no need to test for group permissions here, 002_databases.pl
already looks after that.

+   # Check for symlink -- needed only on source dir, only allow symlink
+   # when under pg_tblspc
+   # (note: this will fall through quietly if file is already gone)
+   if (-l $srcpath)
So you need that but in RecursiveCopy.pm because of init_from_backup
when creating the standby, which makes sense when it comes to
pg_tblspc.  I am wondering about any side effects though, and if it
would make sense to just remove the restriction for symlinks in
_copypath_recurse().
--
Michael


signature.asc
Description: PGP signature


Re: Fwd: Add tablespace tap test to pg_rewind

2019-03-21 Thread Shaoqi Bai
On Tue, Mar 12, 2019 at 10:27 AM Michael Paquier 
wrote:

> It could be an idea to split the patch in two pieces:
> - One patch which refactors the code for the new option in
> PostgresNode.pm
> - Second patch for the new test with integration in RewindTest.pm.
> This should touch different parts of the code, so combining both would
> be fine as well for me :)
> --
> Michael
>

Have updated the patch doing as you suggested


On Wed, Mar 20, 2019 at 7:45 AM Michael Paquier  wrote:

> I would have avoided
> extra routines in the patch, like what you have done with
> create_standby_tbl_mapping(), but instead do something like
> init_from_backup() which is able to take extra parameters in a way
> similar to has_streaming and has_restoring.  However, the trick with
> tablespace mapping is that the caller of backup() should be able to
> pass down multiple tablespace mapping references to make that a
> maximum portable.
> --
> Michael


Also updated the patch to achieve your suggestion.


0001-Refactors-the-code-for-the-new-option-in-PostgresNod.patch
Description: Binary data


0002-Add-new-test-with-integration-in-RewindTest.pm.patch
Description: Binary data


Re: Fwd: Add tablespace tap test to pg_rewind

2019-03-19 Thread Michael Paquier
On Tue, Mar 19, 2019 at 08:16:21PM +0800, Shaoqi Bai wrote:
> Thanks for your advice, sorry for taking so long to give update in the
> thread, because I am stuck in modifing Perl script, knowing little about
> Perl language.

No problem.  It is true that using perl for the first time can be a
certain gap, but once you get used to it it becomes really nice to be
able to control how tests are run in the tree.  I would have avoided
extra routines in the patch, like what you have done with
create_standby_tbl_mapping(), but instead do something like
init_from_backup() which is able to take extra parameters in a way
similar to has_streaming and has_restoring.  However, the trick with
tablespace mapping is that the caller of backup() should be able to
pass down multiple tablespace mapping references to make that a
maximum portable.
--
Michael


signature.asc
Description: PGP signature


Re: Fwd: Add tablespace tap test to pg_rewind

2019-03-19 Thread Shaoqi Bai
On Tue, Mar 12, 2019 at 10:27 AM Michael Paquier 
wrote:

> On Mon, Mar 11, 2019 at 07:49:11PM +0800, Shaoqi Bai wrote:
> > Thanks, will work on it as you suggested
> > Add pg_basebackup --T olddir=newdir to support check the consistency of a
> > tablespace created before promotion
> > Add run_test('remote');
>
> Thanks for considering my input.  Why don't you register your patch to
> the next commit fest then so as it goes through a formal review once
> you are able to provide a new version?  The commit fest is here:
> https://commitfest.postgresql.org/23/
>
> We are currently in the process of wrapping up the last commit fest
> for v12, so this stuff will have to wait a bit :(
>
> It could be an idea to split the patch in two pieces:
> - One patch which refactors the code for the new option in
> PostgresNode.pm
> - Second patch for the new test with integration in RewindTest.pm.
> This should touch different parts of the code, so combining both would
> be fine as well for me :)
>

Thanks for your advice, sorry for taking so long to give update in the
thread, because I am stuck in modifing Perl script, knowing little about
Perl language.

I tried to do the following two things in this patch.
1. add pg_basebackup --T olddir=newdir to support check the consistency of
a tablespace created before promotion
2. run both run_test('local') and run_test('remote');

The code can pass make installcheck under src/bin/pg_rewind, but can not
pass make installcheck under src/bin/pg_basebackup.
Because the patch refactor is not done well.

The patch still need refactor, to make other tests pass, like tests under
src/bin/pg_basebackup.
Sending the letter is just to let you know the little progress on the
thread.


0001-Add-tablespace-tap-test-for-pg_rewind.patch
Description: Binary data


Re: Fwd: Add tablespace tap test to pg_rewind

2019-03-11 Thread Michael Paquier
On Mon, Mar 11, 2019 at 07:49:11PM +0800, Shaoqi Bai wrote:
> Thanks, will work on it as you suggested
> Add pg_basebackup --T olddir=newdir to support check the consistency of a
> tablespace created before promotion
> Add run_test('remote');

Thanks for considering my input.  Why don't you register your patch to
the next commit fest then so as it goes through a formal review once
you are able to provide a new version?  The commit fest is here:
https://commitfest.postgresql.org/23/

We are currently in the process of wrapping up the last commit fest
for v12, so this stuff will have to wait a bit :(

It could be an idea to split the patch in two pieces:
- One patch which refactors the code for the new option in
PostgresNode.pm
- Second patch for the new test with integration in RewindTest.pm.
This should touch different parts of the code, so combining both would
be fine as well for me :)
--
Michael


signature.asc
Description: PGP signature


Re: Fwd: Add tablespace tap test to pg_rewind

2019-03-11 Thread Shaoqi Bai
Thanks, will work on it as you suggested
Add pg_basebackup --T olddir=newdir to support check the consistency of a
tablespace created before promotion
Add run_test('remote');

On Mon, Mar 11, 2019 at 6:50 AM Michael Paquier  wrote:

> On Sat, Mar 09, 2019 at 09:09:24AM +0900, Michael Paquier wrote:
> > When working on the first version of pg_rewind for VMware with Heikki,
> > tablespace support has been added only after, so what you propose is
> > sensible I think.
> >
> > +# Run the test in both modes.
> > +run_test('local');
> > Small nit: we should test for the remote mode here as well.
>
> I got to think more about this one a bit more, and I think that it
> would be good to also check the consistency of a tablespace created
> before promotion.  If you copy the logic from 002_databases.pl, this
> is not going to work because the primary and the standby would try to
> create the tablespace in the same path, stepping on each other's
> toes.  So what you need to do is to create the tablespace on the
> primary because creating the standby.  This requires a bit more work
> than what you propose here though as you basically need to extend
> RewindTest::create_standby so as it is possible to pass extra
> arguments to $node_master->backup.  And in this case the extra option
> to use is --tablespace-mapping to make sure that the primary and the
> standby have the same tablespace, but defined on different paths.
> --
> Michael
>


Re: Fwd: Add tablespace tap test to pg_rewind

2019-03-10 Thread Michael Paquier
On Sat, Mar 09, 2019 at 09:09:24AM +0900, Michael Paquier wrote:
> When working on the first version of pg_rewind for VMware with Heikki,
> tablespace support has been added only after, so what you propose is
> sensible I think.
> 
> +# Run the test in both modes.
> +run_test('local');
> Small nit: we should test for the remote mode here as well.

I got to think more about this one a bit more, and I think that it
would be good to also check the consistency of a tablespace created
before promotion.  If you copy the logic from 002_databases.pl, this
is not going to work because the primary and the standby would try to
create the tablespace in the same path, stepping on each other's
toes.  So what you need to do is to create the tablespace on the
primary because creating the standby.  This requires a bit more work
than what you propose here though as you basically need to extend
RewindTest::create_standby so as it is possible to pass extra
arguments to $node_master->backup.  And in this case the extra option
to use is --tablespace-mapping to make sure that the primary and the
standby have the same tablespace, but defined on different paths.
--
Michael


signature.asc
Description: PGP signature


Re: Fwd: Add tablespace tap test to pg_rewind

2019-03-08 Thread Michael Paquier
On Fri, Mar 08, 2019 at 09:42:29PM +0800, Shaoqi Bai wrote:
> There is already a databases tap tests in pg_rewind, wonder if there is a
> need for tablespace tap tests in pg_rewind.  Attached is a initial
> patch from me.

When working on the first version of pg_rewind for VMware with Heikki,
tablespace support has been added only after, so what you propose is
sensible I think.

+# Run the test in both modes.
+run_test('local');
Small nit: we should test for the remote mode here as well.
--
Michael


signature.asc
Description: PGP signature


Fwd: Add tablespace tap test to pg_rewind

2019-03-08 Thread Shaoqi Bai
Hi hackers,

There is already a databases tap tests in pg_rewind, wonder if there is a
need for tablespace tap tests in pg_rewind.
Attached is a initial patch from me.

Here is a patch for runing pg_rewind,  it is very similar to
src/bin/pg_rewind/t/002_databases.pl, but there is no master_psql("CREATE
TABLESPACE beforepromotion LOCATION '$tempdir/beforepromotion'"); after
create_standby() and before promote_standby(), because pg_rewind will error
out :
could not create directory
"/Users/sbai/work/postgres/src/bin/pg_rewind/tmp_check/t_006_tablespace_master_local_data/pgdata/pg_tblspc/24576/PG_12_201903063":
File exists
Failure, exiting

The patch is created on top of the
commit e1e0e8d58c5c70da92e36cb9d59c2f7ecf839e00 (origin/master, origin/HEAD)
Author: Michael Paquier 
Date:   Fri Mar 8 15:10:14 2019 +0900

Fix function signatures of pageinspect in documentation

tuple_data_split() lacked the type of the first argument, and
heap_page_item_attrs() has reversed the first and second argument,
with the bytea argument using an incorrect name.

Author: Laurenz Albe
Discussion:
https://postgr.es/m/8f9ab7b16daf623e87eeef5203a4ffc0dece8dfd.ca...@cybertec.at
Backpatch-through: 9.6
From 4280335c4b81aa04b967d93348ccc6874bc9c287 Mon Sep 17 00:00:00 2001
From: Shaoqi Bai 
Date: Fri, 8 Mar 2019 18:04:20 +0800
Subject: [PATCH] Add tablespace tap test for pg_rewind

---
 src/bin/pg_rewind/t/006_tablespace.pl | 51 +++
 1 file changed, 51 insertions(+)
 create mode 100644 src/bin/pg_rewind/t/006_tablespace.pl

diff --git a/src/bin/pg_rewind/t/006_tablespace.pl b/src/bin/pg_rewind/t/006_tablespace.pl
new file mode 100644
index 00..094041dd89
--- /dev/null
+++ b/src/bin/pg_rewind/t/006_tablespace.pl
@@ -0,0 +1,51 @@
+use strict;
+use warnings;
+use TestLib;
+use Test::More tests => 2;
+
+use FindBin;
+use lib $FindBin::RealBin;
+
+use RewindTest;
+
+my $tempdir = TestLib::tempdir;
+
+sub run_test
+{
+	my $test_mode = shift;
+
+	RewindTest::setup_cluster($test_mode, ['-g']);
+	RewindTest::start_master();
+
+	RewindTest::create_standby($test_mode);
+
+	RewindTest::promote_standby();
+
+	mkdir "$tempdir/master_afterpromotion";
+	mkdir "$tempdir/standby_afterpromotion";
+
+	# Create tablespaces in the old master and the new promoted standby.
+	master_psql("CREATE TABLESPACE master_afterpromotion LOCATION '$tempdir/master_afterpromotion'");
+	standby_psql("CREATE TABLESPACE standby_afterpromotion LOCATION '$tempdir/standby_afterpromotion'");
+
+	# The clusters are now diverged.
+
+	RewindTest::run_pg_rewind($test_mode);
+
+	# Check that the correct databases are present after pg_rewind.
+	check_query(
+		'SELECT spcname FROM pg_tablespace ORDER BY spcname',
+		qq(pg_default
+pg_global
+standby_afterpromotion
+),
+		'tablespace names');
+
+	RewindTest::clean_rewind_test();
+	return;
+}
+
+# Run the test in both modes.
+run_test('local');
+
+exit(0);
-- 
2.19.1