24
24
25
25
#include "storage/copydir.h"
26
26
#include "storage/fd.h"
27
+ #include "storage/cfs.h"
27
28
#include "access/transam.h"
28
29
#include "miscadmin.h"
29
30
@@ -40,6 +41,7 @@ copydir(char *fromdir, char *todir, bool recurse)
40
41
struct dirent * xlde ;
41
42
char fromfile [MAXPGPATH ];
42
43
char tofile [MAXPGPATH ];
44
+ bool savedGCState = false;
43
45
44
46
if (mkdir (todir , S_IRWXU ) != 0 )
45
47
ereport (ERROR ,
@@ -52,36 +54,49 @@ copydir(char *fromdir, char *todir, bool recurse)
52
54
(errcode_for_file_access (),
53
55
errmsg ("could not open directory \"%s\": %m" , fromdir )));
54
56
55
- while ((xlde = ReadDir (xldir , fromdir )) != NULL )
56
- {
57
- struct stat fst ;
58
-
59
- /* If we got a cancel signal during the copy of the directory, quit */
60
- CHECK_FOR_INTERRUPTS ();
61
-
62
- if (strcmp (xlde -> d_name , "." ) == 0 ||
63
- strcmp (xlde -> d_name , ".." ) == 0 )
64
- continue ;
65
-
66
- snprintf (fromfile , MAXPGPATH , "%s/%s" , fromdir , xlde -> d_name );
67
- snprintf (tofile , MAXPGPATH , "%s/%s" , todir , xlde -> d_name );
68
57
69
- if (lstat (fromfile , & fst ) < 0 )
70
- ereport (ERROR ,
71
- (errcode_for_file_access (),
72
- errmsg ("could not stat file \"%s\": %m" , fromfile )));
58
+ savedGCState = cfs_control_gc (false); /* disable GC during copy */
73
59
74
- if (S_ISDIR (fst .st_mode ))
60
+ PG_TRY ();
61
+ {
62
+ while ((xlde = ReadDir (xldir , fromdir )) != NULL )
75
63
{
76
- /* recurse to handle subdirectories */
77
- if (recurse )
78
- copydir (fromfile , tofile , true);
64
+ struct stat fst ;
65
+
66
+ /* If we got a cancel signal during the copy of the directory, quit */
67
+ CHECK_FOR_INTERRUPTS ();
68
+
69
+ if (strcmp (xlde -> d_name , "." ) == 0 ||
70
+ strcmp (xlde -> d_name , ".." ) == 0 )
71
+ continue ;
72
+
73
+ snprintf (fromfile , MAXPGPATH , "%s/%s" , fromdir , xlde -> d_name );
74
+ snprintf (tofile , MAXPGPATH , "%s/%s" , todir , xlde -> d_name );
75
+
76
+ if (lstat (fromfile , & fst ) < 0 )
77
+ ereport (ERROR ,
78
+ (errcode_for_file_access (),
79
+ errmsg ("could not stat file \"%s\": %m" , fromfile )));
80
+
81
+ if (S_ISDIR (fst .st_mode ))
82
+ {
83
+ /* recurse to handle subdirectories */
84
+ if (recurse )
85
+ copydir (fromfile , tofile , true);
86
+ }
87
+ else if (S_ISREG (fst .st_mode ))
88
+ copy_file (fromfile , tofile );
79
89
}
80
- else if (S_ISREG (fst .st_mode ))
81
- copy_file (fromfile , tofile );
90
+ FreeDir (xldir );
82
91
}
83
- FreeDir (xldir );
84
-
92
+ PG_CATCH ();
93
+ {
94
+ cfs_control_gc (savedGCState );
95
+ PG_RE_THROW ();
96
+ }
97
+ PG_END_TRY ();
98
+ cfs_control_gc (savedGCState );
99
+
85
100
/*
86
101
* Be paranoid here and fsync all files to ensure the copy is really done.
87
102
* But if fsync is disabled, we're done.
@@ -139,6 +154,7 @@ copyzipdir(char *fromdir, bool from_compressed,
139
154
struct dirent * xlde ;
140
155
char fromfile [MAXPGPATH ];
141
156
char tofile [MAXPGPATH ];
157
+ bool savedGCState ;
142
158
143
159
if (mkdir (todir , S_IRWXU ) != 0 )
144
160
ereport (ERROR ,
@@ -151,31 +167,43 @@ copyzipdir(char *fromdir, bool from_compressed,
151
167
(errcode_for_file_access (),
152
168
errmsg ("could not open directory \"%s\": %m" , fromdir )));
153
169
154
- while ((xlde = ReadDir (xldir , fromdir )) != NULL )
155
- {
156
- struct stat fst ;
157
-
158
- /* If we got a cancel signal during the copy of the directory, quit */
159
- CHECK_FOR_INTERRUPTS ();
160
-
161
- if (strcmp (xlde -> d_name , "." ) == 0
162
- || strcmp (xlde -> d_name , ".." ) == 0
163
- || (strlen (xlde -> d_name ) > 4
164
- && strcmp (xlde -> d_name + strlen (xlde -> d_name ) - 4 , ".cfm" ) == 0 ))
165
- continue ;
170
+ savedGCState = cfs_control_gc (false); /* disable GC during copy */
166
171
167
- snprintf (fromfile , MAXPGPATH , "%s/%s" , fromdir , xlde -> d_name );
168
- snprintf (tofile , MAXPGPATH , "%s/%s" , todir , xlde -> d_name );
169
-
170
- if (lstat (fromfile , & fst ) < 0 )
171
- ereport (ERROR ,
172
- (errcode_for_file_access (),
173
- errmsg ("could not stat file \"%s\": %m" , fromfile )));
174
-
175
- if (S_ISREG (fst .st_mode ))
176
- copy_zip_file (fromfile , from_compressed , tofile , to_compressed );
172
+ PG_TRY ();
173
+ {
174
+ while ((xlde = ReadDir (xldir , fromdir )) != NULL )
175
+ {
176
+ struct stat fst ;
177
+
178
+ /* If we got a cancel signal during the copy of the directory, quit */
179
+ CHECK_FOR_INTERRUPTS ();
180
+
181
+ if (strcmp (xlde -> d_name , "." ) == 0
182
+ || strcmp (xlde -> d_name , ".." ) == 0
183
+ || (strlen (xlde -> d_name ) > 4
184
+ && strcmp (xlde -> d_name + strlen (xlde -> d_name ) - 4 , ".cfm" ) == 0 ))
185
+ continue ;
186
+
187
+ snprintf (fromfile , MAXPGPATH , "%s/%s" , fromdir , xlde -> d_name );
188
+ snprintf (tofile , MAXPGPATH , "%s/%s" , todir , xlde -> d_name );
189
+
190
+ if (lstat (fromfile , & fst ) < 0 )
191
+ ereport (ERROR ,
192
+ (errcode_for_file_access (),
193
+ errmsg ("could not stat file \"%s\": %m" , fromfile )));
194
+
195
+ if (S_ISREG (fst .st_mode ))
196
+ copy_zip_file (fromfile , from_compressed , tofile , to_compressed );
197
+ }
198
+ FreeDir (xldir );
177
199
}
178
- FreeDir (xldir );
200
+ PG_CATCH ();
201
+ {
202
+ cfs_control_gc (savedGCState );
203
+ PG_RE_THROW ();
204
+ }
205
+ PG_END_TRY ();
206
+ cfs_control_gc (savedGCState );
179
207
180
208
/*
181
209
* Be paranoid here and fsync all files to ensure the copy is really done.
0 commit comments