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:
parent
5fdffa7164
commit
80fa355958
56
tests/bugs/bug-1162498.t
Normal file
56
tests/bugs/bug-1162498.t
Normal 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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user