/* * Process one tablespace directory for ResetUnloggedRelations */ static void ResetUnloggedRelationsInTablespaceDir(const char *tsdirname, int op) { DIR *ts_dir; struct dirent *de; char dbspace_path[MAXPGPATH * 2]; ts_dir = AllocateDir(tsdirname); /* * If we get ENOENT on a tablespace directory, log it and return. This * can happen if a previous DROP TABLESPACE crashed between removing the * tablespace directory and removing the symlink in pg_tblspc. We don't * really want to prevent database startup in that scenario, so let it * pass instead. Any other type of error will be reported by ReadDir * (causing a startup failure). */ if (ts_dir == NULL && errno == ENOENT) { ereport(LOG, (errcode_for_file_access(), errmsg("could not open directory \"%s\": %m", tsdirname))); return; } while ((de = ReadDir(ts_dir, tsdirname)) != NULL) { /* * We're only interested in the per-database directories, which have * numeric names. Note that this code will also (properly) ignore "." * and "..". */ if (strspn(de->d_name, "0123456789") != strlen(de->d_name)) continue; snprintf(dbspace_path, sizeof(dbspace_path), "%s/%s", tsdirname, de->d_name); ResetUnloggedRelationsInDbspaceDir(dbspace_path, op); } FreeDir(ts_dir); }
/* Process one tablespace directory for ResetUnloggedRelations */ static void ResetUnloggedRelationsInTablespaceDir(const char *tsdirname, int op) { DIR *ts_dir; struct dirent *de; char dbspace_path[MAXPGPATH]; ts_dir = AllocateDir(tsdirname); if (ts_dir == NULL) { /* anything except ENOENT is fishy */ if (errno != ENOENT) elog(LOG, "could not open tablespace directory \"%s\": %m", tsdirname); return; } while ((de = ReadDir(ts_dir, tsdirname)) != NULL) { int i = 0; /* * We're only interested in the per-database directories, which have * numeric names. Note that this code will also (properly) ignore "." * and "..". */ while (isdigit((unsigned char) de->d_name[i])) ++i; if (de->d_name[i] != '\0' || i == 0) continue; snprintf(dbspace_path, sizeof(dbspace_path), "%s/%s", tsdirname, de->d_name); ResetUnloggedRelationsInDbspaceDir(dbspace_path, op); } FreeDir(ts_dir); }