diff options
-rw-r--r-- | libglusterfs/src/syncop.c | 2 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 4 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 350 |
3 files changed, 247 insertions, 109 deletions
diff --git a/libglusterfs/src/syncop.c b/libglusterfs/src/syncop.c index 246229f1cc2..544cfdc011a 100644 --- a/libglusterfs/src/syncop.c +++ b/libglusterfs/src/syncop.c @@ -1573,7 +1573,7 @@ syncop_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int syncop_setxattr (xlator_t *subvol, loc_t *loc, dict_t *dict, int32_t flags, - dict_t *xdata_in, dict_t **xdata_out) + dict_t *xdata_in, dict_t **xdata_out) { struct syncargs args = {0, }; diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 21433b6c8b7..a756a1e579f 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -1168,10 +1168,10 @@ gf_defrag_start (void *this); int32_t gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t *xattrs, - struct iatt *stbuf); + struct iatt *stbuf, int *fop_errno); int dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, - int flag); + int flag, int *fop_errno); int dht_inode_ctx_layout_get (inode_t *inode, xlator_t *this, dht_layout_t **layout_int); diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index d22360bacb9..66cd623ea08 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -18,12 +18,12 @@ #include <signal.h> #include "events.h" - #define GF_DISK_SECTOR_SIZE 512 #define DHT_REBALANCE_PID 4242 /* Change it if required */ #define DHT_REBALANCE_BLKSIZE (1024 * 1024) /* 1 MB */ #define MAX_MIGRATE_QUEUE_COUNT 500 #define MIN_MIGRATE_QUEUE_COUNT 200 +#define MAX_REBAL_TYPE_SIZE 16 #ifndef MAX #define MAX(a, b) (((a) > (b))?(a):(b)) @@ -165,7 +165,8 @@ dht_send_rebalance_event (xlator_t *this, int cmd, gf_defrag_status_t status) static int dht_write_with_holes (xlator_t *to, fd_t *fd, struct iovec *vec, int count, - int32_t size, off_t offset, struct iobref *iobref) + int32_t size, off_t offset, struct iobref *iobref, + int *fop_errno) { int i = 0; int ret = -1; @@ -199,6 +200,7 @@ dht_write_with_holes (xlator_t *to, fd_t *fd, struct iovec *vec, int count, gf_log (THIS->name, GF_LOG_WARNING, "failed to write (%s)", strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } @@ -219,6 +221,7 @@ dht_write_with_holes (xlator_t *to, fd_t *fd, struct iovec *vec, int count, gf_log (THIS->name, GF_LOG_WARNING, "failed to write (%s)", strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } @@ -272,7 +275,7 @@ be converted to "0" in dht_migrate_file. int32_t gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t *xattrs, - struct iatt *stbuf) + struct iatt *stbuf, int *fop_errno) { int32_t ret = -1; xlator_t *cached_subvol = NULL; @@ -285,6 +288,9 @@ gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t *xattrs, gf_loglevel_t loglevel = 0; dict_t *link_xattr = NULL; + + *fop_errno = EINVAL; + GF_VALIDATE_OR_GOTO ("defrag", loc, out); GF_VALIDATE_OR_GOTO ("defrag", loc->name, out); GF_VALIDATE_OR_GOTO ("defrag", stbuf, out); @@ -299,6 +305,8 @@ gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t *xattrs, DHT_MSG_MIGRATE_FILE_FAILED, "Migrate file failed :" "loc->pargfid is NULL for %s", loc->path); + *fop_errno = EINVAL; + ret = -1; goto out; } @@ -307,13 +315,15 @@ gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t *xattrs, DHT_MSG_MIGRATE_FILE_FAILED, "Migrate file failed :" "loc->gfid is NULL for %s", loc->path); + *fop_errno = EINVAL; + ret = -1; goto out; } link_xattr = dict_new (); if (!link_xattr) { ret = -1; - errno = ENOMEM; + *fop_errno = ENOMEM; goto out; } @@ -354,6 +364,7 @@ gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t *xattrs, DHT_MSG_MIGRATE_FILE_FAILED, "Migrate file failed:%s lookup failed with ret = %d", loc->path, ret); + *fop_errno = -ret; ret = -1; goto out; } @@ -365,6 +376,8 @@ gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t *xattrs, "Migrate file failed :" "Failed to get cached subvol" " for %s on %s", loc->name, this->name); + *fop_errno = EINVAL; + ret = -1; goto out; } @@ -375,6 +388,8 @@ gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t *xattrs, "Migrate file failed :" "Failed to get hashed subvol" " for %s on %s", loc->name, this->name); + *fop_errno = EINVAL; + ret = -1; goto out; } @@ -398,6 +413,8 @@ gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t *xattrs, "Failed to set dictionary value:" " key = %s for %s", conf->link_xattr_name, loc->name); + *fop_errno = ENOMEM; + ret = -1; goto out; } @@ -410,6 +427,7 @@ gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t *xattrs, "Linkto setxattr failed %s -> %s (%s)", cached_subvol->name, loc->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } @@ -439,8 +457,10 @@ gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t *xattrs, " failed on subvol %s", loc->name, uuid_utoa(loc->gfid), hashed_subvol->name); - if (op_errno != EEXIST) + if (op_errno != EEXIST) { + *fop_errno = op_errno; goto out; + } } } ret = syncop_lookup (hashed_subvol, loc, &iatt, NULL, NULL, NULL); @@ -450,15 +470,18 @@ gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t *xattrs, "Migrate file failed :Failed lookup %s on %s ", loc->name, hashed_subvol->name); + *fop_errno = -ret; ret = -1; goto out; } if (iatt.ia_nlink == stbuf->ia_nlink) { ret = dht_migrate_file (this, loc, cached_subvol, hashed_subvol, - GF_DHT_MIGRATE_HARDLINK_IN_PROGRESS); - if (ret) + GF_DHT_MIGRATE_HARDLINK_IN_PROGRESS, + fop_errno); + if (ret) { goto out; + } } ret = -2; out: @@ -471,8 +494,8 @@ out: static int __check_file_has_hardlink (xlator_t *this, loc_t *loc, - struct iatt *stbuf, dict_t *xattrs, int flags, - gf_defrag_info_t *defrag) + struct iatt *stbuf, dict_t *xattrs, int flags, + gf_defrag_info_t *defrag, int *fop_errno) { int ret = 0; @@ -485,7 +508,7 @@ __check_file_has_hardlink (xlator_t *this, loc_t *loc, if (flags == GF_DHT_MIGRATE_HARDLINK) { synclock_lock (&defrag->link_lock); ret = gf_defrag_handle_hardlink - (this, loc, xattrs, stbuf); + (this, loc, xattrs, stbuf, fop_errno); synclock_unlock (&defrag->link_lock); /* Returning zero will force the file to be remigrated. @@ -501,9 +524,10 @@ __check_file_has_hardlink (xlator_t *this, loc_t *loc, } else { gf_msg (this->name, GF_LOG_WARNING, 0, DHT_MSG_MIGRATE_FILE_FAILED, - "Migrate file failed:" + "Migration skipped for:" "%s: file has hardlinks", loc->path); - ret = -ENOTSUP; + *fop_errno = ENOTSUP; + ret = -1; } } @@ -522,7 +546,7 @@ __check_file_has_hardlink (xlator_t *this, loc_t *loc, static int __is_file_migratable (xlator_t *this, loc_t *loc, struct iatt *stbuf, dict_t *xattrs, int flags, - gf_defrag_info_t *defrag) + gf_defrag_info_t *defrag, int *fop_errno) { int ret = -1; int lock_count = 0; @@ -532,6 +556,7 @@ __is_file_migratable (xlator_t *this, loc_t *loc, DHT_MSG_MIGRATE_FILE_FAILED, "Migrate file failed:" "%s: migrate-file called on directory", loc->path); + *fop_errno = EISDIR; ret = -1; goto out; } @@ -545,6 +570,7 @@ __is_file_migratable (xlator_t *this, loc_t *loc, "Migrate file failed:" "%s: Unable to get lock count for file", loc->path); + *fop_errno = EINVAL; ret = -1; goto out; } @@ -554,6 +580,7 @@ __is_file_migratable (xlator_t *this, loc_t *loc, DHT_MSG_MIGRATE_FILE_FAILED, "Migrate file failed: %s: File has locks." " Skipping file migration", loc->path); + *fop_errno = ENOTSUP; ret = -1; goto out; } @@ -561,17 +588,17 @@ __is_file_migratable (xlator_t *this, loc_t *loc, /* Check if file has hardlink*/ ret = __check_file_has_hardlink (this, loc, stbuf, xattrs, - flags, defrag); + flags, defrag, fop_errno); out: return ret; } static int -__dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struct iatt *stbuf, - fd_t **dst_fd, dict_t *xattr) +__dht_rebalance_create_dst_file (xlator_t *this, xlator_t *to, xlator_t *from, + loc_t *loc, struct iatt *stbuf, fd_t **dst_fd, + dict_t *xattr, int *fop_errno) { - xlator_t *this = NULL; int ret = -1; fd_t *fd = NULL; struct iatt new_stbuf = {0,}; @@ -579,15 +606,21 @@ __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struc dht_conf_t *conf = NULL; dict_t *dict = NULL; - this = THIS; conf = this->private; dict = dict_new (); - if (!dict) + if (!dict) { + *fop_errno = ENOMEM; + ret = -1; + gf_msg (this->name, GF_LOG_ERROR, ENOMEM, + DHT_MSG_NO_MEMORY, "dictionary allocation failed for" + "path:%s", loc->path); goto out; - + } ret = dict_set_static_bin (dict, "gfid-req", stbuf->ia_gfid, 16); if (ret) { + *fop_errno = ENOMEM; + ret = -1; gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED, "%s: failed to set dictionary value: key = gfid-req", @@ -597,6 +630,8 @@ __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struc ret = dict_set_str (dict, conf->link_xattr_name, from->name); if (ret) { + *fop_errno = ENOMEM; + ret = -1; gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_DICT_SET_FAILED, "%s: failed to set dictionary value: key = %s ", @@ -606,11 +641,12 @@ __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struc fd = fd_create (loc->inode, DHT_REBALANCE_PID); if (!fd) { - gf_msg (this->name, GF_LOG_ERROR, 0, - DHT_MSG_MIGRATE_FILE_FAILED, - "%s: fd create failed (destination) (%s)", - loc->path, strerror (errno)); + *fop_errno = ENOMEM; ret = -1; + gf_msg (this->name, GF_LOG_ERROR, ENOMEM, + DHT_MSG_MIGRATE_FILE_FAILED, + "%s: fd create failed (destination)", + loc->path); goto out; } @@ -622,6 +658,7 @@ __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struc DHT_MSG_GFID_MISMATCH, "file %s exists in %s with different gfid", loc->path, to->name); + *fop_errno = EINVAL; ret = -1; goto out; } @@ -632,6 +669,7 @@ __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struc DHT_MSG_MIGRATE_FILE_FAILED, "%s: failed to lookup file (%s)", loc->path, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } @@ -648,6 +686,7 @@ __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struc DHT_MSG_MIGRATE_FILE_FAILED, "failed to open %s on %s", loc->path, to->name); + *fop_errno = -ret; ret = -1; goto out; } @@ -659,6 +698,7 @@ __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struc DHT_MSG_MIGRATE_FILE_FAILED, "failed to create %s on %s", loc->path, to->name); + *fop_errno = -ret; ret = -1; goto out; } @@ -686,6 +726,7 @@ __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struc "file %s exists in %s with different gfid," "found in lookup after create", loc->path, to->name); + *fop_errno = EINVAL; ret = -1; goto out; } @@ -696,23 +737,27 @@ __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struc gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED, "%s: file does not exists" "on %s (%s)", loc->path, to->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } ret = syncop_fsetxattr (to, fd, xattr, 0, NULL, NULL); - if (ret < 0) + if (ret < 0) { + *fop_errno = -ret; gf_msg (this->name, GF_LOG_WARNING, 0, DHT_MSG_MIGRATE_FILE_FAILED, "%s: failed to set xattr on %s (%s)", loc->path, to->name, strerror (-ret)); + } /* TODO: Need to add a detailed comment about why we moved away from ftruncate. ret = syncop_ftruncate (to, fd, stbuf->ia_size, NULL, NULL); - if (ret < 0) + if (ret < 0) { + *fop_errno = -ret; gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED, "ftruncate failed for %s on %s (%s)", @@ -722,11 +767,13 @@ __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struc ret = syncop_fsetattr (to, fd, stbuf, (GF_SET_ATTR_UID | GF_SET_ATTR_GID), NULL, NULL, NULL, NULL); - if (ret < 0) + if (ret < 0) { + *fop_errno = -ret; gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED, "chown failed for %s on %s (%s)", loc->path, to->name, strerror (-ret)); + } /* Fallocate does not work for size 0, hence the check. Anyway we don't * need to care about min-free-disk for 0 byte size file */ @@ -762,15 +809,14 @@ out: } static int -__dht_check_free_space (xlator_t *to, xlator_t *from, loc_t *loc, +__dht_check_free_space (xlator_t *this, xlator_t *to, xlator_t *from, loc_t *loc, struct iatt *stbuf, int flag, dht_conf_t *conf, gf_boolean_t *target_changed, xlator_t **new_subvol, - gf_boolean_t *ignore_failure) + gf_boolean_t *ignore_failure, int *fop_errno) { struct statvfs src_statfs = {0,}; struct statvfs dst_statfs = {0,}; int ret = -1; - xlator_t *this = NULL; dict_t *xdata = NULL; dht_layout_t *layout = NULL; uint64_t src_statfs_blocks = 1; @@ -779,11 +825,10 @@ __dht_check_free_space (xlator_t *to, xlator_t *from, loc_t *loc, double post_percent = 0; int i = 0; - this = THIS; - xdata = dict_new (); if (!xdata) { - errno = ENOMEM; + *fop_errno = ENOMEM; + ret = -1; gf_msg (this->name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY, "failed to allocate dictionary"); @@ -796,6 +841,7 @@ __dht_check_free_space (xlator_t *to, xlator_t *from, loc_t *loc, "Failed to set " GF_INTERNAL_IGNORE_DEEM_STATFS" in dict"); ret = -1; + *fop_errno = ENOMEM; goto out; } @@ -805,6 +851,7 @@ __dht_check_free_space (xlator_t *to, xlator_t *from, loc_t *loc, DHT_MSG_MIGRATE_FILE_FAILED, "failed to get statfs of %s on %s (%s)", loc->path, from->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } @@ -815,6 +862,7 @@ __dht_check_free_space (xlator_t *to, xlator_t *from, loc_t *loc, DHT_MSG_MIGRATE_FILE_FAILED, "failed to get statfs of %s on %s (%s)", loc->path, to->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } @@ -857,6 +905,7 @@ __dht_check_free_space (xlator_t *to, xlator_t *from, loc_t *loc, /* this is not a 'failure', but we don't want to consider this as 'success' too :-/ */ + *fop_errno = ENOSPC; ret = -1; goto out; } @@ -898,6 +947,7 @@ find_new_subvol: layout = dht_layout_get (this, loc->parent); if (!layout) { gf_log (this->name, GF_LOG_ERROR, "Layout is NULL"); + *fop_errno = EINVAL; ret = -1; goto out; } @@ -925,6 +975,7 @@ find_new_subvol: } *target_changed = _gf_false; + *fop_errno = ENOSPC; ret = -1; goto out; } else { @@ -944,7 +995,7 @@ out: static int __dht_rebalance_migrate_data (xlator_t *from, xlator_t *to, fd_t *src, fd_t *dst, - uint64_t ia_size, int hole_exists) + uint64_t ia_size, int hole_exists, int *fop_errno) { int ret = 0; int count = 0; @@ -963,18 +1014,26 @@ __dht_rebalance_migrate_data (xlator_t *from, xlator_t *to, fd_t *src, fd_t *dst offset, 0, &vector, &count, &iobref, NULL, NULL); if (!ret || (ret < 0)) { + *fop_errno = -ret; break; } - if (hole_exists) + if (hole_exists) { ret = dht_write_with_holes (to, dst, vector, count, - ret, offset, iobref); - else + ret, offset, iobref, + fop_errno); + } else { ret = syncop_writev (to, dst, vector, count, offset, iobref, 0, NULL, NULL); + if (ret < 0) { + *fop_errno = -ret; + } + } + if (ret < 0) { break; } + offset += ret; total += ret; @@ -998,7 +1057,7 @@ __dht_rebalance_migrate_data (xlator_t *from, xlator_t *to, fd_t *src, fd_t *dst static int __tier_migrate_data (gf_defrag_info_t *defrag, xlator_t *from, xlator_t *to, fd_t *src, fd_t *dst, - uint64_t ia_size, int hole_exists) + uint64_t ia_size, int hole_exists, int *fop_errno) { int ret = 0; int count = 0; @@ -1018,15 +1077,20 @@ __tier_migrate_data (gf_defrag_info_t *defrag, xlator_t *from, xlator_t *to, fd_ offset, 0, &vector, &count, &iobref, NULL, NULL); if (!ret || (ret < 0)) { + *fop_errno = -ret; break; } - if (hole_exists) + if (hole_exists) { ret = dht_write_with_holes (to, dst, vector, count, - ret, offset, iobref); - else + ret, offset, iobref, + fop_errno); + } else { ret = syncop_writev (to, dst, vector, count, offset, iobref, 0, NULL, NULL); + *fop_errno = -ret; + } + if (gf_defrag_get_pause_state (&defrag->tier_conf) != TIER_RUNNING) { gf_msg ("tier", GF_LOG_INFO, 0, DHT_MSG_TIER_PAUSED, @@ -1060,18 +1124,17 @@ __tier_migrate_data (gf_defrag_info_t *defrag, xlator_t *from, xlator_t *to, fd_ static int -__dht_rebalance_open_src_file (xlator_t *from, xlator_t *to, loc_t *loc, +__dht_rebalance_open_src_file (xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc, struct iatt *stbuf, fd_t **src_fd, - gf_boolean_t *clean_src) + gf_boolean_t *clean_src, int *fop_errno) { + int ret = 0; fd_t *fd = NULL; dict_t *dict = NULL; - xlator_t *this = NULL; struct iatt iatt = {0,}; dht_conf_t *conf = NULL; - this = THIS; conf = this->private; *clean_src = _gf_false; @@ -1081,6 +1144,7 @@ __dht_rebalance_open_src_file (xlator_t *from, xlator_t *to, loc_t *loc, gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED, "%s: fd create failed (source)", loc->path); + *fop_errno = ENOMEM; ret = -1; goto out; } @@ -1091,6 +1155,7 @@ __dht_rebalance_open_src_file (xlator_t *from, xlator_t *to, loc_t *loc, DHT_MSG_MIGRATE_FILE_FAILED, "failed to open file %s on %s (%s)", loc->path, from->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } @@ -1102,14 +1167,22 @@ __dht_rebalance_open_src_file (xlator_t *from, xlator_t *to, loc_t *loc, ret = -1; dict = dict_new (); - if (!dict) + if (!dict) { + gf_msg (this->name, GF_LOG_ERROR, 0, + DHT_MSG_MIGRATE_FILE_FAILED, + "%s: Could not allocate memory for dict", loc->path); + *fop_errno = ENOMEM; + ret = -1; goto out; + } ret = dict_set_str (dict, conf->link_xattr_name, to->name); if (ret) { gf_log (this->name, GF_LOG_ERROR, "failed to set xattr in dict for %s (linkto:%s)", loc->path, to->name); + *fop_errno = ENOMEM; + ret = -1; goto out; } @@ -1121,6 +1194,7 @@ __dht_rebalance_open_src_file (xlator_t *from, xlator_t *to, loc_t *loc, DHT_MSG_MIGRATE_FILE_FAILED, "failed to set xattr on %s in %s (%s)", loc->path, from->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } @@ -1141,6 +1215,7 @@ __dht_rebalance_open_src_file (xlator_t *from, xlator_t *to, loc_t *loc, DHT_MSG_MIGRATE_FILE_FAILED, "failed to set mode on %s in %s (%s)", loc->path, from->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } @@ -1156,7 +1231,7 @@ out: int migrate_special_files (xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc, - struct iatt *buf) + struct iatt *buf, int *fop_errno) { int ret = -1; dict_t *rsp_dict = NULL; @@ -1166,11 +1241,15 @@ migrate_special_files (xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc, dht_conf_t *conf = this->private; dict = dict_new (); - if (!dict) + if (!dict) { + *fop_errno = ENOMEM; + ret = -1; goto out; - + } ret = dict_set_int32 (dict, conf->link_xattr_name, 256); if (ret) { + *fop_errno = ENOMEM; + ret = -1; gf_log (this->name, GF_LOG_ERROR, "%s: failed to set 'linkto' key in dict", loc->path); goto out; @@ -1183,6 +1262,7 @@ migrate_special_files (xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc, DHT_MSG_MIGRATE_FILE_FAILED, "%s: lookup failed (%s)", loc->path, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } @@ -1198,6 +1278,7 @@ migrate_special_files (xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc, gf_msg (this->name, GF_LOG_WARNING, 0, DHT_MSG_MIGRATE_FILE_FAILED, "%s: file exists in destination", loc->path); + *fop_errno = EINVAL; ret = -1; goto out; } @@ -1209,6 +1290,7 @@ migrate_special_files (xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc, DHT_MSG_MIGRATE_FILE_FAILED, "%s: failed to delete the linkfile (%s)", loc->path, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } @@ -1217,6 +1299,8 @@ migrate_special_files (xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc, /* Set the gfid of the source file in dict */ ret = dict_set_static_bin (dict, "gfid-req", buf->ia_gfid, 16); if (ret) { + *fop_errno = ENOMEM; + ret = -1; gf_log (this->name, GF_LOG_ERROR, "%s: failed to set gfid in dict for create", loc->path); goto out; @@ -1232,6 +1316,7 @@ migrate_special_files (xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc, DHT_MSG_MIGRATE_FILE_FAILED, "%s: readlink on symlink failed (%s)", loc->path, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } @@ -1242,6 +1327,7 @@ migrate_special_files (xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc, DHT_MSG_MIGRATE_FILE_FAILED, "%s: creating symlink failed (%s)", loc->path, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } @@ -1258,6 +1344,7 @@ migrate_special_files (xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc, DHT_MSG_MIGRATE_FILE_FAILED, "%s: mknod failed (%s)", loc->path, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } @@ -1272,6 +1359,7 @@ done: DHT_MSG_MIGRATE_FILE_FAILED, "%s: failed to perform setattr on %s (%s)", loc->path, to->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; } @@ -1281,6 +1369,7 @@ done: DHT_MSG_MIGRATE_FILE_FAILED, "%s: unlink failed (%s)", loc->path, strerror (-ret)); + *fop_errno = -ret; ret = -1; } @@ -1369,7 +1458,7 @@ out: */ int dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, - int flag) + int flag, int *fop_errno) { int ret = -1; struct iatt new_stbuf = {0,}; @@ -1416,11 +1505,17 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, loc->path, from->name, to->name); dict = dict_new (); - if (!dict) + if (!dict) { + ret = -1; + *fop_errno = ENOMEM; + gf_msg (this->name, GF_LOG_ERROR, ENOMEM, DHT_MSG_NO_MEMORY, + "Could not allocate memory for dict"); goto out; - + } ret = dict_set_int32 (dict, conf->link_xattr_name, 256); if (ret) { + *fop_errno = ENOMEM; + ret = -1; gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED, "Migrate file failed:" @@ -1435,6 +1530,8 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, ret = dict_set_int32 (dict, GLUSTERFS_POSIXLK_COUNT, sizeof(int32_t)); if (ret) { + *fop_errno = ENOMEM; + ret = -1; gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED, "Migrate file failed: %s: failed to " @@ -1456,12 +1553,13 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, ret = syncop_inodelk (from, DHT_FILE_MIGRATE_DOMAIN, &tmp_loc, F_SETLKW, &flock, NULL, NULL); if (ret < 0) { + *fop_errno = -ret; + ret = -1; gf_msg (this->name, GF_LOG_WARNING, 0, DHT_MSG_MIGRATE_FILE_FAILED, "migrate file failed: " "%s: failed to lock file on %s (%s)", - loc->path, from->name, strerror (-ret)); - ret = -1; + loc->path, from->name, strerror (*fop_errno)); goto out; } @@ -1470,20 +1568,22 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, /* Phase 1 - Data migration is in progress from now on */ ret = syncop_lookup (from, loc, &stbuf, NULL, dict, &xattr_rsp); if (ret) { + *fop_errno = -ret; + ret = -1; gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED, "Migrate file failed:" "%s: lookup failed on %s (%s)", - loc->path, from->name, strerror (-ret)); - ret = -1; - goto out; + loc->path, from->name, strerror (*fop_errno)); + goto out; } /* preserve source mode, so set the same to the destination */ src_ia_prot = stbuf.ia_prot; /* Check if file can be migrated */ - ret = __is_file_migratable (this, loc, &stbuf, xattr_rsp, flag, defrag); + ret = __is_file_migratable (this, loc, &stbuf, xattr_rsp, flag, defrag, + fop_errno); if (ret) { if (ret == -2) ret = 0; @@ -1493,7 +1593,8 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, /* Take care of the special files */ if (!IA_ISREG (stbuf.ia_type)) { /* Special files */ - ret = migrate_special_files (this, from, to, loc, &stbuf); + ret = migrate_special_files (this, from, to, loc, &stbuf, + fop_errno); goto out; } @@ -1501,17 +1602,18 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, /* TODO: move all xattr related operations to fd based operations */ ret = syncop_listxattr (from, loc, &xattr, NULL, NULL); if (ret < 0) { + *fop_errno = -ret; + ret = -1; gf_msg (this->name, GF_LOG_WARNING, 0, DHT_MSG_MIGRATE_FILE_FAILED, "Migrate file failed:" "%s: failed to get xattr from %s (%s)", - loc->path, from->name, strerror (-ret)); - ret = -1; + loc->path, from->name, strerror (*fop_errno)); } /* create the destination, with required modes/xattr */ - ret = __dht_rebalance_create_dst_file (to, from, loc, &stbuf, - &dst_fd, xattr); + ret = __dht_rebalance_create_dst_file (this, to, from, loc, &stbuf, + &dst_fd, xattr, fop_errno); if (ret) { gf_msg (this->name, GF_LOG_ERROR, 0, 0, "Create dst failed" " on - %s for file - %s", to->name, loc->path); @@ -1520,8 +1622,8 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, clean_dst = _gf_true; - ret = __dht_check_free_space (to, from, loc, &stbuf, flag, conf, - &target_changed, &new_target, &ignore_failure); + ret = __dht_check_free_space (this, to, from, loc, &stbuf, flag, conf, + &target_changed, &new_target, &ignore_failure, fop_errno); if (target_changed) { /* Can't handle for hardlinks. Marking this as failure */ if (flag == GF_DHT_MIGRATE_HARDLINK_IN_PROGRESS || stbuf.ia_nlink > 1) { @@ -1552,8 +1654,8 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, * destination. We need to do update this only post migration * as in case of failure the linkto needs to point to the source * subvol */ - ret = __dht_rebalance_create_dst_file (to, from, loc, &stbuf, - &dst_fd, xattr); + ret = __dht_rebalance_create_dst_file (this, to, from, loc, &stbuf, + &dst_fd, xattr, fop_errno); if (ret) { gf_log (this->name, GF_LOG_ERROR, "Create dst failed" " on - %s for file - %s", to->name, loc->path); @@ -1572,8 +1674,8 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, } /* Open the source, and also update mode/xattr */ - ret = __dht_rebalance_open_src_file (from, to, loc, &stbuf, &src_fd, - &clean_src); + ret = __dht_rebalance_open_src_file (this, from, to, loc, &stbuf, &src_fd, + &clean_src, fop_errno); if (ret) { gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED, @@ -1593,13 +1695,14 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, DHT_MSG_MIGRATE_FILE_FAILED, "Migrate file failed:failed to lookup %s on %s ", loc->path, from->name); + *fop_errno = -ret; ret = -1; goto out; } /* Check again if file has hardlink */ ret = __check_file_has_hardlink (this, loc, &stbuf, xattr_rsp, - flag, defrag); + flag, defrag, fop_errno); if (ret) { if (ret == -2) ret = 0; @@ -1613,10 +1716,12 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, /* All I/O happens in this function */ if (defrag->cmd == GF_DEFRAG_CMD_START_TIER) { ret = __tier_migrate_data (defrag, from, to, src_fd, dst_fd, - stbuf.ia_size, file_has_holes); + stbuf.ia_size, + file_has_holes, fop_errno); } else { ret = __dht_rebalance_migrate_data (from, to, src_fd, dst_fd, - stbuf.ia_size, file_has_holes); + stbuf.ia_size, + file_has_holes, fop_errno); } if (ret) { @@ -1636,6 +1741,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, gf_log (this->name, GF_LOG_WARNING, "%s: failed to fsync on %s (%s)", loc->path, to->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; } @@ -1649,6 +1755,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, DHT_MSG_MIGRATE_FILE_FAILED, "Migrate file failed: failed to fstat file %s on %s ", loc->path, from->name); + *fop_errno = -ret; ret = -1; goto out; } @@ -1671,8 +1778,9 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, if (!meta_dict) { gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED, - "Trace dict_new failed"); + "dict_new failed"); + *fop_errno = ENOMEM; ret = -1; goto out; } @@ -1684,6 +1792,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, "Failed to set dictionary value: key = %s," " path = %s", GLUSTERFS_INTERNAL_FOP_KEY, loc->path); + *fop_errno = ENOMEM; ret = -1; goto out; } @@ -1693,7 +1802,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED, "Trace dict_set failed"); - + *fop_errno = ENOMEM; ret = -1; goto out; } @@ -1704,6 +1813,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, DHT_MSG_MIGRATE_FILE_FAILED, "Trace syncop_setxattr metalock failed"); + *fop_errno = -ret; ret = -1; goto out; } else { @@ -1724,6 +1834,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, "Migrate file failed:" "%s: Failed to lock on %s", loc->path, from->name); + *fop_errno = -ret; ret = -1; goto out; } @@ -1748,6 +1859,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, DHT_MSG_LOCK_MIGRATION_FAILED, "write lock failed on:%s", loc->path); + *fop_errno = -ret; ret = -1; goto metaunlock; } @@ -1755,6 +1867,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_LOCK_MIGRATION_FAILED, "getactivelk failed for file: %s", loc->path); + *fop_errno = -ret; } } @@ -1780,6 +1893,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, "Migrate file failed:" "%s: failed to perform setattr on %s ", loc->path, to->name); + *fop_errno = -ret; ret = -1; goto metaunlock; } @@ -1792,6 +1906,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, gf_log (this->name, GF_LOG_WARNING, "%s: failed to perform setattr on %s ", loc->path, to->name); + *fop_errno = -ret; ret = -1; } @@ -1799,6 +1914,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, if (!dict) { dict = dict_new (); if (!dict) { + *fop_errno = ENOMEM; ret = -1; goto out; } @@ -1810,6 +1926,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, gf_log (this->name, GF_LOG_ERROR, "failed to set xattr in dict for %s (linkto:%s)", loc->path, to->name); + *fop_errno = ENOMEM; ret = -1; goto out; } @@ -1820,6 +1937,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, DHT_MSG_MIGRATE_FILE_FAILED, "failed to set xattr on %s in %s (%s)", loc->path, old_target->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto out; } else if (-ret == ESTALE || -ret == ENOENT) { @@ -1833,6 +1951,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, DHT_MSG_MIGRATE_FILE_FAILED, "%s: fd create failed (%s)", loc->path, strerror (errno)); + *fop_errno = ENOMEM; ret = -1; goto out; } @@ -1840,6 +1959,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, DHT_LINKFILE_MODE, linkto_fd, NULL, dict, NULL); if (ret != 0 && -ret != EEXIST && -ret != ESTALE) { + *fop_errno = -ret; ret = -1; gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED, @@ -1851,6 +1971,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, (GF_SET_ATTR_UID | GF_SET_ATTR_GID), NULL, NULL, NULL, NULL); if (ret < 0) + *fop_errno = -ret; gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED, "chown failed for %s on %s (%s)", @@ -1879,6 +2000,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, "Migrate file failed:" "%s: failed to get xattr from %s (%s)", loc->path, from->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; } else { ret = syncop_setxattr (to, loc, xattr, 0, NULL, NULL); @@ -1891,6 +2013,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, "Migrate file failed:" "%s: failed to set xattr on %s (%s)", loc->path, to->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; } } @@ -1920,6 +2043,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, "Migrate file failed:" "%s: failed to perform setattr on %s ", loc->path, from->name); + *fop_errno = -ret; ret = -1; goto metaunlock; } @@ -1931,6 +2055,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, gf_log (this->name, GF_LOG_WARNING, "%s: failed to perform truncate on %s (%s)", loc->path, from->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; } @@ -1940,6 +2065,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, gf_log (this->name, GF_LOG_WARNING, "%s: failed to perform removexattr on %s (%s)", loc->path, to->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; } @@ -1961,6 +2087,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, loc->path, from->name, strerror (-ret)); if (-ret != ENOENT) { + *fop_errno = -ret; ret = -1; goto metaunlock; } @@ -1978,6 +2105,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, DHT_MSG_MIGRATE_FILE_FAILED, "%s: failed to perform unlink on %s (%s)", loc->path, from->name, strerror (-ret)); + *fop_errno = -ret; ret = -1; goto metaunlock; } @@ -1988,6 +2116,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to, gf_msg_debug (this->name, 0, "%s: failed to lookup the file on subvolumes (%s)", loc->path, strerror (-ret)); + *fop_errno = -ret; ret = -1; } @@ -2010,6 +2139,7 @@ metaunlock: DHT_MSG_MIGRATE_FILE_FAILED, "Trace dict_set failed"); + *fop_errno = ENOMEM; ret = -1; goto out; } @@ -2024,6 +2154,7 @@ metaunlock: DHT_MSG_MIGRATE_FILE_FAILED, "Trace dict_set failed"); + *fop_errno = ENOMEM; ret = -1; goto out; } @@ -2034,6 +2165,7 @@ metaunlock: DHT_MSG_MIGRATE_FILE_FAILED, "Trace syncop_setxattr meta unlock failed"); + *fop_errno = -ret; ret = -1; goto out; } @@ -2115,6 +2247,7 @@ rebalance_task (void *data) int ret = -1; dht_local_t *local = NULL; call_frame_t *frame = NULL; + int fop_errno = 0; frame = data; @@ -2123,7 +2256,8 @@ rebalance_task (void *data) /* This function is 'synchrounous', hence if it returns, we are done with the task */ ret = dht_migrate_file (THIS, &local->loc, local->rebalance.from_subvol, - local->rebalance.target_node, local->flags); + local->rebalance.target_node, local->flags, + &fop_errno); return ret; } @@ -2158,7 +2292,7 @@ rebalance_task_completion (int op_ret, call_frame_t *sync_frame, void *data) int dht_start_rebalance_task (xlator_t *this, call_frame_t *frame) { - int ret = -1; + int ret = -1; ret = synctask_new (this->ctx->env, rebalance_task, rebalance_task_completion, @@ -2166,6 +2300,7 @@ dht_start_rebalance_task (xlator_t *this, call_frame_t *frame) return ret; } + int gf_listener_stop (xlator_t *this) { @@ -2308,17 +2443,16 @@ gf_defrag_ctx_subvols_init (dht_dfoffset_ctx_t *offset_var, xlator_t *this) { int gf_defrag_migrate_single_file (void *opaque) { - xlator_t *this = NULL; - dht_conf_t *conf = NULL; - gf_defrag_info_t *defrag = NULL; - int ret = 0; + xlator_t *this = NULL; + dht_conf_t *conf = NULL; + gf_defrag_info_t *defrag = NULL; + int ret = 0; gf_dirent_t *entry = NULL; struct timeval start = {0,}; loc_t entry_loc = {0,}; loc_t *loc = NULL; struct iatt iatt = {0,}; dict_t *migrate_data = NULL; - int32_t op_errno = 0; struct timeval end = {0,}; double elapsed = {0,}; struct dht_container *rebal_entry = NULL; @@ -2327,6 +2461,10 @@ gf_defrag_migrate_single_file (void *opaque) xlator_t *cached_subvol = NULL; call_frame_t *statfs_frame = NULL; xlator_t *old_THIS = NULL; + data_t *tmp = NULL; + int fop_errno = 0; + gf_dht_migrate_data_type_t rebal_type = GF_DHT_MIGRATE_DATA; + char value[MAX_REBAL_TYPE_SIZE] = {0,}; rebal_entry = (struct dht_container *)opaque; if (!rebal_entry) { @@ -2389,7 +2527,7 @@ gf_defrag_migrate_single_file (void *opaque) gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED, "Migrate file failed: %s lookup failed", - entry_loc.name); + entry_loc.path); ret = 0; goto out; } @@ -2399,7 +2537,7 @@ gf_defrag_migrate_single_file (void *opaque) gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_HASHED_SUBVOL_GET_FAILED, "Failed to get hashed subvol for %s", - loc->path); + entry_loc.path); ret = 0; goto out; } @@ -2409,7 +2547,7 @@ gf_defrag_migrate_single_file (void *opaque) gf_msg (this->name, GF_LOG_ERROR, 0, DHT_MSG_CACHED_SUBVOL_GET_FAILED, "Failed to get cached subvol for %s", - loc->path); + entry_loc.path); ret = 0; goto out; @@ -2439,12 +2577,20 @@ gf_defrag_migrate_single_file (void *opaque) dht_get_du_info (statfs_frame, this, loc); THIS = old_THIS; - ret = syncop_setxattr (this, &entry_loc, migrate_data, 0, NULL, NULL); + tmp = dict_get (migrate_data, GF_XATTR_FILE_MIGRATE_KEY); + if (tmp) { + memcpy (value, tmp->data, tmp->len); + if (strcmp (value, "force") == 0) + rebal_type = GF_DHT_MIGRATE_DATA_EVEN_IF_LINK_EXISTS; + + if (conf->decommission_in_progress) + rebal_type = GF_DHT_MIGRATE_HARDLINK; + } + + ret = dht_migrate_file (this, &entry_loc, cached_subvol, + hashed_subvol, rebal_type, &fop_errno); if (ret < 0) { - op_errno = -ret; - /* errno is overloaded. See - * rebalance_task_completion () */ - if (op_errno == ENOSPC) { + if (fop_errno == ENOSPC) { gf_msg_debug (this->name, 0, "migrate-data skipped for" " %s due to space constraints", entry_loc.path); @@ -2453,7 +2599,7 @@ gf_defrag_migrate_single_file (void *opaque) defrag->skipped += 1; } UNLOCK (&defrag->lock); - } else if (op_errno == ENOTSUP) { + } else if (fop_errno == ENOTSUP) { gf_msg_debug (this->name, 0, "migrate-data skipped for" " hardlink %s ", entry_loc.path); LOCK (&defrag->lock); @@ -2461,9 +2607,9 @@ gf_defrag_migrate_single_file (void *opaque) defrag->skipped += 1; } UNLOCK (&defrag->lock); - } else if (op_errno != EEXIST) { - gf_msg (this->name, GF_LOG_ERROR, 0, - DHT_MSG_MIGRATE_FILE_FAILED, + } else if (fop_errno != EEXIST) { + gf_msg (this->name, GF_LOG_ERROR, + DHT_MSG_MIGRATE_FILE_FAILED, fop_errno, "migrate-data failed for %s", entry_loc.path); LOCK (&defrag->lock); @@ -2474,29 +2620,19 @@ gf_defrag_migrate_single_file (void *opaque) } - ret = gf_defrag_handle_migrate_error (op_errno, defrag); + ret = gf_defrag_handle_migrate_error (fop_errno, defrag); if (!ret) { gf_msg(this->name, GF_LOG_ERROR, 0, DHT_MSG_MIGRATE_FILE_FAILED, "migrate-data on %s failed: %s", entry_loc.path, - strerror (op_errno)); + strerror (fop_errno)); } else if (ret == 1) { ret = 0; goto out; } else if (ret == -1) { goto out; } - } else if (ret > 0) { - gf_msg (this->name, GF_LOG_ERROR, 0, - DHT_MSG_MIGRATE_FILE_FAILED, - "migrate-data failed for %s", entry_loc.path); - ret = 0; - LOCK (&defrag->lock); - { - defrag->total_failures += 1; - } - UNLOCK (&defrag->lock); } LOCK (&defrag->lock); @@ -2534,7 +2670,7 @@ gf_defrag_task (void *opaque) struct dht_container *iterator = NULL; gf_defrag_info_t *defrag = NULL; int ret = 0; - + pid_t pid = GF_CLIENT_PID_DEFRAG; defrag = (gf_defrag_info_t *)opaque; if (!defrag) { @@ -2542,6 +2678,8 @@ gf_defrag_task (void *opaque) goto out; } + syncopctx_setfspid (&pid); + q_head = &(defrag->queue[0].list); /* The following while loop will dequeue one entry from the defrag->queue |