diff options
| author | Soumya Koduri <skoduri@redhat.com> | 2018-10-22 21:16:53 +0530 | 
|---|---|---|
| committer | Soumya Koduri <skoduri@redhat.com> | 2018-10-24 15:09:32 +0530 | 
| commit | f48e6cf2183a749e75eaa22a1dffe58f0dba34d5 (patch) | |
| tree | a97d5da199cf61e8836390f08df22d93145ace2d | |
| parent | fa4710bb8fbc852971d763d8727e3755436ea9c8 (diff) | |
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.
This is backport of below mainline patch -
 https://review.gluster.org/21458
Change-Id: I5bcfba4f7c71a5af7cdedeb03436d0b818e85783
updates: #350
Signed-off-by: Soumya Koduri <skoduri@redhat.com>
| -rw-r--r-- | xlators/features/leases/src/leases-internal.c | 12 | 
1 files changed, 8 insertions, 4 deletions
diff --git a/xlators/features/leases/src/leases-internal.c b/xlators/features/leases/src/leases-internal.c index 475576eac79..51cfbaeeec4 100644 --- a/xlators/features/leases/src/leases-internal.c +++ b/xlators/features/leases/src/leases-internal.c @@ -992,7 +992,7 @@ process_lease_req (call_frame_t *frame, xlator_t *this,                  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;                          } @@ -1039,9 +1039,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:  | 
