uss/gluster: Send success on parent lookup of entry-point

When a lookup sent to snapview-server for entry-point directory
protocol server first tries to resolve gfid of a parent directory.

looking up the parent gfid from a latest snapshot can fail if the
volume is a restored volume. As this gfid is already looked-up by
snapview-client, we can return success for the parent gfid.

Change-Id: Ic9b20561ef79b93032f07c3a81eae54a94e1747b
BUG: 1162498
Signed-off-by: vmallika <vmallika@redhat.com>
Reviewed-on: http://review.gluster.org/9229
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Raghavendra Bhat <raghavendra@redhat.com>
Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
This commit is contained in:
vmallika 2014-12-03 15:10:44 +05:30 committed by Vijay Bellur
parent 5fdffa7164
commit 80fa355958
3 changed files with 107 additions and 14 deletions

56
tests/bugs/bug-1162498.t Normal file
View File

@ -0,0 +1,56 @@
#!/bin/bash
. $(dirname $0)/../include.rc
. $(dirname $0)/../snapshot.rc
cleanup;
TEST verify_lvm_version;
TEST glusterd;
TEST pidof glusterd;
TEST setup_lvm 1
TEST $CLI volume create $V0 $H0:$L1
TEST $CLI volume start $V0
TEST $CLI snapshot config activate-on-create enable
TEST $CLI volume set $V0 features.uss enable
TEST glusterfs -s $H0 --volfile-id=$V0 $M0
TEST mkdir $M0/xyz
TEST $CLI snapshot create snap1 $V0
TEST $CLI snapshot create snap2 $V0
TEST rmdir $M0/xyz
TEST $CLI snapshot create snap3 $V0
TEST $CLI snapshot create snap4 $V0
TEST mkdir $M0/xyz
TEST ls $M0/xyz/.snaps/
TEST $CLI volume stop $V0
TEST $CLI snapshot restore snap2
TEST $CLI volume start $V0
umount -f $M0
TEST glusterfs -s $H0 --volfile-id=$V0 $M0
#Dir xyz exists in snap1
EXPECT_WITHIN $PROCESS_UP_TIMEOUT "0" STAT $M0/xyz
TEST ls $M0/xyz/.snaps/
TEST mkdir $M0/abc
TEST ls $M0/abc/.snaps/
#Clean up
TEST $CLI snapshot delete snap1
TEST $CLI snapshot delete snap3
TEST $CLI snapshot delete snap4
TEST $CLI volume stop $V0 force
TEST $CLI volume delete $V0
cleanup;

View File

@ -446,7 +446,7 @@ __svs_initialise_snapshot_volume (xlator_t *this, const char *name,
dirent = __svs_get_snap_dirent (this, name);
if (!dirent) {
gf_log (this->name, GF_LOG_ERROR, "snap entry for "
gf_log (this->name, GF_LOG_DEBUG, "snap entry for "
"name %s not found", name);
local_errno = ENOENT;
goto out;

View File

@ -214,9 +214,10 @@ svs_lookup_snapshot (xlator_t *this, loc_t *loc, struct iatt *buf,
fs = svs_initialise_snapshot_volume (this, loc->name, op_errno);
if (!fs) {
gf_log (this->name, GF_LOG_ERROR, "failed to "
gf_log (this->name, GF_LOG_DEBUG, "failed to "
"create the fs instance for snap %s",
loc->name);
*op_errno = ENOENT;
op_ret = -1;
goto out;
}
@ -226,7 +227,7 @@ svs_lookup_snapshot (xlator_t *this, loc_t *loc, struct iatt *buf,
object = glfs_h_create_from_handle (fs, handle_obj, GFAPI_HANDLE_LENGTH,
&statbuf);
if (!object) {
gf_log (this->name, GF_LOG_ERROR, "failed to do lookup and "
gf_log (this->name, GF_LOG_DEBUG, "failed to do lookup and "
"get the handle on the snapshot %s", loc->name);
op_ret = -1;
*op_errno = errno;
@ -294,7 +295,7 @@ svs_lookup_entry (xlator_t *this, loc_t *loc, struct iatt *buf,
object = glfs_h_lookupat (fs, parent_object, loc->name,
&statbuf);
if (!object) {
gf_log (this->name, GF_LOG_ERROR, "failed to do lookup and "
gf_log (this->name, GF_LOG_DEBUG, "failed to do lookup and "
"get the handle for entry %s (path: %s)", loc->name,
loc->path);
op_ret = -1;
@ -479,6 +480,7 @@ svs_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)
inode_t *parent = NULL;
glfs_t *fs = NULL;
snap_dirent_t *dirent = NULL;
gf_boolean_t entry_point_key = _gf_false;
gf_boolean_t entry_point = _gf_false;
GF_VALIDATE_OR_GOTO ("svs", this, out);
@ -507,15 +509,21 @@ svs_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)
}
}
ret = dict_get_str_boolean (xdata, "entry-point", _gf_false);
if (ret == -1) {
gf_log (this->name, GF_LOG_DEBUG, "failed to get the "
"entry point info");
entry_point_key = _gf_false;
} else {
entry_point_key = ret;
}
if (loc->name && strlen (loc->name)) {
ret = dict_get_str_boolean (xdata, "entry-point", _gf_false);
if (ret == -1) {
gf_log (this->name, GF_LOG_DEBUG, "failed to get the "
"entry point info");
entry_point = _gf_false;
} else {
entry_point = ret;
}
/* lookup can come with the entry-point set in the dict
* for the parent directory of the entry-point as well.
* So consider entry_point only for named lookup
*/
entry_point = entry_point_key;
}
if (loc->parent)
@ -567,8 +575,37 @@ svs_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)
the server does not have the inode in the inode table.
*/
if (!inode_ctx && !parent_ctx) {
op_ret = svs_lookup_gfid (this, loc, &buf, &postparent,
&op_errno);
if (uuid_is_null (loc->gfid) &&
uuid_is_null (loc->inode->gfid)) {
gf_log (this->name, GF_LOG_ERROR, "gfid is NULL");
op_ret = -1;
op_errno = ESTALE;
goto out;
}
if (!entry_point_key) {
/* This can happen when there is no inode_ctx available.
* snapview-server might have restarted or
* graph change might have happened
*/
op_ret = -1;
op_errno = ESTALE;
goto out;
}
/* lookup is on the parent directory of entry-point.
* this would have already looked up by snap-view client
* so return success
*/
if (!uuid_is_null (loc->gfid))
uuid_copy (buf.ia_gfid, loc->gfid);
else
uuid_copy (buf.ia_gfid, loc->inode->gfid);
svs_iatt_fill (buf.ia_gfid, &buf);
svs_iatt_fill (buf.ia_gfid, &postparent);
op_ret = 0;
goto out;
}