summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
authorAmar Tumballi <amar@gluster.com>2009-12-02 14:28:59 +0000
committerAnand V. Avati <avati@dev.gluster.com>2009-12-03 02:00:46 -0800
commit29890d798167338c0aaa3a1bab26fe416ddadf19 (patch)
treeac7b71d3f8638873875714d2163de987c381d2ed /xlators
parenta3d5eb9b2a08190528b1e024bdfbff41c0a6b88f (diff)
posix-compliance test now passes over stripe
* needed to have ctime in the statbuffer from first subvolume. * unlink should be sent to all subvolumes no matter what. (earlier it was sent to all nodes only in case of regular files, causing directory not empty type of errors in 'rm -rf' cases) Signed-off-by: Amar Tumballi <amar@gluster.com> Signed-off-by: Anand V. Avati <avati@dev.gluster.com> BUG: 321 (over distributed-stripe set-up, annihilate.sh fails.) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=321
Diffstat (limited to 'xlators')
-rw-r--r--xlators/cluster/stripe/src/stripe.c87
1 files changed, 51 insertions, 36 deletions
diff --git a/xlators/cluster/stripe/src/stripe.c b/xlators/cluster/stripe/src/stripe.c
index 10251e78c..ff2f84036 100644
--- a/xlators/cluster/stripe/src/stripe.c
+++ b/xlators/cluster/stripe/src/stripe.c
@@ -179,8 +179,10 @@ stripe_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
((call_frame_t *)cookie)->this) {
local->pre_buf.st_ino = prebuf->st_ino;
local->pre_buf.st_mtime = prebuf->st_mtime;
+ local->pre_buf.st_ctime = prebuf->st_ctime;
local->post_buf.st_ino = postbuf->st_ino;
local->post_buf.st_mtime = postbuf->st_mtime;
+ local->post_buf.st_ctime = postbuf->st_ctime;
}
local->pre_buf.st_blocks += prebuf->st_blocks;
if (local->pre_buf.st_size < prebuf->st_size)
@@ -261,10 +263,14 @@ stripe_stack_unwind_unlink_cbk (call_frame_t *frame, void *cookie,
preparent->st_ino;
local->pre_parent_buf.st_mtime =
preparent->st_mtime;
+ local->pre_parent_buf.st_ctime =
+ preparent->st_ctime;
local->post_parent_buf.st_ino =
postparent->st_ino;
local->post_parent_buf.st_mtime =
postparent->st_mtime;
+ local->post_parent_buf.st_ctime =
+ postparent->st_ctime;
}
local->pre_parent_buf.st_blocks += preparent->st_blocks;
if (local->pre_parent_buf.st_size < preparent->st_size)
@@ -343,8 +349,10 @@ stripe_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
((call_frame_t *)cookie)->this) {
local->pre_buf.st_ino = prebuf->st_ino;
local->pre_buf.st_mtime = prebuf->st_mtime;
+ local->pre_buf.st_ctime = prebuf->st_ctime;
local->post_buf.st_ino = postbuf->st_ino;
local->post_buf.st_mtime = postbuf->st_mtime;
+ local->post_buf.st_ctime = postbuf->st_ctime;
}
local->pre_buf.st_blocks += prebuf->st_blocks;
if (local->pre_buf.st_size < prebuf->st_size)
@@ -434,6 +442,7 @@ stripe_stack_unwind_buf_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
/* Always, pass the inode number of
first child to the above layer */
local->post_buf.st_ino = buf->st_ino;
+ local->post_buf.st_ctime = buf->st_ctime;
local->post_buf.st_mtime = buf->st_mtime;
}
@@ -532,11 +541,14 @@ stripe_stack_unwind_inode_cbk (call_frame_t *frame, void *cookie,
((call_frame_t *)cookie)->this) {
local->post_buf.st_ino = buf->st_ino;
local->post_buf.st_mtime = buf->st_mtime;
+ local->post_buf.st_ctime = buf->st_ctime;
local->pre_parent_buf.st_ino = preparent->st_ino;
local->pre_parent_buf.st_mtime = preparent->st_mtime;
+ local->pre_parent_buf.st_ctime = preparent->st_ctime;
local->post_parent_buf.st_ino = postparent->st_ino;
local->post_parent_buf.st_mtime = postparent->st_mtime;
+ local->post_parent_buf.st_ctime = postparent->st_ctime;
}
local->post_buf.st_blocks += buf->st_blocks;
if (local->post_buf.st_size < buf->st_size)
@@ -625,8 +637,10 @@ stripe_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if (FIRST_CHILD(this) == prev->this) {
local->post_buf.st_ino = buf->st_ino;
local->post_buf.st_mtime = buf->st_mtime;
+ local->post_buf.st_ctime = buf->st_ctime;
local->post_parent_buf.st_ino = postparent->st_ino;
local->post_parent_buf.st_mtime = postparent->st_mtime;
+ local->post_parent_buf.st_ctime = postparent->st_mtime;
if (local->dict)
dict_unref (local->dict);
local->dict = dict_ref (dict);
@@ -972,16 +986,18 @@ stripe_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
local->pre_buf.st_ino = preop->st_ino;
local->pre_buf.st_mtime = preop->st_mtime;
+ local->pre_buf.st_ctime = preop->st_ctime;
local->stbuf.st_ino = postop->st_ino;
local->stbuf.st_mtime = postop->st_mtime;
+ local->stbuf.st_ctime = postop->st_ctime;
}
local->pre_buf.st_blocks += preop->st_blocks;
local->stbuf.st_blocks += postop->st_blocks;
- if (local->stbuf.st_size < preop->st_size)
+ if (local->pre_buf.st_size < preop->st_size)
local->pre_buf.st_size = preop->st_size;
if (local->stbuf.st_size < postop->st_size)
local->stbuf.st_size = postop->st_size;
@@ -1199,13 +1215,13 @@ stripe_first_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
stripe_local_t *local = NULL;
xlator_list_t *trav = NULL;
+ local = frame->local;
+ trav = this->children;
+
if (op_ret == -1) {
goto unwind;
}
- local = frame->local;
- trav = this->children;
-
local->post_buf = *buf;
local->pre_parent_buf = *preoldparent;
local->post_parent_buf = *postoldparent;
@@ -1214,8 +1230,8 @@ stripe_first_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
local->op_ret = 0;
local->call_count--;
- trav = trav->next; /* Skip first child */
+ trav = trav->next; /* Skip first child */
while (trav) {
STACK_WIND (frame, stripe_stack_rename_cbk,
trav->xlator, trav->xlator->fops->rename,
@@ -1225,9 +1241,14 @@ stripe_first_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
return 0;
unwind:
- STACK_UNWIND (frame, op_ret, op_errno, buf, preoldparent,
+ if (local->loc.path)
+ loc_wipe (&local->loc);
+ if (local->loc2.path)
+ loc_wipe (&local->loc2);
+
+ STACK_UNWIND (frame, op_ret, op_errno, buf, preoldparent,
postoldparent, prenewparent, postnewparent);
- return 0;
+ return 0;
}
/**
* stripe_rename -
@@ -1269,7 +1290,7 @@ stripe_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc,
loc_copy (&local->loc2, newloc);
local->call_count = priv->child_count;
-
+
frame->local = local;
STACK_WIND (frame, stripe_first_rename_cbk, trav->xlator,
@@ -1348,7 +1369,6 @@ stripe_readlink (call_frame_t *frame, xlator_t *this, loc_t *loc, size_t size)
int32_t
stripe_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc)
{
- int send_fop_to_all = 0;
xlator_list_t *trav = NULL;
stripe_local_t *local = NULL;
stripe_private_t *priv = NULL;
@@ -1368,35 +1388,27 @@ stripe_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc)
goto err;
}
- if (S_ISREG (loc->inode->st_mode))
- send_fop_to_all = 1;
+ /* Don't unlink a file if a node is down */
+ if (priv->nodes_down) {
+ op_errno = ENOTCONN;
+ goto err;
+ }
- if (!send_fop_to_all) {
- STACK_WIND (frame, stripe_common_remove_cbk, trav->xlator,
- trav->xlator->fops->unlink, loc);
- } else {
- /* Don't unlink a file if a node is down */
- if (priv->nodes_down) {
- op_errno = ENOTCONN;
- goto err;
- }
+ /* Initialization */
+ local = CALLOC (1, sizeof (stripe_local_t));
+ if (!local) {
+ op_errno = ENOMEM;
+ goto err;
+ }
+ local->op_ret = -1;
+ frame->local = local;
+ local->call_count = priv->child_count;
- /* Initialization */
- local = CALLOC (1, sizeof (stripe_local_t));
- if (!local) {
- op_errno = ENOMEM;
- goto err;
- }
- local->op_ret = -1;
- frame->local = local;
- local->call_count = priv->child_count;
-
- while (trav) {
- STACK_WIND (frame, stripe_stack_unwind_unlink_cbk,
- trav->xlator, trav->xlator->fops->unlink,
- loc);
- trav = trav->next;
- }
+ while (trav) {
+ STACK_WIND (frame, stripe_stack_unwind_unlink_cbk,
+ trav->xlator, trav->xlator->fops->unlink,
+ loc);
+ trav = trav->next;
}
return 0;
@@ -2082,11 +2094,14 @@ stripe_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
((call_frame_t *)cookie)->this) {
local->post_buf.st_ino = buf->st_ino;
local->post_buf.st_mtime = buf->st_mtime;
+ local->post_buf.st_ctime = buf->st_ctime;
local->pre_parent_buf.st_ino = preparent->st_ino;
local->pre_parent_buf.st_mtime = preparent->st_mtime;
+ local->pre_parent_buf.st_ctime = preparent->st_ctime;
local->post_parent_buf.st_ino = postparent->st_ino;
local->post_parent_buf.st_mtime = postparent->st_mtime;
+ local->post_parent_buf.st_ctime = postparent->st_ctime;
}
local->post_buf.st_blocks += buf->st_blocks;
if (local->post_buf.st_size < buf->st_size)