From: Sage Weil Date: Fri, 13 Mar 2009 21:25:21 +0000 (-0700) Subject: mds: fix lease release; add lease renew support in MDS X-Git-Tag: v0.7.1^2~20 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f56ac90c001058bb14d7d5ba1c7bf1e6d7eb1122;p=ceph.git mds: fix lease release; add lease renew support in MDS --- diff --git a/src/TODO b/src/TODO index 1c30cccb6bb9..cda0f424a5bb 100644 --- a/src/TODO +++ b/src/TODO @@ -12,10 +12,10 @@ v0.7 /- proc/sysfs cleanup v0.8 +/- O_DIRECT - kill fill_trace - ENOSPC -- O_DIRECT - flock - fully async file creation @@ -53,7 +53,7 @@ repair kernel client -- O_DIRECT +- should O_DIRECT invalidate the page cache? - inotify for updates from other clients? - optional or no fill_trace? - flock, fnctl locks diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index 3a18f37fc785..747df59cab88 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -44,7 +44,7 @@ #define CEPH_MDS_PROTOCOL 5 /* cluster internal */ #define CEPH_MON_PROTOCOL 4 /* cluster internal */ #define CEPH_OSDC_PROTOCOL 5 /* public/client */ -#define CEPH_MDSC_PROTOCOL 8 /* public/client */ +#define CEPH_MDSC_PROTOCOL 9 /* public/client */ #define CEPH_MONC_PROTOCOL 7 /* public/client */ @@ -1095,6 +1095,8 @@ struct ceph_mds_lease { __le64 ino; __le64 first, last; __le32 seq; + __le64 renew_start; /* time renew was requested */ + __le32 duration_ms; /* duration of renewal */ } __attribute__ ((packed)); /* followed by a __le32+string for dname */ diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 1119704153ce..3d055b4d28fa 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -1764,32 +1764,44 @@ void Locker::handle_client_lease(MClientLease *m) delete m; return; } - if ((m->get_action() == CEPH_MDS_LEASE_REVOKE_ACK) && - (l->seq != m->get_seq())) { - dout(7) << "handle_client_lease lease seq " << l->seq << " != provided " << m->get_seq() << dendl; - delete m; - return; - } switch (m->get_action()) { case CEPH_MDS_LEASE_REVOKE_ACK: case CEPH_MDS_LEASE_RELEASE: - { + if (l->seq != m->get_seq()) { + dout(7) << "handle_client_lease release - seq " << l->seq << " != provided " << m->get_seq() << dendl; + } else { dout(7) << "handle_client_lease client" << client << " release mask " << m->get_mask() << " on " << *p << dendl; int left = p->remove_client_lease(l, l->mask, this); dout(10) << " remaining mask is " << left << " on " << *p << dendl; } + delete m; break; case CEPH_MDS_LEASE_RENEW: + { + dout(7) << "handle_client_lease client" << client + << " renew mask " << m->get_mask() + << " on " << *p << dendl; + int pool = 1; // fixme.. do something smart! + m->h.duration_ms = (int)(1000 * mdcache->client_lease_durations[pool]); + m->h.seq = ++l->seq; + m->clear_payload(); + + utime_t now = g_clock.now(); + now += mdcache->client_lease_durations[pool]; + mdcache->touch_client_lease(l, pool, now); + + mds->send_message_client(m, client); + } + break; + default: assert(0); // implement me break; } - - delete m; }