summaryrefslogtreecommitdiffstats
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
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
-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 10251e78c68..ff2f84036ba 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)