summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/afr/src/afr-self-heald.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/cluster/afr/src/afr-self-heald.c')
-rw-r--r--xlators/cluster/afr/src/afr-self-heald.c46
1 files changed, 28 insertions, 18 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heald.c b/xlators/cluster/afr/src/afr-self-heald.c
index b4f6371c1..617711d0d 100644
--- a/xlators/cluster/afr/src/afr-self-heald.c
+++ b/xlators/cluster/afr/src/afr-self-heald.c
@@ -72,6 +72,24 @@ _crawl_directory (fd_t *fd, loc_t *loc, afr_crawl_data_t *crawl_data);
int
afr_syncop_find_child_position (void *data);
+static int
+_loc_assign_gfid_path (loc_t *loc)
+{
+ int ret = -1;
+ char gfid_path[64] = {0};
+
+ if (loc->inode && !uuid_is_null (loc->inode->gfid)) {
+ ret = inode_path (loc->inode, NULL, (char**)&loc->path);
+ } else if (!uuid_is_null (loc->gfid)) {
+ snprintf (gfid_path, sizeof (gfid_path), "<gfid:%s>",
+ uuid_utoa (loc->gfid));
+ loc->path = gf_strdup (gfid_path);
+ if (loc->path)
+ ret = 0;
+ }
+ return ret;
+}
+
void
shd_cleanup_event (void *event)
{
@@ -345,11 +363,7 @@ _self_heal_entry (xlator_t *this, afr_crawl_data_t *crawl_data, gf_dirent_t *ent
int ret = 0;
dict_t *xattr_rsp = NULL;
- if (uuid_is_null (child->gfid))
- gf_log (this->name, GF_LOG_DEBUG, "lookup %s", child->path);
- else
- gf_log (this->name, GF_LOG_DEBUG, "lookup %s",
- uuid_utoa (child->gfid));
+ gf_log (this->name, GF_LOG_DEBUG, "lookup %s", child->path);
ret = syncop_lookup (this, child, NULL,
iattr, &xattr_rsp, &parentbuf);
@@ -773,17 +787,20 @@ int
afr_crawl_build_child_loc (xlator_t *this, loc_t *child, loc_t *parent,
gf_dirent_t *entry, afr_crawl_data_t *crawl_data)
{
- int ret = 0;
+ int ret = -1;
afr_private_t *priv = NULL;
priv = this->private;
if (crawl_data->crawl == FULL) {
ret = afr_build_child_loc (this, child, parent, entry->d_name);
} else {
- child->path = "";
child->inode = inode_new (priv->root_inode->table);
+ if (!child->inode)
+ goto out;
uuid_parse (entry->d_name, child->gfid);
+ ret = _loc_assign_gfid_path (child);
}
+out:
return ret;
}
@@ -817,8 +834,6 @@ _process_entries (xlator_t *this, loc_t *parentloc, gf_dirent_t *entries,
continue;
}
- if (crawl_data->crawl == INDEX)
- entry_loc.path = NULL;//HACK
loc_wipe (&entry_loc);
ret = afr_crawl_build_child_loc (this, &entry_loc, parentloc,
entry, crawl_data);
@@ -836,10 +851,8 @@ _process_entries (xlator_t *this, loc_t *parentloc, gf_dirent_t *entries,
link_inode = inode_link (entry_loc.inode, NULL, NULL, &iattr);
if (link_inode == NULL) {
- char uuidbuf[64];
gf_log (this->name, GF_LOG_ERROR, "inode link failed "
- "on the inode (%s)",
- uuid_utoa_r (entry_loc.gfid, uuidbuf));
+ "on the inode (%s)",entry_loc.path);
ret = -1;
goto out;
}
@@ -854,10 +867,7 @@ _process_entries (xlator_t *this, loc_t *parentloc, gf_dirent_t *entries,
}
ret = 0;
out:
- if (crawl_data->crawl == INDEX)
- entry_loc.path = NULL;
- if (entry_loc.path)
- loc_wipe (&entry_loc);
+ loc_wipe (&entry_loc);
return ret;
}
@@ -876,10 +886,10 @@ _crawl_directory (fd_t *fd, loc_t *loc, afr_crawl_data_t *crawl_data)
GF_ASSERT (loc->inode);
- if (loc->path)
+ if (crawl_data->crawl == FULL)
gf_log (this->name, GF_LOG_DEBUG, "crawling %s", loc->path);
else
- gf_log (this->name, GF_LOG_DEBUG, "crawling %s",
+ gf_log (this->name, GF_LOG_DEBUG, "crawling INDEX %s",
uuid_utoa (loc->gfid));
while (1) {