Skip to content

Commit

Permalink
ceph: include time stamp in every MDS request
Browse files Browse the repository at this point in the history
We recently modified the client/MDS protocol to include a timestamp in the
client request.  This allows ctime updates to follow the client's clock
in most cases, which avoids subtle problems when clocks are out of sync
and timestamps are updated sometimes by the MDS clock (for most requests)
and sometimes by the client clock (for cap writeback).

Signed-off-by: Sage Weil <sage@inktank.com>
  • Loading branch information
Sage Weil authored and Yan, Zheng committed Jun 6, 2014
1 parent ffe312c commit b8e6906
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 1 deletion.
9 changes: 8 additions & 1 deletion fs/ceph/mds_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -1558,6 +1558,8 @@ ceph_mdsc_create_request(struct ceph_mds_client *mdsc, int op, int mode)
init_completion(&req->r_safe_completion);
INIT_LIST_HEAD(&req->r_unsafe_item);

req->r_stamp = CURRENT_TIME;

req->r_op = op;
req->r_direct_mode = mode;
return req;
Expand Down Expand Up @@ -1783,7 +1785,8 @@ static struct ceph_msg *create_request_message(struct ceph_mds_client *mdsc,
}

len = sizeof(*head) +
pathlen1 + pathlen2 + 2*(1 + sizeof(u32) + sizeof(u64));
pathlen1 + pathlen2 + 2*(1 + sizeof(u32) + sizeof(u64)) +
sizeof(struct timespec);

/* calculate (max) length for cap releases */
len += sizeof(struct ceph_mds_request_release) *
Expand All @@ -1800,6 +1803,7 @@ static struct ceph_msg *create_request_message(struct ceph_mds_client *mdsc,
goto out_free2;
}

msg->hdr.version = 2;
msg->hdr.tid = cpu_to_le64(req->r_tid);

head = msg->front.iov_base;
Expand Down Expand Up @@ -1836,6 +1840,9 @@ static struct ceph_msg *create_request_message(struct ceph_mds_client *mdsc,
mds, req->r_old_inode_drop, req->r_old_inode_unless, 0);
head->num_releases = cpu_to_le16(releases);

/* time stamp */
ceph_encode_copy(&p, &req->r_stamp, sizeof(req->r_stamp));

BUG_ON(p > end);
msg->front.iov_len = p - msg->front.iov_base;
msg->hdr.front_len = cpu_to_le32(msg->front.iov_len);
Expand Down
1 change: 1 addition & 0 deletions fs/ceph/mds_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ struct ceph_mds_request {
int r_fmode; /* file mode, if expecting cap */
kuid_t r_uid;
kgid_t r_gid;
struct timespec r_stamp;

/* for choosing which mds to send this request to */
int r_direct_mode;
Expand Down

0 comments on commit b8e6906

Please sign in to comment.