diff options
author | shishir gowda <shishirng@gluster.com> | 2011-08-03 14:13:41 +0530 |
---|---|---|
committer | Anand Avati <avati@gluster.com> | 2011-08-03 21:57:53 -0700 |
commit | 8b56f0a60d58caf1ceccd5220f881f5b275fd51e (patch) | |
tree | 4918ecdf1b507ef192318a1dba12fd73fe27dded /xlators/cluster/dht/src/dht-rename.c | |
parent | b835c75c336c6065a3a4d37fe35db72ac4d3745f (diff) |
DHT rename: Recreate linkfile after unlink
This is done, so that there is no gfid mismatch. Unlink the older
linkfile if it exists, and recreate it with the correct gfid.
Also removed unused rename related code.
BUG: 2522
Change-Id: Ia880adda5a94351f30971576b4faa861fac4682d
Reviewed-on: http://review.gluster.com/144
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@gluster.com>
Diffstat (limited to 'xlators/cluster/dht/src/dht-rename.c')
-rw-r--r-- | xlators/cluster/dht/src/dht-rename.c | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/xlators/cluster/dht/src/dht-rename.c b/xlators/cluster/dht/src/dht-rename.c index 031dcfb0e02..27abfcde5d5 100644 --- a/xlators/cluster/dht/src/dht-rename.c +++ b/xlators/cluster/dht/src/dht-rename.c @@ -435,6 +435,30 @@ nolinks: int +dht_rename_links_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, + inode_t *inode, struct iatt *stbuf, + struct iatt *preparent, struct iatt *postparent) +{ + call_frame_t *prev = NULL; + dht_local_t *local = NULL; + + prev = cookie; + local = frame->local; + + if (op_ret == -1) { + gf_log (this->name, GF_LOG_WARNING, + "link/file %s on %s failed (%s)", + local->loc.path, prev->this->name, strerror (op_errno)); + } + + DHT_STACK_DESTROY (frame); + + return 0; +} + + +int dht_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, struct iatt *stbuf, struct iatt *preoldparent, struct iatt *postoldparent, @@ -447,6 +471,8 @@ dht_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this, xlator_t *dst_hashed = NULL; xlator_t *dst_cached = NULL; xlator_t *rename_subvol = NULL; + call_frame_t *link_frame = NULL; + dht_local_t *link_local = NULL; local = frame->local; prev = cookie; @@ -465,6 +491,29 @@ dht_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this, goto cleanup; } + if ((src_cached == dst_cached) && (dst_hashed != dst_cached)) { + link_frame = copy_frame (frame); + if (!link_frame) { + goto err; + } + + link_local = dht_local_init (link_frame); + if (!link_local) { + goto err; + } + + loc_copy (&link_local->loc, &local->loc2); + if (link_local->loc.inode) + inode_unref (link_local->loc.inode); + link_local->loc.inode = inode_ref (local->loc.inode); + uuid_copy (link_local->gfid, local->loc.inode->gfid); + link_frame->local = link_local; + + dht_linkfile_create (link_frame, dht_rename_links_create_cbk, + src_cached, dst_hashed, &link_local->loc); + } + +err: dht_iatt_merge (this, &local->stbuf, stbuf, prev->this); dht_iatt_merge (this, &local->preoldparent, preoldparent, prev->this); dht_iatt_merge (this, &local->postoldparent, postoldparent, prev->this); @@ -641,7 +690,7 @@ dht_rename_unlink_links_cbk (call_frame_t *frame, void *cookie, xlator_t *this, local = frame->local; prev = cookie; - if (op_ret == -1) { + if ((op_ret == -1) && (op_errno != ENOENT)) { gf_log (this->name, GF_LOG_DEBUG, "unlink of %s on %s failed (%s)", local->loc2.path, prev->this->name, |