summaryrefslogtreecommitdiffstats
path: root/xlators/cluster
diff options
context:
space:
mode:
authorhari gowtham <hgowtham@redhat.com>2016-02-23 20:09:52 +0530
committerDan Lambright <dlambrig@redhat.com>2016-03-13 23:05:42 -0700
commitd9b5fef0333e63db9d3b5077968254e3ea9d2af4 (patch)
tree5b507ac0eb277fc4ef9f9697ab6ce88145b08e50 /xlators/cluster
parent68b840267ed0f6864e4cf5ba7d842988c0fb3da8 (diff)
Tier: Avoiding stale entries from causing demotion to stop
When the parent GFID is a stale entry, the lookup on this parent fails and this in turn fails the demotion process. This patch will make the stale entry error to be skipped. Situation for pargfid to be stale: Consider a folder from a tar file. Once the tar file is untared the files in the tar-file will start to demote. when the demotion is under progress, if we tend to delete the actual folder, then the files under it which are undergoing demotion will do a lookup on the parent which was deleted and become stale entry. This stale entry fails the Lookup and this will fail the demotion of the other files(not from tar) that are supposed to be demoted. Change-Id: I3d47c32c4077526d477a25912b0135bab98b23fc BUG: 1311178 Signed-off-by: hari gowtham <hgowtham@redhat.com> Reviewed-on: http://review.gluster.org/13501 Tested-by: hari gowtham <hari.gowtham005@gmail.com> Smoke: Gluster Build System <jenkins@build.gluster.com> CentOS-regression: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Dan Lambright <dlambrig@redhat.com> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Diffstat (limited to 'xlators/cluster')
-rw-r--r--xlators/cluster/dht/src/dht-messages.h10
-rw-r--r--xlators/cluster/dht/src/tier.c29
2 files changed, 36 insertions, 3 deletions
diff --git a/xlators/cluster/dht/src/dht-messages.h b/xlators/cluster/dht/src/dht-messages.h
index 6ea245d0c15..4403efc151c 100644
--- a/xlators/cluster/dht/src/dht-messages.h
+++ b/xlators/cluster/dht/src/dht-messages.h
@@ -40,7 +40,7 @@
*/
#define GLFS_DHT_BASE GLFS_MSGID_COMP_DHT
-#define GLFS_DHT_NUM_MESSAGES 112
+#define GLFS_DHT_NUM_MESSAGES 113
#define GLFS_MSGID_END (GLFS_DHT_BASE + GLFS_DHT_NUM_MESSAGES + 1)
/* Messages with message IDs */
@@ -1042,5 +1042,13 @@
#define DHT_MSG_FD_CTX_SET_FAILED (GLFS_DHT_BASE + 112)
+/*
+ * @messageid 109112
+ * @diagnosis
+ * @recommendedaction None
+ */
+
+#define DHT_MSG_STALE_LOOKUP (GLFS_DHT_BASE + 113)
+
#define glfs_msg_end_x GLFS_MSGID_END, "Invalid: End of messages"
#endif /* _DHT_MESSAGES_H_ */
diff --git a/xlators/cluster/dht/src/tier.c b/xlators/cluster/dht/src/tier.c
index 28ec8041f12..f35787ec010 100644
--- a/xlators/cluster/dht/src/tier.c
+++ b/xlators/cluster/dht/src/tier.c
@@ -625,7 +625,19 @@ tier_migrate_using_query_file (void *_args)
ret = syncop_lookup (this, &p_loc, &par_stbuf, NULL,
xdata_request, &xdata_response);
- if (ret) {
+ /* When the parent gfid is a stale entry, the lookup
+ * will fail and stop the demotion process.
+ * The parent gfid can be stale when a huge folder is
+ * deleted while the files within it are being migrated
+ */
+ if (ret == -ESTALE) {
+ gf_msg (this->name, GF_LOG_WARNING, -ret,
+ DHT_MSG_STALE_LOOKUP,
+ "Stale entry in parent lookup for %s",
+ uuid_utoa (p_loc.gfid));
+ per_link_status = 1;
+ goto abort;
+ } else if (ret) {
gf_msg (this->name, GF_LOG_ERROR, -ret,
DHT_MSG_LOG_TIER_ERROR,
"Error in parent lookup for %s",
@@ -683,7 +695,20 @@ tier_migrate_using_query_file (void *_args)
/* lookup file inode */
ret = syncop_lookup (this, &loc, &current, NULL,
NULL, NULL);
- if (ret) {
+ /* The file may be deleted even when the parent
+ * is available and the lookup will
+ * return a stale entry which would stop the
+ * migration. so if its a stale entry, then skip
+ * the file and keep migrating.
+ */
+ if (ret == -ESTALE) {
+ gf_msg (this->name, GF_LOG_WARNING, -ret,
+ DHT_MSG_STALE_LOOKUP,
+ "Stale lookup for %s",
+ uuid_utoa (p_loc.gfid));
+ per_link_status = 1;
+ goto abort;
+ } else if (ret) {
gf_msg (this->name, GF_LOG_ERROR, -ret,
DHT_MSG_LOG_TIER_ERROR, "Failed to "
"lookup file %s\n", loc.name);