aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/dbsize.c
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2007-03-11 05:22:00 +0000
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2007-03-11 05:22:00 +0000
commit576027bb3f6b9793478914305dbe12270bc31a8b (patch)
treecbd4e92097783cfc537bc0a63ab09ce7641c1ffd /src/backend/utils/adt/dbsize.c
parent5acde74e1a2d934d825f1f538de4a4f267b839c1 (diff)
downloadpostgresql-576027bb3f6b9793478914305dbe12270bc31a8b.tar.gz
postgresql-576027bb3f6b9793478914305dbe12270bc31a8b.zip
Fix a race condition that caused pg_database_size() and pg_tablespace_size()
to fail if an object was removed between calls to ReadDir() and stat(). Per discussion in pgsql-hackers. http://archives.postgresql.org/pgsql-hackers/2007-03/msg00671.php Bug report and patch by Michael Fuhr.
Diffstat (limited to 'src/backend/utils/adt/dbsize.c')
-rw-r--r--src/backend/utils/adt/dbsize.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c
index 6df746c38eb..e733260370e 100644
--- a/src/backend/utils/adt/dbsize.c
+++ b/src/backend/utils/adt/dbsize.c
@@ -5,7 +5,7 @@
* Copyright (c) 2002-2007, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/dbsize.c,v 1.11 2007/02/27 23:48:07 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/dbsize.c,v 1.12 2007/03/11 05:22:00 alvherre Exp $
*
*/
@@ -52,10 +52,14 @@ db_dir_size(const char *path)
snprintf(filename, MAXPGPATH, "%s/%s", path, direntry->d_name);
if (stat(filename, &fst) < 0)
- ereport(ERROR,
- (errcode_for_file_access(),
- errmsg("could not stat file \"%s\": %m", filename)));
-
+ {
+ if (errno == ENOENT)
+ continue;
+ else
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not stat file \"%s\": %m", filename)));
+ }
dirsize += fst.st_size;
}
@@ -174,9 +178,14 @@ calculate_tablespace_size(Oid tblspcOid)
snprintf(pathname, MAXPGPATH, "%s/%s", tblspcPath, direntry->d_name);
if (stat(pathname, &fst) < 0)
- ereport(ERROR,
- (errcode_for_file_access(),
- errmsg("could not stat file \"%s\": %m", pathname)));
+ {
+ if (errno == ENOENT)
+ continue;
+ else
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not stat file \"%s\": %m", pathname)));
+ }
if (fst.st_mode & S_IFDIR)
totalsize += db_dir_size(pathname);