]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
reconnect getting closer
authorSage Weil <sage@newdream.net>
Wed, 16 Jan 2008 20:10:00 +0000 (12:10 -0800)
committerSage Weil <sage@newdream.net>
Wed, 16 Jan 2008 21:02:34 +0000 (13:02 -0800)
src/kernel/mds_client.c
src/kernel/messenger.c
src/kernel/messenger.h
src/messages/MClientReconnect.h

index c0c5a818b5f6b82ed9b8f12d6bf1afb81316293a..97febba60558624ee9c5b41804f7dcb52d8f234b 100644 (file)
@@ -722,14 +722,17 @@ void send_mds_reconnect(struct ceph_mds_client *mdsc, int mds)
                reply = ceph_msg_new(CEPH_MSG_CLIENT_RECONNECT, len, 0, 0, 0);
                if (IS_ERR(reply))
                        return;
-               *(__u32*)reply->front.iov_base = 0;
-               *(__u8*)(reply->front.iov_base + 4) = 1; /* session was closed */
+               p = reply->front.iov_base;
+               end = p + len;
+               ceph_encode_8(&p, end, 1); /* session was closed */
+               ceph_encode_32(&p, end, 0);
                goto send;
        }
 
        /* estimate needed space */
        len += session->s_nr_caps * sizeof(struct ceph_mds_cap_reconnect);
        len += session->s_nr_caps * (100); /* ugly hack */
+       dout(40, "estimating i need %d bytes for %d caps\n", len, session->s_nr_caps);
 
        /* build reply */
        reply = ceph_msg_new(CEPH_MSG_CLIENT_RECONNECT, len, 0, 0, 0);
@@ -739,9 +742,11 @@ void send_mds_reconnect(struct ceph_mds_client *mdsc, int mds)
        end = p + len;
 
        /* traverse this session's caps */
+       ceph_encode_8(&p, end, 0);
        ceph_encode_32(&p, end, session->s_nr_caps);
        list_for_each(cp, &session->s_caps) {
                cap = list_entry(cp, struct ceph_inode_cap, session_caps);
+               dout(10, " adding cap %p on ino %lx\n", cap, cap->ci->vfs_inode.i_ino);
                ceph_encode_32(&p, end, ceph_caps_wanted(cap->ci));
                ceph_encode_32(&p, end, ceph_caps_issued(cap->ci));
                ceph_encode_64(&p, end, cap->ci->i_wr_size);
@@ -769,8 +774,10 @@ void send_mds_reconnect(struct ceph_mds_client *mdsc, int mds)
                ceph_encode_string(&p, end, path, pathlen);             
                kfree(path);
        }
-       ceph_encode_8(&p, end, 0);
-       reply->front.iov_len = end-p;
+
+       len = p - reply->front.iov_base;
+       reply->hdr.front_len = reply->front.iov_len = len;
+       dout(10, "final len is %d\n", len);
        
 send:
        send_msg_mds(mdsc, reply, mds);
index f9ff0f1f6e96fe1df6faaf1314076e89c87393f1..eaf0adad18cc668678b9d54be807b536417ac33a 100644 (file)
@@ -305,12 +305,13 @@ static int write_partial_kvec(struct ceph_connection *con)
 {
        int ret;
 
-       dout(30, "write_partial_kvec %p left %d vec %d bytes\n", con, 
+       dout(30, "write_partial_kvec %p : %d vec, %d bytes left\n", con, 
             con->out_kvec_left, con->out_kvec_bytes);
        while (con->out_kvec_bytes > 0) {
                ret = ceph_tcp_sendmsg(con->sock, con->out_kvec_cur, 
                                       con->out_kvec_left, con->out_kvec_bytes);
                if (ret <= 0) goto out;
+               dout(30, "write_partial_kvec %p : wrote %d\n", con, ret);
                con->out_kvec_bytes -= ret;
                if (con->out_kvec_bytes == 0)
                        break;            /* done */
@@ -377,6 +378,7 @@ static void prepare_write_message(struct ceph_connection *con)
 
        dout(20, "prepare_write_message %p seq %d type %d len %d+%d\n", 
             m, m->hdr.seq, m->hdr.type, m->hdr.front_len, m->hdr.data_len);
+       BUG_ON(m->hdr.front_len != m->front.iov_len);
 
        /* tag + hdr + front */
        con->out_kvec[0].iov_base = &tag_msg;
index 8715544daa88347118e75dd749d4da0347d94c3f..f47c70344829d57e41b9fa8945e6b99621df8bcd 100644 (file)
@@ -245,7 +245,7 @@ static __inline__ int ceph_encode_16(void **p, void *end, __u16 v) {
 }
 
 static __inline__ int ceph_encode_8(void **p, void *end, __u8 v) {
-       BUG_ON(*p < end);
+       BUG_ON(*p >= end);
        *(__u8*)*p = v;
        (*p)++;
        return 0;
index 32f9612a8714b79788cc33102bbede74e4bb611d..66efb64a6e2c26e9bdf916c1e271b233c6433e17 100644 (file)
@@ -43,6 +43,7 @@ public:
 
   void encode_payload() {
     __u32 n = inode_caps.size();
+    ::_encode_simple(closed, payload);
     ::_encode_simple(n, payload);
     for (map<inodeno_t, inode_caps_reconnect_t>::iterator p = inode_caps.begin();
         p != inode_caps.end();
@@ -51,10 +52,10 @@ public:
       ::_encode_simple(p->second, payload);
       ::_encode_simple(inode_path[p->first], payload);
     }
-    ::_encode(closed, payload);
   }
   void decode_payload() {
     bufferlist::iterator p = payload.begin();
+    ::_decode_simple(closed, p);
     __u32 n;
     ::_decode_simple(n, p);
     while (n--) {
@@ -63,7 +64,6 @@ public:
       ::_decode_simple(inode_caps[ino], p);
       ::_decode_simple(inode_path[ino], p);
     }
-    ::_decode_simple(closed, p);
   }
 
 };