]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: use C_SaferCond in _read_async
authordongdong tao <tdd21151186@gmail.com>
Sun, 7 Jan 2018 13:49:44 +0000 (21:49 +0800)
committerdongdong tao <tdd21151186@gmail.com>
Sat, 13 Jan 2018 09:38:49 +0000 (17:38 +0800)
Signed-off-by: dongdong tao <tdd21151186@gmail.com>
src/client/Client.cc

index 83b53d99fa7fb5db2dab9f2e496f80fd082fdcde..664953c8b150f9c986fed6ea300c03b79f49693f 100644 (file)
@@ -8894,26 +8894,16 @@ int Client::_read_async(Fh *f, uint64_t off, uint64_t len, bufferlist *bl)
                  << " max_periods=" << conf->client_readahead_max_periods << dendl;
 
   // read (and possibly block)
-  int r, rvalue = 0;
-  Mutex flock("Client::_read_async flock");
-  Cond cond;
-  bool done = false;
-  Context *onfinish = new C_SafeCond(&flock, &cond, &done, &rvalue);
+  int r = 0;
+  C_SaferCond onfinish("Client::_read_async flock");
   r = objectcacher->file_read(&in->oset, &in->layout, in->snapid,
-                             off, len, bl, 0, onfinish);
+                             off, len, bl, 0, &onfinish);
   if (r == 0) {
     get_cap_ref(in, CEPH_CAP_FILE_CACHE);
     client_lock.Unlock();
-    flock.Lock();
-    while (!done)
-      cond.Wait(flock);
-    flock.Unlock();
+    r = onfinish.wait();
     client_lock.Lock();
     put_cap_ref(in, CEPH_CAP_FILE_CACHE);
-    r = rvalue;
-  } else {
-    // it was cached.
-    delete onfinish;
   }
 
   if(f->readahead.get_min_readahead_size() > 0) {