diff options
| author | Richard Wareing <rwareing@fb.com> | 2015-09-30 18:49:15 -0700 |
|---|---|---|
| committer | Jeff Darcy <jeff@pl.atyp.us> | 2017-07-12 17:04:32 +0000 |
| commit | 90d375de2e1ea49468c432126babbaee66d85fc0 (patch) | |
| tree | a82b750eb8508c61f2e6ee119e0167f182390b9f /xlators/protocol/server/src/server-resolve.c | |
| parent | 50087889cce61d9c4216d1775762733c2206ff74 (diff) | |
cluster/afr: Handle gfid-less directories in heal flow
Summary:
- Updates heal flow to handle case where a directory does not have a
gfid assigned. In this case we will remove _only_ empty directories
in these cases such that the parent can re-gain consistency and files
within can be correctly healed.
- Also adds a test for the case where a file does not have a gfid, this
is already handles by the metadata heal flow, but tests were lacking
for this code path.
Test Plan:
- prove -v tests/basic/shd_autofix_nogfid.t
- prove -v tests/basic/gfid_unsplit_shd.t
Reviewers: dph, moox, sshreyas
Reviewed By: sshreyas
Differential Revision: https://phabricator.fb.com/D2502067
Tasks: 8549168
Change-Id: I8dd3e6a6d62807cb38aafe597eced3d4b402351b
Signed-off-by: Jeff Darcy <jdarcy@fb.com>
Reviewed-on: https://review.gluster.org/17750
Tested-by: Jeff Darcy <jeff@pl.atyp.us>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Jeff Darcy <jeff@pl.atyp.us>
Diffstat (limited to 'xlators/protocol/server/src/server-resolve.c')
| -rw-r--r-- | xlators/protocol/server/src/server-resolve.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/xlators/protocol/server/src/server-resolve.c b/xlators/protocol/server/src/server-resolve.c index 1ad45394dd7..6f621119278 100644 --- a/xlators/protocol/server/src/server-resolve.c +++ b/xlators/protocol/server/src/server-resolve.c @@ -58,6 +58,10 @@ resolve_gfid_entry_cbk (call_frame_t *frame, void *cookie, xlator_t *this, resolve = state->resolve_now; resolve_loc = &resolve->resolve_loc; + if (!state->loc.inode && inode) { + state->loc.inode = inode; + } + if (op_ret == -1) { if (op_errno == ENOENT) { gf_msg_debug (this->name, 0, "%s/%s: failed to resolve" @@ -71,7 +75,6 @@ resolve_gfid_entry_cbk (call_frame_t *frame, void *cookie, xlator_t *this, uuid_utoa (resolve_loc->pargfid), resolve_loc->name, strerror (op_errno)); } - goto out; } link_inode = inode_link (inode, resolve_loc->parent, |
