@@ -27,7 +27,8 @@ static boolin_backup = false;/* TODO: more robust logic */
27
27
* Backup routines
28
28
*/
29
29
static void backup_cleanup (bool fatal ,void * userdata );
30
- static void delete_old_files (const char * root ,parray * files ,int keep_files ,int keep_days ,bool is_arclog );
30
+ static void delete_old_files (const char * root ,parray * files ,int keep_files ,
31
+ int keep_days ,int server_version ,bool is_arclog );
31
32
static void backup_files (const char * from_root ,const char * to_root ,
32
33
parray * files ,parray * prev_files ,XLogRecPtr * lsn ,bool compress_data );
33
34
static parray * do_backup_database (parray * backup_list ,bool smooth_checkpoint );
@@ -432,11 +433,12 @@ do_backup(bool smooth_checkpoint,
432
433
int keep_data_generations ,
433
434
int keep_data_days )
434
435
{
435
- int ret ;
436
436
parray * backup_list ;
437
437
parray * files_database ;
438
438
parray * files_arclog ;
439
439
parray * files_srvlog ;
440
+ int server_version ;
441
+ int ret ;
440
442
441
443
/* PGDATA and BACKUP_MODE are always required */
442
444
if (pgdata == NULL )
@@ -462,7 +464,7 @@ do_backup(bool smooth_checkpoint,
462
464
#endif
463
465
464
466
/* confirm data block size and xlog block size are compatible */
465
- ( void ) get_server_version ();
467
+ server_version = get_server_version ();
466
468
467
469
/* setup cleanup callback function */
468
470
in_backup = true;
@@ -546,10 +548,10 @@ do_backup(bool smooth_checkpoint,
546
548
*/
547
549
if (HAVE_ARCLOG (& current ))
548
550
delete_old_files (arclog_path ,files_arclog ,keep_arclog_files ,
549
- keep_arclog_days , true);
551
+ keep_arclog_days ,server_version , true);
550
552
if (current .with_serverlog )
551
553
delete_old_files (srvlog_path ,files_srvlog ,keep_srvlog_files ,
552
- keep_srvlog_days , false);
554
+ keep_srvlog_days ,server_version , false);
553
555
554
556
/* Delete old backup files after all backup operation. */
555
557
pgBackupDelete (keep_data_generations ,keep_data_days );
@@ -603,14 +605,17 @@ get_server_version(void)
603
605
604
606
/* confirm server version */
605
607
server_version = PQserverVersion (connection );
606
- if (server_version < 80000 )
608
+ if (server_version < 80200 )
607
609
elog (ERROR_PG_INCOMPATIBLE ,
608
- _ ("server version is %d, but must be 8.0 or higher." ),
609
- server_version );
610
+ _ ("server version is %d.%d.%d, but must be 8.2 or higher." ),
611
+ server_version /10000 ,
612
+ (server_version /100 ) %100 ,
613
+ server_version %100 );
610
614
611
615
/* confirm block_size (BLCKSZ) and wal_block_size (XLOG_BLCKSZ) */
612
616
confirm_block_size ("block_size" ,BLCKSZ );
613
- confirm_block_size ("wal_block_size" ,XLOG_BLCKSZ );
617
+ if (server_version >=80400 )
618
+ confirm_block_size ("wal_block_size" ,XLOG_BLCKSZ );
614
619
615
620
if (my_conn )
616
621
disconnect ();
@@ -625,9 +630,7 @@ confirm_block_size(const char *name, int blcksz)
625
630
char * endp ;
626
631
int block_size ;
627
632
628
- res = execute (
629
- "SELECT setting from pg_settings where name = $1" ,
630
- 1 ,& name );
633
+ res = execute ("SELECT current_setting($1)" ,1 ,& name );
631
634
if (PQntuples (res )!= 1 || PQnfields (res )!= 1 )
632
635
elog (ERROR_PG_COMMAND ,_ ("can't get %s: %s" ),
633
636
name ,PQerrorMessage (connection ));
@@ -955,7 +958,12 @@ backup_files(const char *from_root, const char *to_root, parray *files,
955
958
* of newer files exist.
956
959
*/
957
960
static void
958
- delete_old_files (const char * root ,parray * files ,int keep_files ,int keep_days ,bool is_arclog )
961
+ delete_old_files (const char * root ,
962
+ parray * files ,
963
+ int keep_files ,
964
+ int keep_days ,
965
+ int server_version ,
966
+ bool is_arclog )
959
967
{
960
968
int i ;
961
969
int j ;
@@ -996,7 +1004,7 @@ delete_old_files(const char *root, parray *files, int keep_files, int keep_days,
996
1004
997
1005
elog (LOG ,"%s() %s" ,__FUNCTION__ ,file -> path );
998
1006
/* Delete complete WAL only. */
999
- if (is_arclog && !xlog_is_complete_wal (file ))
1007
+ if (is_arclog && !xlog_is_complete_wal (file , server_version ))
1000
1008
{
1001
1009
elog (LOG ,"%s() not complete WAL" ,__FUNCTION__ );
1002
1010
continue ;