]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: allow dup lookups in anchorclient
authorSage Weil <sage@newdream.net>
Thu, 3 Jun 2010 16:17:13 +0000 (09:17 -0700)
committerSage Weil <sage@newdream.net>
Thu, 3 Jun 2010 16:17:13 +0000 (09:17 -0700)
It's not practical for callers to avoid dups, particularly since they may
be unaware of each other.  And it's trivial to support it here.

src/mds/AnchorClient.cc
src/mds/AnchorClient.h

index ae8fa1082250f7df4038f1a5f09cc509bdbd0c65..0116293f1df05f9fd56539e63858d6aca64a7e2b 100644 (file)
@@ -42,13 +42,11 @@ void AnchorClient::handle_query_result(class MMDSTableRequest *m)
 
   assert(pending_lookup.count(ino));
   ::decode(*pending_lookup[ino].trace, p);
-  Context *onfinish = pending_lookup[ino].onfinish;
+  list<Context*> onfinish;
+  onfinish.swap(pending_lookup[ino].onfinish);
   pending_lookup.erase(ino);
   
-  if (onfinish) {
-    onfinish->finish(0);
-    delete onfinish;
-  }
+  finish_contexts(onfinish);
 }
 
 void AnchorClient::resend_queries()
@@ -64,11 +62,14 @@ void AnchorClient::resend_queries()
 
 void AnchorClient::lookup(inodeno_t ino, vector<Anchor>& trace, Context *onfinish)
 {
-  assert(pending_lookup.count(ino) == 0);
+  bool isnew = (pending_lookup.count(ino) == 0);
   _pending_lookup& l = pending_lookup[ino];
-  l.onfinish = onfinish;
-  l.trace = &trace;
-  _lookup(ino);
+  if (onfinish)
+    l.onfinish.push_back(onfinish);
+  if (isnew) {
+    l.trace = &trace;
+    _lookup(ino);
+  }
 }
 
 void AnchorClient::_lookup(inodeno_t ino)
index 52ff13047754f47aad08c9cbed469eead0dc6c6f..51484e138b7861fa688aeefb555bca3c145e8316 100644 (file)
@@ -26,7 +26,7 @@ class AnchorClient : public MDSTableClient {
   // lookups
   struct _pending_lookup {
     vector<Anchor> *trace;
-    Context *onfinish;
+    list<Context*> onfinish;
   };
   map<inodeno_t, _pending_lookup> pending_lookup;