]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: fixed some bugs in messenger shutdown
authorSage Weil <sage@newdream.net>
Thu, 1 May 2008 02:34:45 +0000 (19:34 -0700)
committerSage Weil <sage@newdream.net>
Thu, 1 May 2008 02:34:45 +0000 (19:34 -0700)
src/config.cc
src/kernel/ktcp.c
src/kernel/ktcp.h
src/kernel/mds_client.c
src/kernel/messenger.c

index 0c33aa68da34357dfef488c001df54c187443935..7627bde52e5cd213b4bfb6cf81d01a9e4e3b6bde 100644 (file)
@@ -283,9 +283,9 @@ md_config_t g_conf = {
   mds_beacon_interval: 4, //30.0,
   mds_beacon_grace: 15, //60*60.0,
 
-  mds_cap_timeout: 100,        // cap bits time out if client idle
+  mds_cap_timeout: 100,       // cap bits time out if client idle
   mds_session_autoclose: 300, // autoclose idle session 
-  mds_client_lease: 30,
+  mds_client_lease: 100,
 
   mds_tick_interval: 5,
 
index 5220025ba0d20bb7ee770d32ef233baebf501da1..5698196501023b80b89e47d1f275ee6caaccf573 100644 (file)
@@ -107,7 +107,7 @@ static void set_sock_callbacks(struct socket *sock, struct ceph_connection *con)
        sk->sk_state_change = ceph_state_change;
 }
 
-void ceph_sock_release(struct socket *sock)
+void ceph_cancel_sock_callbacks(struct socket *sock)
 {
        struct sock *sk;
        if (!sock)
@@ -117,6 +117,10 @@ void ceph_sock_release(struct socket *sock)
        sk->sk_data_ready = 0;
        sk->sk_write_space = 0;
        sk->sk_state_change = 0;
+}
+void ceph_sock_release(struct socket *sock)
+{
+       ceph_cancel_sock_callbacks(sock);
        sock_release(sock);
 }
 
index a783a6e8a385acc00fc17527f8d29d828f5ea777..ff5115311c41a6092f1c6ee01a1004fe782da2bb 100644 (file)
@@ -10,6 +10,7 @@ int ceph_tcp_listen(struct ceph_messenger *);
 int ceph_tcp_accept(struct socket *, struct ceph_connection *);
 int ceph_tcp_recvmsg(struct socket *, void *, size_t );
 int ceph_tcp_sendmsg(struct socket *, struct kvec *, size_t, size_t, int more);
+void ceph_cancel_sock_callbacks(struct socket *);
 void ceph_sock_release(struct socket *);
 int ceph_workqueue_init(void);
 void ceph_workqueue_shutdown(void);
index 4aa398bda70819d4ebc6aaff2cb984c442821817..91ebeb26561bd026275dc850c932c444f8d0e230 100644 (file)
@@ -1553,6 +1553,7 @@ static void flush_write_caps(struct ceph_mds_client *mdsc,
                }
                used = __ceph_caps_used(cap->ci);
                wanted = __ceph_caps_wanted(cap->ci);
+               /* FIXME: this drops s_mutex, which we dont want, ugh */
                __ceph_mdsc_send_cap(mdsc, session, cap, used, wanted, 0);
        }
 }
index 1ce8b8a8b4a3ff58e3837ce735c3e570a2ef18ef..521911e6ead2c2b90442474487e61490a673d51a 100644 (file)
@@ -1325,7 +1325,15 @@ void ceph_messenger_destroy(struct ceph_messenger *msgr)
 {
        struct ceph_connection *con;
 
+       ceph_debug_msgr = 50;
+       ceph_debug_console = 1;
+
        dout(2, "destroy %p\n", msgr);
+       
+       /* stop listener */
+       ceph_cancel_sock_callbacks(msgr->listen_sock);
+       cancel_work_sync(&msgr->awork);
+       ceph_sock_release(msgr->listen_sock);
 
        /* kill off connections */
        spin_lock(&msgr->con_lock);
@@ -1339,21 +1347,22 @@ void ceph_messenger_destroy(struct ceph_messenger *msgr)
                
                /* in case there's queued work... */
                spin_unlock(&msgr->con_lock);
+               ceph_cancel_sock_callbacks(con->sock);
                cancel_work_sync(&con->rwork);
                cancel_delayed_work_sync(&con->swork);
                put_connection(con);
+               dout(10, "destroy removed connection %p\n", con);
+
                spin_lock(&msgr->con_lock);
        }
        spin_unlock(&msgr->con_lock);
 
-       /* stop listener */
-       ceph_sock_release(msgr->listen_sock);
-       cancel_work_sync(&msgr->awork);
-
        kunmap(msgr->zero_page);
        __free_page(msgr->zero_page);
 
        kfree(msgr);
+
+       dout(10, "destroyed messenger %p\n", msgr);
 }
 
 /*