sendFileWithContent() does not advance the source pointer

Поиск
Список
Период
Сортировка
От Antonin Houska
Тема sendFileWithContent() does not advance the source pointer
Дата
Msg-id 15764.1670528645@antos
обсуждение исходный текст
Ответы Re: sendFileWithContent() does not advance the source pointer  (Andres Freund <andres@anarazel.de>)
Re: sendFileWithContent() does not advance the source pointer  (Robert Haas <robertmhaas@gmail.com>)
Список pgsql-hackers
When checking something else in the base backup code, I've noticed that
sendFileWithContent() does not advance the 'content' pointer. The sink buffer
is large enough (32kB) so that the first iteration usually processes the whole
file (only special files are processed by this function), and thus that the
problem is hidden.

However it's possible to hit the issue: if there are too many tablespaces,
pg_basebackup generates corrupted tablespace_map. Instead of writing all the
tablespace paths it writes only some and then starts to write the contents
from the beginning again.

The attached script generates scripts to create many tablespaces as well as
the underlying directories. Fix is attached here as well.

-- 
Antonin Houska
Web: https://www.cybertec-postgresql.com

#!/bin/bash

TBSPDIR=/mnt/ramdisk/tbspcs
TBSPCOUNT=2048
SCRIPT_SH=create.sh
SCRIPT_SQL=create.sql

echo "#!/bin/bash" > ${SCRIPT_SH}
echo "mkdir -p $TBSPDIR" >> ${SCRIPT_SH}

echo "" > ${SCRIPT_SQL}

i=0
while [ $i -lt $TBSPCOUNT ];
do
    printf "mkdir %s/%.4d\n" $TBSPDIR $i >> ${SCRIPT_SH}
    printf "CREATE TABLESPACE tbsp_%.4d LOCATION '%s/%.4d';\n" $i $TBSPDIR $i >> ${SCRIPT_SQL}
    i=$((i+1))
done

chmod u+x ${SCRIPT_SH}
diff --git a/src/backend/backup/basebackup.c b/src/backend/backup/basebackup.c
index 74fb529380..7aa5f6e44d 100644
--- a/src/backend/backup/basebackup.c
+++ b/src/backend/backup/basebackup.c
@@ -1073,6 +1073,7 @@ sendFileWithContent(bbsink *sink, const char *filename, const char *content,
         memcpy(sink->bbs_buffer, content, nbytes);
         bbsink_archive_contents(sink, nbytes);
         bytes_done += nbytes;
+        content += nbytes;
     }
 
     _tarWritePadding(sink, len);

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

Предыдущее
От: Nathan Bossart
Дата:
Сообщение: Re: Documenting MERGE INTO ONLY ...
Следующее
От: David Rowley
Дата:
Сообщение: Re: Aggregate node doesn't include cost for sorting