diff options
| author | Raghavendra G <raghavendra@zresearch.com> | 2009-04-09 07:59:21 -0700 | 
|---|---|---|
| committer | Anand V. Avati <avati@amp.gluster.com> | 2009-04-09 20:33:17 +0530 | 
| commit | bf7b4623821c8ffe8070297949e18dc6e3757e9c (patch) | |
| tree | 4e29b5e4dd165bb8d87a0925bf83e6ef105300bf /xlators/storage | |
| parent | fb034ba3036fadc7cf35edc5cae7481149a67ca0 (diff) | |
posix_unlink: make unlinking in background configurable through volume spec file
Signed-off-by: Anand V. Avati <avati@amp.gluster.com>
Diffstat (limited to 'xlators/storage')
| -rw-r--r-- | xlators/storage/posix/src/posix.c | 49 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix.h | 8 | 
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;  };  | 
