Re: pg_basebackup check vs Windows file path limits
Andrew Dunstan <andrew@dunslane.net>
From: Andrew Dunstan <andrew@dunslane.net>
To: Alvaro Herrera <alvherre@alvh.no-ip.org>
Cc: Daniel Gustafsson <daniel@yesql.se>,
PostgreSQL Hackers <pgsql-hackers@postgresql.org>
Date: 2023-11-13T13:27:39Z
Lists: pgsql-hackers
On 2023-11-11 Sa 11:31, Alvaro Herrera wrote: > On 2023-Jul-08, Andrew Dunstan wrote: > >> # Running: pg_basebackup -D C:\\tools\\nmsys64\\home\\pgrunner\\bf\\root\\REL_16_STABLE\\pgsql.build/testrun/pg_basebackup/010_pg_basebackup/data/t_010_pg_basebackup_main_data/backup/tarbackup2 -h C:/tools/nmsys64/tmp/63ohSgsh21 -p 54699 --checkpoint fast --no-sync -Ft >> WARNING: aborting backup due to backend exiting before pg_backup_stop was called >> pg_basebackup: error: could not initiate base backup: ERROR: could not get junction for "./pg_replslot": More data is available. > Why not patch pgreadlink to use the method recommended by Microsoft, > that DeviceIoControl() is called first with a NULL reparseBuffer to > determine the size needed, then a second time with a buffer of that > size? > > https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-deviceiocontrol Hmm, here's what that page says - I can't see it saying what you're suggesting here - am I missing something?: |[in] nOutBufferSize| The size of the output buffer, in bytes. |[out, optional] lpBytesReturned| A pointer to a variable that receives the size of the data stored in the output buffer, in bytes. If the output buffer is too small to receive any data, the call fails, GetLastError <https://learn.microsoft.com/en-us/windows/desktop/api/errhandlingapi/nf-errhandlingapi-getlasterror> returns *ERROR_INSUFFICIENT_BUFFER*, and /lpBytesReturned/ is zero. If the output buffer is too small to hold all of the data but can hold some entries, some drivers will return as much data as fits. In this case, the call fails, GetLastError <https://learn.microsoft.com/en-us/windows/desktop/api/errhandlingapi/nf-errhandlingapi-getlasterror> returns *ERROR_MORE_DATA*, and /lpBytesReturned/ indicates the amount of data received. Your application should call *DeviceIoControl* again with the same operation, specifying a new starting point. cheers andrew -- Andrew Dunstan EDB:https://www.enterprisedb.com
Commits
-
Skip pg_baseback long filename test if path too long on Windows
- b94d70a632aa 16.0 landed
- 2e99ce68bcd2 11.21 landed
- 2d3983aea5db 12.16 landed
- 9ebe6fdc5c68 13.12 landed
- fb0f05576a0a 14.9 landed
- c0cb12f9e7b3 15.4 landed
- 1fa25ce70f09 17.0 landed