]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
merged r1561:1566 from trunk into branches/sage/mds
authorsageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Mon, 30 Jul 2007 19:04:51 +0000 (19:04 +0000)
committersageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Mon, 30 Jul 2007 19:04:51 +0000 (19:04 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1568 29311d96-e01e-0410-9327-a35deaab8ce9

branches/sage/mds/client/Client.cc
branches/sage/mds/client/Client.h
branches/sage/mds/messages/MClientMount.h
branches/sage/mds/mon/ClientMonitor.cc

index a4531a186c4e5b1d378aa729d4b2c47f1a6eac1a..d3ce1696b132d0cddd2a1be624de47b2d26f0720 100644 (file)
@@ -128,6 +128,9 @@ Client::Client(Messenger *m, MonMap *mm) : timer(client_lock)
   objecter->set_client_incarnation(0);  // client always 0, for now.
   objectcacher = new ObjectCacher(objecter, client_lock);
   filer = new Filer(objecter);
+
+  static int instance_this_process = 0;
+  client_instance_this_process = instance_this_process++;
 }
 
 
@@ -848,7 +851,7 @@ void Client::dispatch(Message *m)
 
   case MSG_OSD_MAP:
     objecter->handle_osd_map((class MOSDMap*)m);
-    mount_cond.Signal();
+    if (!mounted) mount_cond.Signal();
     break;
     
     // mounting and mds sessions
@@ -1305,7 +1308,8 @@ void Client::_try_mount()
   dout(10) << "_try_mount" << endl;
   int mon = monmap->pick_mon();
   dout(2) << "sending client_mount to mon" << mon << endl;
-  messenger->send_message(new MClientMount(messenger->get_myaddr()), 
+  messenger->send_message(new MClientMount(messenger->get_myaddr(),
+                                          client_instance_this_process), 
                          monmap->get_inst(mon));
 
   // schedule timeout
index 96c427a494c8c6240ac2346955e111367a390239..23b1c941390f85986798a1cfc214f5b1db8516f3 100644 (file)
@@ -409,6 +409,7 @@ class Client : public Dispatcher {
   bool   mounted;
   bool   unmounting;
   Cond   mount_cond;  
+  int client_instance_this_process;
 
   int    unsafe_sync_write;
 public:
index d083d72833830a885c62e74358bfd14ebe05076f..78bff7b2154fab78244bc7c1382fe48640f3f8cc 100644 (file)
 class MClientMount : public Message {
 public:
   entity_addr_t addr;
+  int instance;  // on this node
 
   MClientMount() : Message(MSG_CLIENT_MOUNT) { }
-  MClientMount(entity_addr_t a) : 
+  MClientMount(entity_addr_t a, int i = 0) : 
     Message(MSG_CLIENT_MOUNT),
-    addr(a) { }
+    addr(a), instance(i) { }
 
   char *get_type_name() { return "client_mount"; }
 
   void decode_payload() { 
     int off = 0;
     ::_decode(addr, payload, off);
+    ::_decode(instance, payload, off);
   }
   void encode_payload() { 
     ::_encode(addr, payload);
+    ::_encode(instance, payload);
   }
 };
 
index 405759c8b15572035e9e620218ff2276dda1ac27..7b3a8917c1e162c2e45d3876a2292b2dfe668296 100644 (file)
@@ -119,8 +119,10 @@ bool ClientMonitor::preprocess_query(Message *m)
   case MSG_CLIENT_MOUNT:
     {
       // already mounted?
+      MClientMount *mount = (MClientMount*)m;
       entity_addr_t addr = m->get_source_addr();
-      if (client_map.addr_client.count(addr)) {
+      if (mount->instance == 0 &&                  // only check for addr uniqueness if the client claims to be alone
+         client_map.addr_client.count(addr)) {
        int client = client_map.addr_client[addr];
        dout(7) << " client" << client << " already mounted" << endl;
        _mounted(client, (MClientMount*)m);