2727static int server_version = 0 ;
2828
2929static bool in_backup = false;/* TODO: more robust logic */
30- /* List of commands to execute at error processing for snapshot */
31- static parray * cleanup_list ;
3230
3331/*
3432 * Backup routines
@@ -44,10 +42,7 @@ static bool pg_is_standby(void);
4442static void get_lsn (PGresult * res ,XLogRecPtr * lsn );
4543static void get_xid (PGresult * res ,uint32 * xid );
4644
47- static bool dirExists (const char * path );
48-
4945static void add_files (parray * files ,const char * root ,bool add_root ,bool is_pgdata );
50- static int strCompare (const void * str1 ,const void * str2 );
5146static void create_file_list (parray * files ,
5247const char * root ,
5348const char * subdir ,
@@ -174,209 +169,19 @@ do_backup_database(parray *backup_list, pgBackupOption bkupopt)
174169
175170/* initialize backup list from non-snapshot */
176171files = parray_new ();
177- join_path_components (path ,backup_path ,SNAPSHOT_SCRIPT_FILE );
178-
179- /*
180- * Check the existence of the snapshot-script.
181- * backup use snapshot when snapshot-script exists.
182- */
183- if (fileExists (path ))
184- {
185- parray * tblspc_list ;/* list of name of TABLESPACE backup from snapshot */
186- parray * tblspcmp_list ;/* list of mounted directory of TABLESPACE in snapshot volume */
187- PGresult * tblspc_res ;/* contain spcname and oid in TABLESPACE */
188-
189- tblspc_list = parray_new ();
190- tblspcmp_list = parray_new ();
191- cleanup_list = parray_new ();
192-
193- /*
194- * append 'pg_tblspc' to list of directory excluded from copy.
195- * because DB cluster and TABLESPACE are copied separately.
196- */
197- for (i = 0 ;pgdata_exclude [i ];i ++ );/* find first empty slot */
198- pgdata_exclude [i ]= PG_TBLSPC_DIR ;
199-
200- /*
201- * when DB cluster is not contained in the backup from the snapshot,
202- * DB cluster is added to the backup file list from non-snapshot.
203- */
204- parray_qsort (tblspc_list ,strCompare );
205- if (parray_bsearch (tblspc_list ,"PG-DATA" ,strCompare )== NULL )
206- add_files (files ,pgdata , false, true);
207- else
208- /* remove the detected tablespace("PG-DATA") from tblspc_list */
209- parray_rm (tblspc_list ,"PG-DATA" ,strCompare );
210-
211- /*
212- * select the TABLESPACE backup from non-snapshot,
213- * and append TABLESPACE to the list backup from non-snapshot.
214- * TABLESPACE name and oid is obtained by inquiring of the database.
215- */
216-
217- reconnect ();
218- tblspc_res = execute ("SELECT spcname, oid FROM pg_tablespace WHERE "
219- "spcname NOT IN ('pg_default', 'pg_global') ORDER BY spcname ASC" ,0 ,NULL );
220- disconnect ();
221- for (i = 0 ;i < PQntuples (tblspc_res );i ++ )
222- {
223- char * name = PQgetvalue (tblspc_res ,i ,0 );
224- char * oid = PQgetvalue (tblspc_res ,i ,1 );
225-
226- /* when not found, append it to the backup list from non-snapshot */
227- if (parray_bsearch (tblspc_list ,name ,strCompare )== NULL )
228- {
229- char dir [MAXPGPATH ];
230- join_path_components (dir ,pgdata ,PG_TBLSPC_DIR );
231- join_path_components (dir ,dir ,oid );
232- add_files (files ,dir , true, false);
233- }
234- else
235- /* remove the detected tablespace from tblspc_list */
236- parray_rm (tblspc_list ,name ,strCompare );
237- }
238-
239- /*
240- * tblspc_list is not empty,
241- * so snapshot-script output the tablespace name that not exist.
242- */
243- if (parray_num (tblspc_list )> 0 )
244- elog (ERROR_SYSTEM ,"snapshot-script output the name of tablespace that not exist" );
245-
246- /* clear array */
247- parray_walk (tblspc_list ,free );
248- parray_free (tblspc_list );
249-
250- /* backup files from non-snapshot */
251- pgBackupGetPath (& current ,path ,lengthof (path ),DATABASE_DIR );
252- backup_files (pgdata ,path ,files ,prev_files ,lsn ,NULL );
253-
254- /* notify end of backup */
255- pg_stop_backup (& current );
256-
257- /* create file list of non-snapshot objects */
258- create_file_list (files ,pgdata ,DATABASE_FILE_LIST ,NULL , false);
259172
260- /* backup files from snapshot volume */
261- for (i = 0 ;i < parray_num (tblspcmp_list );i ++ )
262- {
263- char * spcname ;
264- char * mp = NULL ;
265- char * item = (char * )parray_get (tblspcmp_list ,i );
266- parray * snapshot_files = parray_new ();
267-
268- /*
269- * obtain the TABLESPACE name and the directory where it is stored.
270- * Note: strtok() replace the delimiter to '\0'. but no problem because
271- * it doesn't use former value
272- */
273- if ((spcname = strtok (item ,"=" ))== NULL || (mp = strtok (NULL ,"\0" ))== NULL )
274- elog (ERROR_SYSTEM ,"snapshot-script output illegal format: %s" ,item );
275-
276- elog (LOG ,"========================================" );
277- elog (LOG ,"backup files from snapshot: \"%s\"" ,spcname );
278-
279- /* tablespace storage directory not exist */
280- if (!dirExists (mp ))
281- elog (ERROR_SYSTEM ,"tablespace storage directory doesn't exist: %s" ,mp );
282-
283- /*
284- * create the previous backup file list to take differential backup
285- * from the snapshot volume.
286- */
287- if (prev_files != NULL )
288- prev_files = dir_read_file_list (mp ,prev_file_txt );
289-
290- /* when DB cluster is backup from snapshot, it backup from the snapshot */
291- if (strcmp (spcname ,"PG-DATA" )== 0 )
292- {
293- /* append DB cluster to backup file list */
294- add_files (snapshot_files ,mp , false, true);
295- /* backup files of DB cluster from snapshot volume */
296- backup_files (mp ,path ,snapshot_files ,prev_files ,lsn ,NULL );
297- /* create file list of snapshot objects (DB cluster) */
298- create_file_list (snapshot_files ,mp ,DATABASE_FILE_LIST ,
299- NULL , true);
300- /* remove the detected tablespace("PG-DATA") from tblspcmp_list */
301- parray_rm (tblspcmp_list ,"PG-DATA" ,strCompare );
302- i -- ;
303- }
304- /* backup TABLESPACE from snapshot volume */
305- else
306- {
307- int j ;
308-
309- /*
310- * obtain the oid from TABLESPACE information acquired by inquiring of database.
311- * and do backup files of TABLESPACE from snapshot volume.
312- */
313- for (j = 0 ;j < PQntuples (tblspc_res );j ++ )
314- {
315- char dest [MAXPGPATH ];
316- char prefix [MAXPGPATH ];
317- char * name = PQgetvalue (tblspc_res ,j ,0 );
318- char * oid = PQgetvalue (tblspc_res ,j ,1 );
319-
320- if (strcmp (spcname ,name )== 0 )
321- {
322- /* append TABLESPACE to backup file list */
323- add_files (snapshot_files ,mp , true, false);
324-
325- /* backup files of TABLESPACE from snapshot volume */
326- join_path_components (prefix ,PG_TBLSPC_DIR ,oid );
327- join_path_components (dest ,path ,prefix );
328- backup_files (mp ,dest ,snapshot_files ,prev_files ,lsn ,prefix );
329-
330- /* create file list of snapshot objects (TABLESPACE) */
331- create_file_list (snapshot_files ,mp ,DATABASE_FILE_LIST ,
332- prefix , true);
333- /*
334- * Remove the detected tablespace("PG-DATA") from
335- * tblspcmp_list.
336- */
337- parray_rm (tblspcmp_list ,spcname ,strCompare );
338- i -- ;
339- break ;
340- }
341- }
342- }
343- parray_concat (files ,snapshot_files );
344- }
345-
346- /*
347- * tblspcmp_list is not empty,
348- * so snapshot-script output the tablespace name that not exist.
349- */
350- if (parray_num (tblspcmp_list )> 0 )
351- elog (ERROR_SYSTEM ,"snapshot-script output the name of tablespace that not exist" );
352-
353- /* clear array */
354- parray_walk (tblspcmp_list ,free );
355- parray_free (tblspcmp_list );
356-
357-
358- /* don't use 'parray_walk'. element of parray not allocate memory by malloc */
359- parray_free (cleanup_list );
360- PQclear (tblspc_res );
361- }
362- /* when snapshot-script not exist, DB cluster and TABLESPACE are backup
363- * at same time.
364- */
365- else
366- {
367- /* list files with the logical path. omit $PGDATA */
368- add_files (files ,pgdata , false, true);
173+ /* list files with the logical path. omit $PGDATA */
174+ add_files (files ,pgdata , false, true);
369175
370- /* backup files */
371- pgBackupGetPath (& current ,path ,lengthof (path ),DATABASE_DIR );
372- backup_files (pgdata ,path ,files ,prev_files ,lsn ,NULL );
176+ /* backup files */
177+ pgBackupGetPath (& current ,path ,lengthof (path ),DATABASE_DIR );
178+ backup_files (pgdata ,path ,files ,prev_files ,lsn ,NULL );
373179
374- /* notify end of backup */
375- pg_stop_backup (& current );
180+ /* notify end of backup */
181+ pg_stop_backup (& current );
376182
377- /* create file list */
378- create_file_list (files ,pgdata ,DATABASE_FILE_LIST ,NULL , false);
379- }
183+ /* create file list */
184+ create_file_list (files ,pgdata ,DATABASE_FILE_LIST ,NULL , false);
380185
381186/* print summary of size of backup mode files */
382187for (i = 0 ;i < parray_num (files );i ++ )
@@ -750,22 +555,6 @@ fileExists(const char *path)
750555return true;
751556}
752557
753- /*
754- * Return true if the path is a existing directory.
755- */
756- static bool
757- dirExists (const char * path )
758- {
759- struct stat buf ;
760-
761- if (stat (path ,& buf )== -1 && errno == ENOENT )
762- return false;
763- else if (S_ISREG (buf .st_mode ))
764- return false;
765- else
766- return true;
767- }
768-
769558/*
770559 * Notify end of backup to server when "backup_label" is in the root directory
771560 * of the DB cluster.
@@ -1011,15 +800,6 @@ add_files(parray *files, const char *root, bool add_root, bool is_pgdata)
1011800parray_concat (files ,list_file );
1012801}
1013802
1014- /*
1015- * Comparison function for parray_bsearch() compare the character string.
1016- */
1017- static int
1018- strCompare (const void * str1 ,const void * str2 )
1019- {
1020- return strcmp (* (char * * )str1 ,* (char * * )str2 );
1021- }
1022-
1023803/*
1024804 * Output the list of files to backup catalog
1025805 */