1
0
mirror of https://github.com/postgrespro/pg_probackup.git synced 2024-12-13 11:53:59 +02:00

[Issue #90] Refactoring

This commit is contained in:
Grigory Smolkin 2019-07-04 22:51:07 +03:00
parent 080988bbda
commit 9b5f9b8c99
2 changed files with 44 additions and 41 deletions

View File

@ -143,10 +143,10 @@ push_wal_file(const char *from_path, const char *to_path, bool is_compress,
char to_path_temp[MAXPGPATH];
int errno_temp;
/* partial handling */
int partial_timeout = 0;
int partial_size = 0;
struct stat st;
bool partial_exists = false;
int partial_file_timeout = 0;
int partial_file_size = 0;
bool partial_file_exists = false;
#ifdef HAVE_LIBZ
char gz_to_path[MAXPGPATH];
@ -186,7 +186,7 @@ push_wal_file(const char *from_path, const char *to_path, bool is_compress,
gz_out = fio_gzopen(to_path_temp, PG_BINARY_W, instance_config.compress_level, FIO_BACKUP_HOST);
if (gz_out == NULL)
{
partial_exists = true;
partial_file_exists = true;
elog(WARNING, "Cannot open destination temporary WAL file \"%s\": %s",
to_path_temp, strerror(errno));
}
@ -199,47 +199,28 @@ push_wal_file(const char *from_path, const char *to_path, bool is_compress,
out = fio_open(to_path_temp, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, FIO_BACKUP_HOST);
if (out < 0)
{
partial_exists = true;
partial_file_exists = true;
elog(WARNING, "Cannot open destination temporary WAL file \"%s\": %s",
to_path_temp, strerror(errno));
}
}
/* sleep a second, check if .partial file size is changing, if not, then goto p1
* Algorihtm is not pretty however we do not expect conflict for '.partial' file
* to be frequent occurrence.
* The main goal is to protect against failed archive-push which left behind
* orphan '.partial' file.
/* Partial file is already exists, it could have happened due to failed archive-push,
* in this case partial file can be discarded, or due to concurrent archiving.
*
* Our main goal here is to try to handle partial file to prevent stalling of
* continious archiving.
* To ensure that ecncountered partial file is actually a stale "orphaned" file,
* check its size every second.
* If the size has not changed in PARTIAL_WAL_TIMER seconds, we can consider
* the file stale and reuse it.
* If file size is changing, it means that another archiver works at the same
* directory with the same files. Such partial files cannot be reused.
*/
if (partial_exists)
if (partial_file_exists)
{
while (1)
while (partial_file_timeout < PARTIAL_WAL_TIMER)
{
/* exit from loop */
if (partial_timeout > 10)
{
/* For 10 second the file didn`t changed its size, so consider it stale and reuse it */
elog(WARNING, "Reusing stale destination temporary WAL file \"%s\"", to_path_temp);
fio_unlink(to_path_temp, FIO_BACKUP_HOST);
#ifdef HAVE_LIBZ
if (is_compress)
{
gz_out = fio_gzopen(to_path_temp, PG_BINARY_W, instance_config.compress_level, FIO_BACKUP_HOST);
if (gz_out == NULL)
elog(ERROR, "Cannot open destination temporary WAL file \"%s\": %s",
to_path_temp, strerror(errno));
}
else
#endif
{
out = fio_open(to_path_temp, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, FIO_BACKUP_HOST);
if (out < 0)
elog(ERROR, "Cannot open destination temporary WAL file \"%s\": %s",
to_path_temp, strerror(errno));
}
break;
}
if (fio_stat(to_path_temp, &st, false, FIO_BACKUP_HOST) < 0)
/* It is ok if partial is gone, we can safely error out */
@ -247,15 +228,36 @@ push_wal_file(const char *from_path, const char *to_path, bool is_compress,
strerror(errno));
/* first round */
if (!partial_timeout)
partial_size = st.st_size;
if (!partial_file_timeout)
partial_file_size = st.st_size;
/* file size is changing */
if (st.st_size > partial_size)
if (st.st_size > partial_file_size)
elog(ERROR, "Destination temporary WAL file \"%s\" is not stale", to_path_temp);
sleep(1);
partial_timeout++;
partial_file_timeout++;
}
/* Partial segment is considered stale, so reuse it */
elog(WARNING, "Reusing stale destination temporary WAL file \"%s\"", to_path_temp);
fio_unlink(to_path_temp, FIO_BACKUP_HOST);
#ifdef HAVE_LIBZ
if (is_compress)
{
gz_out = fio_gzopen(to_path_temp, PG_BINARY_W, instance_config.compress_level, FIO_BACKUP_HOST);
if (gz_out == NULL)
elog(ERROR, "Cannot open destination temporary WAL file \"%s\": %s",
to_path_temp, strerror(errno));
}
else
#endif
{
out = fio_open(to_path_temp, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, FIO_BACKUP_HOST);
if (out < 0)
elog(ERROR, "Cannot open destination temporary WAL file \"%s\": %s",
to_path_temp, strerror(errno));
}
}

View File

@ -63,6 +63,7 @@ extern const char *PROGRAM_EMAIL;
#define EXTERNAL_DIR "external_directories/externaldir"
/* Timeout defaults */
#define PARTIAL_WAL_TIMER 60
#define ARCHIVE_TIMEOUT_DEFAULT 300
#define REPLICA_TIMEOUT_DEFAULT 300