Re: PATCH: Configurable file mode mask - Mailing list pgsql-hackers

From Michael Paquier
Subject Re: PATCH: Configurable file mode mask
Date
Msg-id 20180306034452.GJ1878@paquier.xyz
Whole thread Raw
In response to Re: PATCH: Configurable file mode mask  (David Steele <david@pgmasters.net>)
Responses Re: PATCH: Configurable file mode mask  (David Steele <david@pgmasters.net>)
List pgsql-hackers
On Mon, Mar 05, 2018 at 03:07:20PM -0500, David Steele wrote:
> On 2/28/18 2:28 AM, Michael Paquier wrote:
>> On Tue, Feb 27, 2018 at 03:52:32PM -0500, David Steele wrote:
>> I don't quite understand here.  I have no objection into extending
>> setup_cluster() with a group_access argument so as the tests run both
>> the group access and without it, but I'd rather keep the low-level API
>> clean of anything fancy if we can use the facility which already
>> exists.
>
> I'm not sure what you mean by, "facility that already exists".  I think
> I implemented this the same as the allows_streaming and has_archiving
> flags.  The only difference is that this option must be set at initdb
> time rather than in postgresql.conf.
>
> Could you be more specific?

Let's remove has_group_access from PostgresNode::init and instead use
existing parameter called "extra".  In your patch, this setup:
has_group_access => 1
is equivalent to that:
extra => [ -g ]
You can also guess the value of has_group_access by parsing the
arguments from the array "extra".

> I think I prefer grouping 1 and 2.  It produces less churn, as you say,
> and I don't think MakeDirectoryDefaultPerm really needs its own patch.
> Based on comments so far, nobody has an objection to it.
>
> In theory, the first two patches could be applied just for refactoring
> without adding group permissions at all.  There are a lot of new tests
> to make sure permissions are set correctly so it seems like a win
> right off.

Okay, that's fine for me.

>> check_pg_data_perm() looks useful even without $allow_group even if the
>> grouping facility is reverted at the end.  S_ISLNK should be considered
>> as well for tablespaces or symlinks of pg_wal?  We have such cases in
>> the regression tests.
>
> Hmmm, the link is just pointing to a directory whose permissions have
> been changed.  Why do we need to worry about the link?

Oh, perhaps I misread your code here, but this ignores symlinks, for
example take an instance where pg_wal is symlinked, we'd likely want to
make sure that at least archive_status is using a correct set of
permissions, no?  There is a "follow" option in File::Find which could
help.

>> -    if (chmod(path, S_IRUSR | S_IWUSR) != 0)
>> -    {
>> -    fprintf(stderr, _("%s: could not change permissions of \"%s\": %s\n"),
>> -        progname, path, strerror(errno));
>> -    exit_nicely();
>> -    }
>> Hm.  Why are those removed?
>
> When I started working on this, pg_upgrade did not set umask and instead
> did chmod for each dir created.  umask() has since been added (even
> before my patch) and so these are now noops.  Seemed easier to remove
> them than to change them all.
>
>>     setup_signals();
>>
>> -   umask(S_IRWXG | S_IRWXO);
>> -
>>     create_data_directory();
>> This should not be moved around.
>
> Hmmm - I moved it much earlier in the process which seems like a good
> thing.  Consider if there was a option to fixup permissions, like there
> is to fsync.  Isn't it best to set the mode as soon as possible to
> prevent code from being inserted before it?

Those two are separate issues.  Could you begin a new thread on the
matter?  This will attract more attention.

The indentation in RewindTest.pm is a bit wrong.

-   if (chmod(location, S_IRWXU) != 0)
+   current_umask = umask(0);
+   umask(current_umask);
[...]
-   if (chmod(pg_data, S_IRWXU) != 0)
+   if (chmod(pg_data, PG_DIR_MODE_DEFAULT & ~file_mode_mask) != 0)
Such modifications should be part of patch 3, not 2, where the group
features really apply.

    my $test_mode = shift;

+   umask(0077);
+
    RewindTest::setup_cluster($test_mode);
What's that for?  A comment would be welcome.

+# make sure all directories and files have group permissions
+if [ $(find ${PGDATA} -type f ! -perm 600 | wc -l) -ne 0 ]; then
+   echo "files in PGDATA with permission != 600";
+   exit 1;
+fi
Perhaps on hold if we are able to move pg_upgrade tests to a TAP
suite...  We'll see what happens.

Perhaps the tests should be cut into a separate patch?  Those are not
directly related to the refactoring done in patch 2.

Patch 2 begins to look fine for me.  I still need to look at patch 3 in
more details.
--
Michael

Attachment

pgsql-hackers by date:

Previous
From: Claudio Freire
Date:
Subject: Re: Faster inserts with mostly-monotonically increasing values
Next
From: Peter Geoghegan
Date:
Subject: Re: [HACKERS] MERGE SQL Statement for PG11