#define CEPH_MDS_PROTOCOL 7 /* cluster internal */
#define CEPH_MON_PROTOCOL 4 /* cluster internal */
#define CEPH_OSDC_PROTOCOL 6 /* public/client */
-#define CEPH_MDSC_PROTOCOL 12 /* public/client */
+#define CEPH_MDSC_PROTOCOL 13 /* public/client */
#define CEPH_MONC_PROTOCOL 9 /* public/client */
struct ceph_mds_request_head {
ceph_tid_t tid, oldest_client_tid;
ceph_epoch_t mdsmap_epoch; /* on client */
- __le32 num_fwd;
__le32 retry_attempt; /* REQUEST_REPLAY if replay */
+ __le16 num_fwd;
+ __le16 num_dentries_wanted;
__le64 mds_wants_replica_in_dirino;
__le32 op;
__le32 caller_uid, caller_gid;
CInode *snapdiri = 0;
if (tracei || tracedn)
set_trace_dist(mdr->session, reply, tracei, tracedn, snapid, snapdiri, mdr,
- mdr->client_request->is_replay());
+ mdr->client_request->is_replay(),
+ mdr->client_request->get_num_dentries_wanted());
messenger->send_message(reply, client_inst);
Session *session = mdr->session;
bool did_early_reply = mdr->did_early_reply;
entity_inst_t client_inst = req->get_orig_source_inst();
+ int num_dentries_wanted = req->get_num_dentries_wanted();
mdcache->request_finish(mdr);
mdr = 0;
// send reply, with trace, and possible leases
if (!did_early_reply && // don't issue leases if we sent an earlier reply already
(tracei || tracedn))
- set_trace_dist(session, reply, tracei, tracedn, snapid, snapdiri, mdr, is_replay);
+ set_trace_dist(session, reply, tracei, tracedn, snapid, snapdiri, mdr, is_replay, num_dentries_wanted);
messenger->send_message(reply, client_inst);
}
*/
void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, CDentry *dn,
snapid_t snapid, CInode *snapdiri,
- MDRequest *mdr, bool is_replay)
+ MDRequest *mdr, bool is_replay, int num_dentries_wanted)
{
// inode, dentry, dir, ..., inode
bufferlist bl;
__u16 numi = 0, numdn = 0;
__s16 snapdirpos = -1;
- bool single_segment = g_conf.mds_short_reply_trace; // do a single segment: [inode, ] dentry, dir.
+ //bool single_segment = g_conf.mds_short_reply_trace; // do a single segment: [inode, ] dentry, dir.
// choose lease duration
utime_t now = g_clock.now();
dout(10) << "set_trace_dist snapdiri at pos " << snapdirpos << dendl;
}
- if (single_segment && numdn)
- goto done;
-
if (!dn) {
dn = in->get_projected_parent_dn();
if (dn && !dn->use_projected(client, mdr))
goto done;
dentry:
+ if (numdn >= num_dentries_wanted)
+ goto done;
+
dout(15) << "set_trace_dist " << *dn << dendl;
::encode(dn->get_name(), bl);
void reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei = 0, CDentry *tracedn = 0);
void set_trace_dist(Session *session, MClientReply *reply, CInode *in, CDentry *dn,
snapid_t snapid, CInode *snapdiri,
- MDRequest *mdr, bool is_replay);
+ MDRequest *mdr, bool is_replay, int num_dentries_wanted);
void encode_empty_dirstat(bufferlist& bl);
void encode_infinite_lease(bufferlist& bl);
void set_caller_gid(unsigned g) { head.caller_gid = g; }
void set_mds_wants_replica_in_dirino(inodeno_t dirino) {
head.mds_wants_replica_in_dirino = dirino; }
-
+ void set_num_dentries_wanted(int n) { head.num_dentries_wanted = n; }
+
tid_t get_tid() { return head.tid; }
tid_t get_oldest_client_tid() { return head.oldest_client_tid; }
int get_num_fwd() { return head.num_fwd; }
filepath& get_filepath2() { return path2; }
inodeno_t get_mds_wants_replica_in_dirino() {
- return inodeno_t(head.mds_wants_replica_in_dirino); }
+ return inodeno_t(head.mds_wants_replica_in_dirino);
+ }
+ int get_num_dentries_wanted() { return head.num_dentries_wanted; }
void decode_payload() {
bufferlist::iterator p = payload.begin();