Re: pg_basebackup fails if a data file is removed

Поиск
Список
Период
Сортировка
От Heikki Linnakangas
Тема Re: pg_basebackup fails if a data file is removed
Дата
Msg-id 50D46642.6010008@vmware.com
обсуждение исходный текст
Ответ на Re: pg_basebackup fails if a data file is removed  (Magnus Hagander <magnus@hagander.net>)
Список pgsql-bugs
On 21.12.2012 15:30, Magnus Hagander wrote:
> On Fri, Dec 21, 2012 at 2:28 PM, Heikki Linnakangas
> <hlinnakangas@vmware.com>  wrote:
>> When pg_basebackup copies data files, it does basically this:
>>
>>> if (lstat(pathbuf,&statbuf) != 0)
>>> {
>>>          if (errno != ENOENT)
>>>                  ereport(ERROR,
>>>                                  (errcode_for_file_access(),
>>>                                   errmsg("could not stat file or directory
>>> \"%s\": %m",
>>>                                          pathbuf)));
>>>
>>>          /* If the file went away while scanning, it's no error. */
>>>          continue;
>>> }
>>
>>> ...
>>> sendFile(pathbuf, pathbuf + basepathlen + 1,&statbuf);
>>
>> There's a race condition there. If the file is removed after the lstat call,
>> and before sendFile opens the file, the backup fails with an error. It's a
>> fairly tight window, so it's difficult to run into by accident, but by
>> putting a breakpoint with a debugger there it's quite easy to reproduce, by
>> e.g doing a VACUUM FULL on the table about to be copied.
>>
>> A straightforward fix is to allow sendFile() to ignore ENOENT. Patch
>> attached.
>
> Looks good to me.

Ok, committed.

> Nice spot - don't tell me you actually ran into it
> during testing? :)

Heh, no, eyeballing the code.

- Heikki

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Magnus Hagander
Дата:
Сообщение: Re: pg_basebackup fails if a data file is removed
Следующее
От: zelaine@amazon.com
Дата:
Сообщение: BUG #7766: Running a DML statement that affects more than 4 billion rows results in an exception