From: Yan, Zheng Date: Tue, 7 Nov 2017 02:50:14 +0000 (+0800) Subject: mds: implement LOCK_XSYN_LOCK and LOCK_XSYN_MIX X-Git-Tag: v12.2.3~16^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4fbde822b85fb96e79f800df0ab24d508887665b;p=ceph.git mds: implement LOCK_XSYN_LOCK and LOCK_XSYN_MIX Signed-off-by: "Yan, Zheng" (cherry picked from commit c7261e1a6d95d1ed98a1d9066905aa75af4c2886) --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index dda87315df1d..4a2cc2428859 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -958,6 +958,7 @@ void Locker::eval_gather(SimpleLock *lock, bool first, bool *pneed_issue, liststart_scatter(static_cast(lock)); if (lock->get_parent()->is_replicated()) { bufferlist softdata; @@ -4167,11 +4168,7 @@ void Locker::simple_lock(SimpleLock *lock, bool *need_issue) switch (lock->get_state()) { case LOCK_SYNC: lock->set_state(LOCK_SYNC_LOCK); break; - case LOCK_XSYN: - file_excl(static_cast(lock), need_issue); - if (lock->get_state() != LOCK_EXCL) - return; - // fall-thru + case LOCK_XSYN: lock->set_state(LOCK_XSYN_LOCK); break; case LOCK_EXCL: lock->set_state(LOCK_EXCL_LOCK); break; case LOCK_MIX: lock->set_state(LOCK_MIX_LOCK); (static_cast(lock))->clear_unscatter_wanted(); @@ -4896,12 +4893,8 @@ void Locker::scatter_mix(ScatterLock *lock, bool *need_issue) // gather? switch (lock->get_state()) { case LOCK_SYNC: lock->set_state(LOCK_SYNC_MIX); break; - case LOCK_XSYN: - file_excl(lock, need_issue); - if (lock->get_state() != LOCK_EXCL) - return; - // fall-thru case LOCK_EXCL: lock->set_state(LOCK_EXCL_MIX); break; + case LOCK_XSYN: lock->set_state(LOCK_XSYN_MIX); break; case LOCK_TSYN: lock->set_state(LOCK_TSYN_MIX); break; default: ceph_abort(); } @@ -4910,8 +4903,7 @@ void Locker::scatter_mix(ScatterLock *lock, bool *need_issue) if (lock->is_rdlocked()) gather++; if (in->is_replicated()) { - if (lock->get_state() != LOCK_EXCL_MIX && // EXCL replica is already LOCK - lock->get_state() != LOCK_XSYN_EXCL) { // XSYN replica is already LOCK; ** FIXME here too! + if (lock->get_state() == LOCK_SYNC_MIX) { // for the rest states, replicas are already LOCK send_lock_message(lock, LOCK_AC_MIX); lock->init_gather(); gather++; diff --git a/src/mds/SimpleLock.h b/src/mds/SimpleLock.h index 6e60d2a7015f..8c52df733c51 100644 --- a/src/mds/SimpleLock.h +++ b/src/mds/SimpleLock.h @@ -120,6 +120,8 @@ public: case LOCK_XSYN_EXCL: return "xsyn->excl"; case LOCK_EXCL_XSYN: return "excl->xsyn"; case LOCK_XSYN_SYNC: return "xsyn->sync"; + case LOCK_XSYN_LOCK: return "xsyn->lock"; + case LOCK_XSYN_MIX: return "xsyn->mix"; case LOCK_SYNC_MIX: return "sync->mix"; case LOCK_SYNC_MIX2: return "sync->mix(2)"; diff --git a/src/mds/locks.c b/src/mds/locks.c index 2fc0a5fc0419..de99abe7a7d0 100644 --- a/src/mds/locks.c +++ b/src/mds/locks.c @@ -95,6 +95,7 @@ const struct sm_state_t filelock[LOCK_MAX] = { [LOCK_EXCL_LOCK] = { LOCK_LOCK, false, LOCK_LOCK, 0, 0, 0, 0, XCL, 0, 0, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,0,0 }, [LOCK_MIX_LOCK] = { LOCK_LOCK, false, LOCK_MIX, AUTH, 0, REQ, 0, 0, 0, 0, 0,0,0,0 }, [LOCK_MIX_LOCK2] = { LOCK_LOCK, false, LOCK_LOCK, AUTH, 0, REQ, 0, 0, 0, 0, 0,0,0,0 }, + [LOCK_XSYN_LOCK] = { LOCK_LOCK, true, LOCK_LOCK, AUTH, 0, 0, XCL, 0, 0, 0, 0,CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,0 }, [LOCK_PREXLOCK] = { LOCK_LOCK, false, LOCK_LOCK, 0, XCL, 0, 0, 0, 0, ANY, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,0,0 }, [LOCK_XLOCK] = { LOCK_LOCK, false, LOCK_LOCK, 0, XCL, 0, 0, 0, 0, 0, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,0,0 }, @@ -106,6 +107,7 @@ const struct sm_state_t filelock[LOCK_MAX] = { [LOCK_SYNC_MIX] = { LOCK_MIX, false, LOCK_SYNC_MIX2,ANY,0, 0, 0, 0, 0, 0, CEPH_CAP_GRD|CEPH_CAP_GLAZYIO,0,0,CEPH_CAP_GRD }, [LOCK_SYNC_MIX2] = { LOCK_MIX, false, 0, 0, 0, 0, 0, 0, 0, 0, CEPH_CAP_GRD|CEPH_CAP_GLAZYIO,0,0,CEPH_CAP_GRD }, [LOCK_EXCL_MIX] = { LOCK_MIX, true, LOCK_LOCK, 0, 0, 0, XCL, 0, 0, 0, 0,CEPH_CAP_GRD|CEPH_CAP_GWR|CEPH_CAP_GLAZYIO,0,0 }, + [LOCK_XSYN_MIX] = { LOCK_MIX, true, LOCK_LOCK, 0, 0, 0, XCL, 0, 0, 0, 0,0,0,0 }, [LOCK_EXCL] = { 0, true, LOCK_LOCK, 0, 0, XCL, XCL, 0, 0, 0, 0,CEPH_CAP_GSHARED|CEPH_CAP_GEXCL|CEPH_CAP_GCACHE|CEPH_CAP_GRD|CEPH_CAP_GWR|CEPH_CAP_GBUFFER|CEPH_CAP_GLAZYIO,0,0 }, [LOCK_SYNC_EXCL] = { LOCK_EXCL, true, LOCK_LOCK, AUTH, 0, 0, 0, 0, 0, 0, 0,CEPH_CAP_GSHARED|CEPH_CAP_GCACHE|CEPH_CAP_GRD,0,0 }, diff --git a/src/mds/locks.h b/src/mds/locks.h index 9f4ea566b4a1..252cf0ed5240 100644 --- a/src/mds/locks.h +++ b/src/mds/locks.h @@ -94,6 +94,8 @@ enum { LOCK_XSYN_EXCL, LOCK_EXCL_XSYN, LOCK_XSYN_SYNC, + LOCK_XSYN_LOCK, + LOCK_XSYN_MIX, LOCK_MAX, };