@@ -93,75 +93,79 @@ CleanupPriorWALFiles(void)
93
93
struct dirent * xlde ;
94
94
char walfile [MAXPGPATH ];
95
95
96
- if ((xldir = opendir (archiveLocation ))!= NULL )
96
+ xldir = opendir (archiveLocation );
97
+ if (xldir == NULL )
98
+ pg_fatal ("could not open archive location \"%s\": %m" ,
99
+ archiveLocation );
100
+
101
+ while (errno = 0 , (xlde = readdir (xldir ))!= NULL )
97
102
{
98
- while (errno = 0 , (xlde = readdir (xldir ))!= NULL )
103
+ char WALFilePath [MAXPGPATH * 2 ];/* the file path including
104
+ * archive */
105
+
106
+ /*
107
+ * Truncation is essentially harmless, because we skip names of length
108
+ * other than XLOG_FNAME_LEN. (In principle, one could use a
109
+ * 1000-character additional_ext and get trouble.)
110
+ */
111
+ strlcpy (walfile ,xlde -> d_name ,MAXPGPATH );
112
+ TrimExtension (walfile ,additional_ext );
113
+
114
+ /*
115
+ * Ignore anything does that not look like a WAL segment or a .partial
116
+ * WAL segment.
117
+ */
118
+ if (!IsXLogFileName (walfile )&& !IsPartialXLogFileName (walfile ))
119
+ continue ;
120
+
121
+ /*
122
+ * We ignore the timeline part of the XLOG segment identifiers in
123
+ * deciding whether a segment is still needed. This ensures that we
124
+ * won't prematurely remove a segment from a parent timeline. We could
125
+ * probably be a little more proactive about removing segments of
126
+ * non-parent timelines, but that would be a whole lot more
127
+ * complicated.
128
+ *
129
+ * We use the alphanumeric sorting property of the filenames to decide
130
+ * which ones are earlier than the exclusiveCleanupFileName file. Note
131
+ * that this means files are not removed in the order they were
132
+ * originally written, in case this worries you.
133
+ */
134
+ if (strcmp (walfile + 8 ,exclusiveCleanupFileName + 8 ) >=0 )
135
+ continue ;
136
+
137
+ /*
138
+ * Use the original file name again now, including any extension that
139
+ * might have been chopped off before testing the sequence.
140
+ */
141
+ snprintf (WALFilePath ,sizeof (WALFilePath ),"%s/%s" ,
142
+ archiveLocation ,xlde -> d_name );
143
+
144
+ if (dryrun )
99
145
{
100
146
/*
101
- *Truncation is essentially harmless, because we skip names of
102
- *length other than XLOG_FNAME_LEN. (In principle, one could use
103
- *a 1000-character additional_ext and get trouble.)
147
+ *Prints the name of the file to be removed and skips the actual
148
+ *removal. The regular printout is so that the user can pipe the
149
+ *output into some other program.
104
150
*/
105
- strlcpy (walfile ,xlde -> d_name ,MAXPGPATH );
106
- TrimExtension (walfile ,additional_ext );
107
-
108
- /*
109
- * We ignore the timeline part of the XLOG segment identifiers in
110
- * deciding whether a segment is still needed. This ensures that
111
- * we won't prematurely remove a segment from a parent timeline.
112
- * We could probably be a little more proactive about removing
113
- * segments of non-parent timelines, but that would be a whole lot
114
- * more complicated.
115
- *
116
- * We use the alphanumeric sorting property of the filenames to
117
- * decide which ones are earlier than the exclusiveCleanupFileName
118
- * file. Note that this means files are not removed in the order
119
- * they were originally written, in case this worries you.
120
- */
121
- if ((IsXLogFileName (walfile )|| IsPartialXLogFileName (walfile ))&&
122
- strcmp (walfile + 8 ,exclusiveCleanupFileName + 8 )< 0 )
123
- {
124
- char WALFilePath [MAXPGPATH * 2 ];/* the file path
125
- * including archive */
126
-
127
- /*
128
- * Use the original file name again now, including any
129
- * extension that might have been chopped off before testing
130
- * the sequence.
131
- */
132
- snprintf (WALFilePath ,sizeof (WALFilePath ),"%s/%s" ,
133
- archiveLocation ,xlde -> d_name );
134
-
135
- if (dryrun )
136
- {
137
- /*
138
- * Prints the name of the file to be removed and skips the
139
- * actual removal. The regular printout is so that the
140
- * user can pipe the output into some other program.
141
- */
142
- printf ("%s\n" ,WALFilePath );
143
- pg_log_debug ("file \"%s\" would be removed" ,WALFilePath );
144
- continue ;
145
- }
146
-
147
- pg_log_debug ("removing file \"%s\"" ,WALFilePath );
148
-
149
- rc = unlink (WALFilePath );
150
- if (rc != 0 )
151
- pg_fatal ("could not remove file \"%s\": %m" ,
152
- WALFilePath );
153
- }
151
+ printf ("%s\n" ,WALFilePath );
152
+ pg_log_debug ("file \"%s\" would be removed" ,WALFilePath );
153
+ continue ;
154
154
}
155
155
156
- if ( errno )
157
- pg_fatal ( "could not read archive location \"%s\": %m" ,
158
- archiveLocation );
159
- if (closedir ( xldir ) )
160
- pg_fatal ("could notclose archive location \"%s\": %m" ,
161
- archiveLocation );
156
+ pg_log_debug ( "removing file \"%s\"" , WALFilePath );
157
+
158
+ rc = unlink ( WALFilePath );
159
+ if (rc != 0 )
160
+ pg_fatal ("could notremove file \"%s\": %m" ,
161
+ WALFilePath );
162
162
}
163
- else
164
- pg_fatal ("could not open archive location \"%s\": %m" ,
163
+
164
+ if (errno )
165
+ pg_fatal ("could not read archive location \"%s\": %m" ,
166
+ archiveLocation );
167
+ if (closedir (xldir ))
168
+ pg_fatal ("could not close archive location \"%s\": %m" ,
165
169
archiveLocation );
166
170
}
167
171