leases:Mark the fop conflicting if lease_id not set
Glusterfs leases expects lease_id to be set and sent for each fop to determine conflict resolution with the existing lease. Incase if not set (most likely if there is an older client in a mixed cluster), it makes sense to consider it as conflicitng fop and recall the lease. Also fixed the return status check for __remove_lease(), wherein non-negative value is considered as success case. Change-Id: I5bcfba4f7c71a5af7cdedeb03436d0b818e85783 updates: #350 Signed-off-by: Soumya Koduri <skoduri@redhat.com>
This commit is contained in:
parent
63a8d72736
commit
cf5b13896d
@ -984,7 +984,7 @@ process_lease_req(call_frame_t *frame, xlator_t *this, inode_t *inode,
|
||||
break;
|
||||
case GF_UNLK_LEASE:
|
||||
ret = __remove_lease(this, inode, lease_ctx, client_uid, lease);
|
||||
if ((ret == 0) && (lease_ctx->lease_cnt == 0)) {
|
||||
if ((ret >= 0) && (lease_ctx->lease_cnt == 0)) {
|
||||
pthread_mutex_unlock(&lease_ctx->lock);
|
||||
goto unblock;
|
||||
}
|
||||
@ -1019,7 +1019,6 @@ __check_lease_conflict(call_frame_t *frame, lease_inode_ctx_t *lease_ctx,
|
||||
|
||||
GF_VALIDATE_OR_GOTO("leases", frame, out);
|
||||
GF_VALIDATE_OR_GOTO("leases", lease_ctx, out);
|
||||
GF_VALIDATE_OR_GOTO("leases", lease_id, out);
|
||||
|
||||
lease_type = lease_ctx->lease_type;
|
||||
|
||||
@ -1032,9 +1031,13 @@ __check_lease_conflict(call_frame_t *frame, lease_inode_ctx_t *lease_ctx,
|
||||
goto recall;
|
||||
}
|
||||
|
||||
/* TODO: If lease_id is not sent, fall back to client uid conflict check?
|
||||
* Or set conflicts = true if lease_id is 0 when there is an existing
|
||||
* lease */
|
||||
/* If lease_id is not sent, set conflicts = true if there is
|
||||
* an existing lease */
|
||||
if (!lease_id && (lease_ctx->lease_cnt > 0)) {
|
||||
conflicts = _gf_true;
|
||||
goto recall;
|
||||
}
|
||||
|
||||
switch (lease_type) {
|
||||
case (GF_RW_LEASE | GF_RD_LEASE):
|
||||
case GF_RW_LEASE:
|
||||
|
Loading…
x
Reference in New Issue
Block a user