| From: | Nathan Bossart <nathandbossart(at)gmail(dot)com> | 
|---|---|
| To: | Andres Freund <andres(at)anarazel(dot)de> | 
| Cc: | Thomas Munro <thomas(dot)munro(at)gmail(dot)com>, Bharath Rupireddy <bharath(dot)rupireddyforpostgres(at)gmail(dot)com>, "Bossart, Nathan" <bossartn(at)amazon(dot)com>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Julien Rouhaud <rjuju123(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> | 
| Subject: | Re: Avoid erroring out when unable to remove or parse logical rewrite files to save checkpoint work | 
| Date: | 2022-07-11 21:23:54 | 
| Message-ID: | 20220711212354.GA2458001@nathanxps13 | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-hackers | 
On Mon, Jul 11, 2022 at 01:25:33PM -0700, Andres Freund wrote:
> 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?
I opted to reorganize in order save an indent and simplify the conditions a
bit.  The alternative is something like this:
	if (de_type != PGFILETYPE_ERROR)
	{
		if (de_type != PGTFILETYPE_DIR)
		{
			...
		}
	}
	else
	{
		...
	}
I don't feel strongly one way or another, and I'll change it if you think
it's worth it to simplify the diff.
> Looks pretty reasonable, I'd be happy to commit it, I think.
Appreciate it.
-- 
Nathan Bossart
Amazon Web Services: https://aws.amazon.com
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Andres Freund | 2022-07-11 21:37:55 | Re: automatically generating node support functions | 
| Previous Message | Tom Lane | 2022-07-11 21:18:57 | Re: automatically generating node support functions |