* 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 <jcollin@redhat.com>
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;
dirst.decode(p, features);
dst.decode(p, features);
decode(dname, p);
- decode(dlease, p);
+ dlease.decode(p, features);
}
Inode *in = 0;
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;
}
}
}
}
-
+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 ----------------------------------------------------------------
#include "SimpleLock.h"
#include "MDSContext.h"
#include "Mutation.h"
+#include "messages/MClientReply.h"
class Locker {
private:
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);
};
}
}
-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)
*
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;
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) {
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);
__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 << ")";