Skip to content

Commit

Permalink
cephfs: LeaseStat versioning
Browse files Browse the repository at this point in the history
* Use the new feature bit CEPHFS_FEATURE_REPLY_ENCODING for encoding.
* encode/decode in the new format.
* Dropped LeaseStat::encode().
* The old format is maintained for backward compatibility.
* Created Locker::encode_lease() for encoding and dropped the duplicates.

Fixes: http://tracker.ceph.com/issues/24444
Signed-off-by: Jos Collin <[email protected]>
  • Loading branch information
joscollin committed Aug 12, 2018
1 parent b576ceb commit 2de7e88
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 51 deletions.
4 changes: 2 additions & 2 deletions src/client/Client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1151,7 +1151,7 @@ void Client::insert_readdir_results(MetaRequest *request, MetaSession *session,
LeaseStat dlease;
for (unsigned i=0; i<numdn; i++) {
decode(dname, p);
decode(dlease, p);
dlease.decode(p, features);
InodeStat ist(p, features);

ldout(cct, 15) << "" << i << ": '" << dname << "'" << dendl;
Expand Down Expand Up @@ -1301,7 +1301,7 @@ Inode* Client::insert_trace(MetaRequest *request, MetaSession *session)
dirst.decode(p, features);
dst.decode(p, features);
decode(dname, p);
decode(dlease, p);
dlease.decode(p, features);
}

Inode *in = 0;
Expand Down
36 changes: 24 additions & 12 deletions src/mds/Locker.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3774,20 +3774,17 @@ void Locker::issue_client_lease(CDentry *dn, client_t client,
now += mdcache->client_lease_durations[pool];
mdcache->touch_client_lease(l, pool, now);

LeaseStat e;
e.mask = 1 | CEPH_LOCK_DN; // old and new bit values
e.seq = ++l->seq;
e.duration_ms = (int)(1000 * mdcache->client_lease_durations[pool]);
encode(e, bl);
dout(20) << "issue_client_lease seq " << e.seq << " dur " << e.duration_ms << "ms "
LeaseStat lstat;
lstat.mask = 1 | CEPH_LOCK_DN; // old and new bit values
lstat.duration_ms = (uint32_t)(1000 * mdcache->client_lease_durations[pool]);
lstat.seq = ++l->seq;
encode_lease(bl, session->info, lstat);
dout(20) << "issue_client_lease seq " << lstat.seq << " dur " << lstat.duration_ms << "ms "
<< " on " << *dn << dendl;
} else {
// null lease
LeaseStat e;
e.mask = 0;
e.seq = 0;
e.duration_ms = 0;
encode(e, bl);
LeaseStat lstat;
encode_lease(bl, session->info, lstat);
dout(20) << "issue_client_lease no/null lease on " << *dn << dendl;
}
}
Expand Down Expand Up @@ -3819,7 +3816,22 @@ void Locker::revoke_client_leases(SimpleLock *lock)
}
}


void Locker::encode_lease(bufferlist& bl, const session_info_t& info,
const LeaseStat& ls)
{
if (info.has_feature(CEPHFS_FEATURE_REPLY_ENCODING)) {
ENCODE_START(1, 1, bl);
encode(ls.mask, bl);
encode(ls.duration_ms, bl);
encode(ls.seq, bl);
ENCODE_FINISH(bl);
}
else {
encode(ls.mask, bl);
encode(ls.duration_ms, bl);
encode(ls.seq, bl);
}
}

// locks ----------------------------------------------------------------

Expand Down
2 changes: 2 additions & 0 deletions src/mds/Locker.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class LocalLock;
#include "SimpleLock.h"
#include "MDSContext.h"
#include "Mutation.h"
#include "messages/MClientReply.h"

class Locker {
private:
Expand Down Expand Up @@ -287,6 +288,7 @@ class Locker {

void issue_client_lease(CDentry *dn, client_t client, bufferlist &bl, utime_t now, Session *session);
void revoke_client_leases(SimpleLock *lock);
static void encode_lease(bufferlist& bl, const session_info_t& info, const LeaseStat& ls);
};


Expand Down
33 changes: 9 additions & 24 deletions src/mds/Server.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1658,27 +1658,6 @@ void Server::reply_client_request(MDRequestRef& mdr, MClientReply *reply)
}
}

void Server::encode_infinite_lease(bufferlist& bl)
{
LeaseStat e;
e.seq = 0;
e.mask = -1;
e.duration_ms = -1;
encode(e, bl);
dout(20) << "encode_infinite_lease " << e << dendl;
}

void Server::encode_null_lease(bufferlist& bl)
{
LeaseStat e;
e.seq = 0;
e.mask = 0;
e.duration_ms = 0;
encode(e, bl);
dout(20) << "encode_null_lease " << e << dendl;
}


/*
* pass inode OR dentry (not both, or we may get confused)
*
Expand Down Expand Up @@ -1744,8 +1723,11 @@ void Server::set_trace_dist(Session *session, MClientReply *reply,
encode(dn->get_name(), bl);
if (snapid == CEPH_NOSNAP)
mds->locker->issue_client_lease(dn, client, bl, now, session);
else
encode_null_lease(bl);
else {
//null lease
LeaseStat e;
mds->locker->encode_lease(bl, session->info, e);
}
dout(20) << "set_trace_dist added dn " << snapid << " " << *dn << dendl;
} else
reply->head.is_dentry = 0;
Expand Down Expand Up @@ -9162,7 +9144,10 @@ void Server::handle_client_lssnap(MDRequestRef& mdr)
break;

encode(snap_name, dnbl);
encode_infinite_lease(dnbl);
//infinite lease
LeaseStat e(-1, -1, 0);
mds->locker->encode_lease(dnbl, mdr->session->info, e);
dout(20) << "encode_infinite_lease" << dendl;

int r = diri->encode_inodestat(dnbl, mdr->session, realm, p->first, max_bytes - (int)dnbl.length());
if (r < 0) {
Expand Down
2 changes: 0 additions & 2 deletions src/mds/Server.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,6 @@ class Server {
int num_dentries_wanted,
MDRequestRef& mdr);

void encode_infinite_lease(bufferlist& bl);
void encode_null_lease(bufferlist& bl);

void handle_slave_request(MMDSSlaveRequest *m);
void handle_slave_request_reply(MMDSSlaveRequest *m);
Expand Down
25 changes: 14 additions & 11 deletions src/messages/MClientReply.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,21 +52,24 @@ struct LeaseStat {
__u32 seq;

LeaseStat() : mask(0), duration_ms(0), seq(0) {}
LeaseStat(__u16 msk, __u32 dur, __u32 sq) : mask{msk}, duration_ms{dur}, seq{sq} {}

void encode(bufferlist &bl) const {
using ceph::encode;
encode(mask, bl);
encode(duration_ms, bl);
encode(seq, bl);
}
void decode(bufferlist::const_iterator &bl) {
void decode(bufferlist::const_iterator &bl, const uint64_t features) {
using ceph::decode;
decode(mask, bl);
decode(duration_ms, bl);
decode(seq, bl);
if (features == (uint64_t)-1) {
DECODE_START(1, bl);
decode(mask, bl);
decode(duration_ms, bl);
decode(seq, bl);
DECODE_FINISH(bl);
}
else {
decode(mask, bl);
decode(duration_ms, bl);
decode(seq, bl);
}
}
};
WRITE_CLASS_ENCODER(LeaseStat)

inline ostream& operator<<(ostream& out, const LeaseStat& l) {
return out << "lease(mask " << l.mask << " dur " << l.duration_ms << ")";
Expand Down

0 comments on commit 2de7e88

Please sign in to comment.