From 52cf03ee314e46aa990c5b813d83019aabb04d58 Mon Sep 17 00:00:00 2001 From: Kinglong Mee Date: Tue, 23 Apr 2019 11:03:24 +0800 Subject: ec-heal: check file's gfid when deleting stale name A name-less lookup does not contain parent's stat, It is hard to check the lookuped file is at the right path. This patch changes to a name lookup, and check file's gfid with expected gfid. If the gfid is different, mark it estale. fixes: bz#1702131 Change-Id: I2de20b10d680eed1e2fb1d3830b3b3dec4520dbf Signed-off-by: Kinglong Mee --- xlators/cluster/ec/src/ec-heal.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'xlators/cluster/ec') diff --git a/xlators/cluster/ec/src/ec-heal.c b/xlators/cluster/ec/src/ec-heal.c index b9fb8686a6d..9f66189e9e0 100644 --- a/xlators/cluster/ec/src/ec-heal.c +++ b/xlators/cluster/ec/src/ec-heal.c @@ -1017,6 +1017,7 @@ ec_delete_stale_name(dict_t *gfid_db, char *key, data_t *d, void *data) int estale_count = 0; int i = 0; call_frame_t *frame = name_data->frame; + uuid_t gfid; ec = name_data->frame->this->private; EC_REPLIES_ALLOC(replies, ec->nodes); @@ -1025,12 +1026,16 @@ ec_delete_stale_name(dict_t *gfid_db, char *key, data_t *d, void *data) goto out; } + loc.parent = inode_ref(name_data->parent); loc.inode = inode_new(name_data->parent->table); if (!loc.inode) { ret = -ENOMEM; goto out; } - gf_uuid_parse(key, loc.gfid); + + gf_uuid_parse(key, gfid); + gf_uuid_copy(loc.pargfid, name_data->parent->gfid); + loc.name = name_data->name; output = alloca0(ec->nodes); ret = cluster_lookup(ec->xl_list, name_data->participants, ec->nodes, replies, output, name_data->frame, ec->xl, &loc, NULL); @@ -1043,6 +1048,11 @@ ec_delete_stale_name(dict_t *gfid_db, char *key, data_t *d, void *data) estale_count++; else name_data->participants[i] = 0; + } else if (gf_uuid_compare(gfid, replies[i].stat.ia_gfid)) { + estale_count++; + gf_msg_debug(ec->xl->name, 0, "%s/%s: different gfid as %s", + uuid_utoa(name_data->parent->gfid), name_data->name, + key); } } -- cgit