From 0759800318166bf4fe5d84faa3ff63750739ae8c Mon Sep 17 00:00:00 2001 From: sageweil Date: Mon, 30 Jul 2007 19:03:00 +0000 Subject: [PATCH] allow multiclient nodes to mount git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1566 29311d96-e01e-0410-9327-a35deaab8ce9 --- trunk/ceph/client/Client.cc | 8 ++++++-- trunk/ceph/client/Client.h | 1 + trunk/ceph/messages/MClientMount.h | 7 +++++-- trunk/ceph/mon/ClientMonitor.cc | 4 +++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/trunk/ceph/client/Client.cc b/trunk/ceph/client/Client.cc index 5c28abf590610..7b3db74d09f3a 100644 --- a/trunk/ceph/client/Client.cc +++ b/trunk/ceph/client/Client.cc @@ -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 diff --git a/trunk/ceph/client/Client.h b/trunk/ceph/client/Client.h index 457efca53ef2d..71bd58df1d53b 100644 --- a/trunk/ceph/client/Client.h +++ b/trunk/ceph/client/Client.h @@ -387,6 +387,7 @@ class Client : public Dispatcher { bool mounted; bool unmounting; Cond mount_cond; + int client_instance_this_process; int unsafe_sync_write; public: diff --git a/trunk/ceph/messages/MClientMount.h b/trunk/ceph/messages/MClientMount.h index d083d72833830..78bff7b2154fa 100644 --- a/trunk/ceph/messages/MClientMount.h +++ b/trunk/ceph/messages/MClientMount.h @@ -20,20 +20,23 @@ 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); } }; diff --git a/trunk/ceph/mon/ClientMonitor.cc b/trunk/ceph/mon/ClientMonitor.cc index 405759c8b1557..7b3a8917c1e16 100644 --- a/trunk/ceph/mon/ClientMonitor.cc +++ b/trunk/ceph/mon/ClientMonitor.cc @@ -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); -- 2.39.5