summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaghavendra G <raghavendra@zresearch.com>2009-04-09 07:59:21 -0700
committerAnand V. Avati <avati@amp.gluster.com>2009-04-09 20:33:17 +0530
commitbf7b4623821c8ffe8070297949e18dc6e3757e9c (patch)
tree4e29b5e4dd165bb8d87a0925bf83e6ef105300bf
parentfb034ba3036fadc7cf35edc5cae7481149a67ca0 (diff)
posix_unlink: make unlinking in background configurable through volume spec file
Signed-off-by: Anand V. Avati <avati@amp.gluster.com>
-rw-r--r--xlators/storage/posix/src/posix.c49
-rw-r--r--xlators/storage/posix/src/posix.h8
2 files changed, 44 insertions, 13 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index 9f4c42a1a31..99c4879837d 100644
--- a/xlators/storage/posix/src/posix.c
+++ b/xlators/storage/posix/src/posix.c
@@ -850,10 +850,11 @@ int32_t
posix_unlink (call_frame_t *frame, xlator_t *this,
loc_t *loc)
{
- int32_t op_ret = -1;
- int32_t op_errno = 0;
- char * real_path = NULL;
- int32_t fd = -1;
+ int32_t op_ret = -1;
+ int32_t op_errno = 0;
+ char *real_path = NULL;
+ int32_t fd = -1;
+ struct posix_private *priv = NULL;
DECLARE_OLD_FS_ID_VAR;
@@ -864,15 +865,18 @@ posix_unlink (call_frame_t *frame, xlator_t *this,
SET_FS_ID (frame->root->uid, frame->root->gid);
MAKE_REAL_PATH (real_path, this, loc->path);
- if (S_ISREG (loc->inode->st_mode)) {
- fd = open (real_path, O_RDONLY);
- if (fd == -1) {
- op_ret = -1;
- op_errno = errno;
- gf_log (this->name, GF_LOG_WARNING,
- "open of %s failed: %s", loc->path,
- strerror (op_errno));
- goto out;
+ priv = this->private;
+ if (priv->background_unlink) {
+ if (S_ISREG (loc->inode->st_mode)) {
+ fd = open (real_path, O_RDONLY);
+ if (fd == -1) {
+ op_ret = -1;
+ op_errno = errno;
+ gf_log (this->name, GF_LOG_WARNING,
+ "open of %s failed: %s", loc->path,
+ strerror (op_errno));
+ goto out;
+ }
}
}
@@ -3937,6 +3941,23 @@ init (xlator_t *this)
"'statfs()' returns dummy size");
}
+ _private->background_unlink = 0;
+ tmp_data = dict_get (this->options, "background-unlink");
+ if (tmp_data) {
+ if (gf_string2boolean (tmp_data->data,
+ &_private->background_unlink) == -1) {
+ ret = -1;
+ gf_log (this->name, GF_LOG_ERROR,
+ "'export-statfs-size' takes only boolean "
+ "options");
+ goto out;
+ }
+
+ if (_private->background_unlink)
+ gf_log (this->name, GF_LOG_DEBUG,
+ "unlinks will be performed in background");
+ }
+
tmp_data = dict_get (this->options, "o-direct");
if (tmp_data) {
if (gf_string2boolean (tmp_data->data,
@@ -4087,5 +4108,7 @@ struct volume_options options[] = {
.type = GF_OPTION_TYPE_BOOL },
{ .key = {"span-devices"},
.type = GF_OPTION_TYPE_INT },
+ { .key = {"background-unlink"},
+ .type = GF_OPTION_TYPE_BOOL },
{ .key = {NULL} }
};
diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h
index 88860a57116..ed6b46430dd 100644
--- a/xlators/storage/posix/src/posix.h
+++ b/xlators/storage/posix/src/posix.h
@@ -93,6 +93,14 @@ struct posix_private {
gf_boolean_t span_devices;
+/*
+ decide whether posix_unlink does open (file), unlink (file), close (fd)
+ instead of just unlink (file). with the former approach there is no lockout
+ of access to parent directory during removal of very large files for the
+ entire duration of freeing of data blocks.
+*/
+ gf_boolean_t background_unlink;
+
int num_devices_to_span;
dev_t *st_device;
};