diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c index 66798b390275495ada8b7cbe9747813c94796368..4913554bea6522945c633701348905f8f805d4d5 100644 --- a/src/backend/commands/tablespace.c +++ b/src/backend/commands/tablespace.c @@ -1062,7 +1062,7 @@ destroy_tablespace_directories(Oid tablespaceoid, bool redo) /* remove empty directory */ if (rmdir(subfile) < 0) - ereport(redo ? LOG : ERROR, + ereport(redo ? LOG : WARNING, (errcode_for_file_access(), errmsg("could not remove directory \"%s\": %m", subfile))); @@ -1075,7 +1075,7 @@ destroy_tablespace_directories(Oid tablespaceoid, bool redo) /* remove version directory */ if (rmdir(linkloc_with_version_dir) < 0) { - ereport(redo ? LOG : ERROR, + ereport(redo ? LOG : WARNING, (errcode_for_file_access(), errmsg("could not remove directory \"%s\": %m", linkloc_with_version_dir))); @@ -1104,14 +1104,14 @@ remove_symlink: rllen = readlink(linkloc, link_target_dir, sizeof(link_target_dir)); if(rllen < 0) { - ereport(redo ? LOG : ERROR, + ereport(redo ? LOG : WARNING, (errcode_for_file_access(), errmsg("could not read symbolic link \"%s\": %m", linkloc))); } else if(rllen >= sizeof(link_target_dir)) { - ereport(redo ? LOG : ERROR, + ereport(redo ? LOG : WARNING, (errcode_for_file_access(), errmsg("symbolic link \"%s\" target is too long", linkloc))); @@ -1119,11 +1119,21 @@ remove_symlink: else { link_target_dir[rllen] = '\0'; - if(directory_is_empty(link_target_dir) && rmdir(link_target_dir) < 0) - ereport(redo ? LOG : ERROR, - (errcode_for_file_access(), - errmsg("could not remove directory \"%s\": %m", - link_target_dir))); + if (access(link_target_dir, F_OK) != 0) + { + ereport(WARNING, + (errcode_for_file_access(), + errmsg("could not open directory \"%s\": %m", + link_target_dir))); + } + else + { + if(directory_is_empty(link_target_dir) && rmdir(link_target_dir) < 0) + ereport(redo ? LOG : WARNING, + (errcode_for_file_access(), + errmsg("could not remove directory \"%s\": %m", + link_target_dir))); + } } @@ -1131,7 +1141,7 @@ remove_symlink: { int saved_errno = errno; - ereport(redo ? LOG : (saved_errno == ENOENT ? WARNING : ERROR), + ereport(redo ? LOG : WARNING, (errcode_for_file_access(), errmsg("could not stat file \"%s\": %m", linkloc))); @@ -1142,7 +1152,7 @@ remove_symlink: { int saved_errno = errno; - ereport(redo ? LOG : (saved_errno == ENOENT ? WARNING : ERROR), + ereport(redo ? LOG : WARNING, (errcode_for_file_access(), errmsg("could not remove directory \"%s\": %m", linkloc))); @@ -1155,7 +1165,7 @@ remove_symlink: { int saved_errno = errno; - ereport(redo ? LOG : (saved_errno == ENOENT ? WARNING : ERROR), + ereport(redo ? LOG : WARNING, (errcode_for_file_access(), errmsg("could not remove symbolic link \"%s\": %m", linkloc))); @@ -1165,7 +1175,7 @@ remove_symlink: else { /* Refuse to remove anything that's not a directory or symlink */ - ereport(redo ? LOG : ERROR, + ereport(redo ? LOG : WARNING, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("\"%s\" is not a directory or symbolic link", linkloc))); diff --git a/src/test/regress/input/gp_tablespace.source b/src/test/regress/input/gp_tablespace.source index a6b1df7d688641f9f64ece86e9332e79a46caa75..5d0da7e38d7525a66a5e58a1d0a93963eb70a7dc 100644 --- a/src/test/regress/input/gp_tablespace.source +++ b/src/test/regress/input/gp_tablespace.source @@ -205,3 +205,9 @@ SELECT COUNT(*) FROM tblspc_otherloc_heap; DROP TABLE tblspc_otherloc_heap; DROP TABLESPACE testspace_otherloc; + +CREATE TABLESPACE testspace_dir_empty LOCATION '@testtablespace@'; +CREATE TABLE t_dir_empty(a int); +\! rm -rf @testtablespace@/*; +DROP TABLE IF EXISTS t_dir_empty; +DROP TABLESPACE testspace_dir_empty; diff --git a/src/test/regress/output/gp_tablespace.source b/src/test/regress/output/gp_tablespace.source index fe2dec03e9d65be330a691643471cfb22e045df0..fc416da2922154fa84f291763513c719e7ce0d7b 100644 --- a/src/test/regress/output/gp_tablespace.source +++ b/src/test/regress/output/gp_tablespace.source @@ -380,3 +380,12 @@ SELECT COUNT(*) FROM tblspc_otherloc_heap; DROP TABLE tblspc_otherloc_heap; DROP TABLESPACE testspace_otherloc; +CREATE TABLESPACE testspace_dir_empty LOCATION '@testtablespace@'; +CREATE TABLE t_dir_empty(a int); +\! rm -rf @testtablespace@/*; +DROP TABLE IF EXISTS t_dir_empty; +DROP TABLESPACE testspace_dir_empty; +WARNING: could not open directory "@testtablespace@/2": No such file or directory (seg0 127.0.0.1:7002 pid=3000) +WARNING: could not open directory "@testtablespace@/3": No such file or directory (seg1 127.0.0.1:7003 pid=3001) +WARNING: could not open directory "@testtablespace@/4": No such file or directory (seg2 127.0.0.1:7004 pid=3002) +WARNING: could not open directory "@testtablespace@/1": No such file or directory