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);