diff options
author | Vikas Gorur <vikas@gluster.com> | 2009-12-02 07:48:45 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-12-02 10:29:23 -0800 |
commit | c04c1a170dcc605efcf80c8ae2674b69488b591d (patch) | |
tree | 31add18b6173c517454bdc48d9d508250a1eaded /xlators/cluster/afr | |
parent | 90328b827768552a05bb12abf62d09c9566309d1 (diff) |
storage/posix: Added janitor thread.
The janitor thread deletes all files and directories in
the "/" GF_REPLICATE_TRASH_DIR directory. This directory
is used by replicate self-heal to dump files and
directories it deletes.
This is needed because letting replicate walk the directory
tree and delete a directory and all its children is too racy.
Instead, replicate self-heal only does an atomic rename(),
and the janitor thread takes care of actually deleting them.
Signed-off-by: Vikas Gorur <vikas@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 227 (replicate selfheal does not remove directory with contents in it)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=227
Diffstat (limited to 'xlators/cluster/afr')
-rw-r--r-- | xlators/cluster/afr/src/afr-dir-read.c | 4 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-entry.c | 26 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr.c | 2 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr.h | 1 |
4 files changed, 16 insertions, 17 deletions
diff --git a/xlators/cluster/afr/src/afr-dir-read.c b/xlators/cluster/afr/src/afr-dir-read.c index fab60b66ef7..b48488526e5 100644 --- a/xlators/cluster/afr/src/afr-dir-read.c +++ b/xlators/cluster/afr/src/afr-dir-read.c @@ -361,7 +361,7 @@ afr_readdir_cbk (call_frame_t *frame, void *cookie, child_index); if ((local->fd->inode == local->fd->inode->table->root) - && !strcmp (entry->d_name, AFR_TRASH_DIR)) { + && !strcmp (entry->d_name, GF_REPLICATE_TRASH_DIR)) { list_del_init (&entry->list); FREE (entry); } @@ -405,7 +405,7 @@ afr_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, entry->d_stat.st_ino = inum; if ((local->fd->inode == local->fd->inode->table->root) - && !strcmp (entry->d_name, AFR_TRASH_DIR)) { + && !strcmp (entry->d_name, GF_REPLICATE_TRASH_DIR)) { list_del_init (&entry->list); FREE (entry); } diff --git a/xlators/cluster/afr/src/afr-self-heal-entry.c b/xlators/cluster/afr/src/afr-self-heal-entry.c index 50d11cc18e2..420b7155c7f 100644 --- a/xlators/cluster/afr/src/afr-self-heal-entry.c +++ b/xlators/cluster/afr/src/afr-self-heal-entry.c @@ -532,8 +532,8 @@ afr_sh_entry_expunge_rename_cbk (call_frame_t *expunge_frame, void *cookie, static void init_trash_loc (loc_t *trash_loc, inode_table_t *table) { - trash_loc->path = strdup ("/" AFR_TRASH_DIR); - trash_loc->name = AFR_TRASH_DIR; + trash_loc->path = strdup ("/" GF_REPLICATE_TRASH_DIR); + trash_loc->name = GF_REPLICATE_TRASH_DIR; trash_loc->parent = table->root; trash_loc->inode = inode_new (table); } @@ -545,9 +545,9 @@ make_trash_path (const char *path) char *c = NULL; char *tp = NULL; - tp = CALLOC (strlen ("/" AFR_TRASH_DIR) + strlen (path) + 1, sizeof (char)); + tp = CALLOC (strlen ("/" GF_REPLICATE_TRASH_DIR) + strlen (path) + 1, sizeof (char)); - strcpy (tp, AFR_TRASH_DIR); + strcpy (tp, GF_REPLICATE_TRASH_DIR); strcat (tp, path); c = strchr (tp, '/') + 1; @@ -615,7 +615,7 @@ afr_sh_entry_expunge_mkdir_cbk (call_frame_t *expunge_frame, void *cookie, xlato if (op_ret != 0) { gf_log (this->name, GF_LOG_DEBUG, - "mkdir of /" AFR_TRASH_DIR " failed on %s", + "mkdir of /" GF_REPLICATE_TRASH_DIR " failed on %s", priv->children[active_src]->name); goto out; @@ -624,7 +624,7 @@ afr_sh_entry_expunge_mkdir_cbk (call_frame_t *expunge_frame, void *cookie, xlato /* mkdir successful */ trash_inode = inode_link (inode, expunge_local->loc.inode->table->root, - AFR_TRASH_DIR, buf); + GF_REPLICATE_TRASH_DIR, buf); afr_sh_entry_expunge_rename (expunge_frame, this, active_src, trash_inode); @@ -662,7 +662,7 @@ afr_sh_entry_expunge_lookup_trash_cbk (call_frame_t *expunge_frame, void *cookie init_trash_loc (&trash_loc, expunge_local->loc.inode->table); gf_log (this->name, GF_LOG_TRACE, - "creating directory " AFR_TRASH_DIR " on subvolume %s", + "creating directory " GF_REPLICATE_TRASH_DIR " on subvolume %s", priv->children[active_src]->name); STACK_WIND_COOKIE (expunge_frame, afr_sh_entry_expunge_mkdir_cbk, @@ -677,7 +677,7 @@ afr_sh_entry_expunge_lookup_trash_cbk (call_frame_t *expunge_frame, void *cookie if (op_ret != 0) { gf_log (this->name, GF_LOG_DEBUG, - "lookup of /" AFR_TRASH_DIR " failed on %s", + "lookup of /" GF_REPLICATE_TRASH_DIR " failed on %s", priv->children[active_src]->name); goto out; } @@ -685,7 +685,7 @@ afr_sh_entry_expunge_lookup_trash_cbk (call_frame_t *expunge_frame, void *cookie /* lookup successful */ trash_inode = inode_link (inode, expunge_local->loc.inode->table->root, - AFR_TRASH_DIR, buf); + GF_REPLICATE_TRASH_DIR, buf); afr_sh_entry_expunge_rename (expunge_frame, this, active_src, trash_inode); @@ -713,7 +713,7 @@ afr_sh_entry_expunge_lookup_trash (call_frame_t *expunge_frame, xlator_t *this, root = expunge_local->loc.inode->table->root; - trash = inode_grep (root->table, root, AFR_TRASH_DIR); + trash = inode_grep (root->table, root, GF_REPLICATE_TRASH_DIR); if (trash) { /* inode is in cache, so no need to mkdir */ @@ -728,7 +728,7 @@ afr_sh_entry_expunge_lookup_trash (call_frame_t *expunge_frame, xlator_t *this, init_trash_loc (&trash_loc, expunge_local->loc.inode->table); gf_log (this->name, GF_LOG_TRACE, - "looking up /" AFR_TRASH_DIR " on %s", + "looking up /" GF_REPLICATE_TRASH_DIR " on %s", priv->children[active_src]->name); STACK_WIND_COOKIE (expunge_frame, afr_sh_entry_expunge_lookup_trash_cbk, @@ -934,7 +934,7 @@ afr_sh_entry_expunge_entry (call_frame_t *frame, xlator_t *this, if ((strcmp (name, ".") == 0) || (strcmp (name, "..") == 0) || ((strcmp (local->loc.path, "/") == 0) - && (strcmp (name, AFR_TRASH_DIR) == 0))) { + && (strcmp (name, GF_REPLICATE_TRASH_DIR) == 0))) { gf_log (this->name, GF_LOG_TRACE, "skipping inspection of %s under %s", @@ -1927,7 +1927,7 @@ afr_sh_entry_impunge_entry (call_frame_t *frame, xlator_t *this, if ((strcmp (entry->d_name, ".") == 0) || (strcmp (entry->d_name, "..") == 0) || ((strcmp (local->loc.path, "/") == 0) - && (strcmp (entry->d_name, AFR_TRASH_DIR) == 0))) { + && (strcmp (entry->d_name, GF_REPLICATE_TRASH_DIR) == 0))) { gf_log (this->name, GF_LOG_TRACE, "skipping inspection of %s under %s", diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c index 9448dc4e629..33cd70cd478 100644 --- a/xlators/cluster/afr/src/afr.c +++ b/xlators/cluster/afr/src/afr.c @@ -961,7 +961,7 @@ afr_lookup (call_frame_t *frame, xlator_t *this, frame->local = local; - if (!strcmp (loc->path, "/" AFR_TRASH_DIR)) { + if (!strcmp (loc->path, "/" GF_REPLICATE_TRASH_DIR)) { op_errno = ENOENT; goto out; } diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index bf07a89d7d8..c5db12a445c 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -31,7 +31,6 @@ #include "compat-errno.h" #define AFR_XATTR_PREFIX "trusted.afr" -#define AFR_TRASH_DIR ".trash" typedef struct _afr_private { gf_lock_t lock; /* to guard access to child_count, etc */ |