Re: Avoid erroring out when unable to remove or parse logical rewrite files to save checkpoint work
Andres Freund <andres@anarazel.de>
From: Andres Freund <andres@anarazel.de>
To: Nathan Bossart <nathandbossart@gmail.com>
Cc: Thomas Munro <thomas.munro@gmail.com>, Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>, "Bossart, Nathan" <bossartn@amazon.com>, Tom Lane <tgl@sss.pgh.pa.us>, Julien Rouhaud <rjuju123@gmail.com>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2022-07-11T20:25:33Z
Lists: pgsql-hackers
Hi,
On 2022-04-08 13:18:57 -0700, Nathan Bossart wrote:
> @@ -1035,32 +1036,9 @@ ParseConfigDirectory(const char *includedir,
>
> join_path_components(filename, directory, de->d_name);
> canonicalize_path(filename);
> - if (stat(filename, &st) == 0)
> + de_type = get_dirent_type(filename, de, true, elevel);
> + if (de_type == PGFILETYPE_ERROR)
> {
> - if (!S_ISDIR(st.st_mode))
> - {
> - /* Add file to array, increasing its size in blocks of 32 */
> - if (num_filenames >= size_filenames)
> - {
> - size_filenames += 32;
> - filenames = (char **) repalloc(filenames,
> - size_filenames * sizeof(char *));
> - }
> - filenames[num_filenames] = pstrdup(filename);
> - num_filenames++;
> - }
> - }
> - else
> - {
> - /*
> - * stat does not care about permissions, so the most likely reason
> - * a file can't be accessed now is if it was removed between the
> - * directory listing and now.
> - */
> - ereport(elevel,
> - (errcode_for_file_access(),
> - errmsg("could not stat file \"%s\": %m",
> - filename)));
> record_config_file_error(psprintf("could not stat file \"%s\"",
> filename),
> calling_file, calling_lineno,
> @@ -1068,6 +1046,18 @@ ParseConfigDirectory(const char *includedir,
> status = false;
> goto cleanup;
> }
> + else if (de_type != PGFILETYPE_DIR)
> + {
> + /* Add file to array, increasing its size in blocks of 32 */
> + if (num_filenames >= size_filenames)
> + {
> + size_filenames += 32;
> + filenames = (char **) repalloc(filenames,
> + size_filenames * sizeof(char *));
> + }
> + filenames[num_filenames] = pstrdup(filename);
> + num_filenames++;
> + }
> }
>
> if (num_filenames > 0)
Seems like the diff would be easier to read if it didn't move code around as
much?
Looks pretty reasonable, I'd be happy to commit it, I think.
Greetings,
Andres Freund
Commits
-
Expand the use of get_dirent_type(), shaving a few calls to stat()/lstat()
- bfb9dfd93720 16.0 landed
-
fsync pg_logical/mappings in CheckPointLogicalRewriteHeap().
- fd48e5f5d3a1 13.6 landed
- f862cc09fad1 10.20 landed
- 2c15b29f7c22 11.15 landed
- 2b7dbe4bd587 14.2 landed
- 1c6d055ba77a 12.10 landed
- 1fabec7d7c38 15.0 landed
-
Introduce logical decoding.
- b89e151054a0 9.4.0 cited