]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: require rd cap before checking size in Client::_read()
authorSage Weil <sage@newdream.net>
Tue, 4 Mar 2008 19:06:50 +0000 (11:06 -0800)
committerSage Weil <sage@newdream.net>
Tue, 4 Mar 2008 19:06:50 +0000 (11:06 -0800)
src/TODO
src/client/Client.cc
src/streamtest.cc

index de67e0a4f34c4fbfb1fec0f99501acc92309044e..1964dcfaf66e03ec5ce103bd19c34a328824cdbe 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -48,12 +48,14 @@ kernel client
   - send (+deliver!) unmount message
 
 osdmon
-- allow fresh replacement osds.  add osd_created in osdmap, probably
 - actually, MasterOSDMap?  and clean out OSDMap, parsing in kernel client, etc.
 - monitor needs to monitor some osds...
 - bootstrap crush map
 
 crush
+- rule naming
+ - would about a tuple of (type, minsize, maxsize, pool) for each rule?  then we'd do a 
+   quick 'search' to find the best rule given (pg_type, pg_size, pg_pool)...
 - xml import/export?
  - named storage "pools"?
  - generic rule definition
index c4a07d7bc551ffd829a752c961b0f487031e3cb2..6d84ba590fdd03ff02cbc48b7ec9e11be56ce0b7 100644 (file)
@@ -2901,7 +2901,15 @@ int Client::_read(Fh *f, off_t offset, off_t size, bufferlist *bl)
   }
 
   bool lazy = f->mode == FILE_MODE_LAZY;
-  
+
+  // wait for RD cap before checking size
+  while (!lazy && (in->file_caps() & CEPH_CAP_RD) == 0) {
+    dout(7) << " don't have read cap, waiting" << dendl;
+    Cond cond;
+    in->waitfor_read.push_back(&cond);
+    cond.Wait(client_lock);
+  }
+
   // determine whether read range overlaps with file
   // ...ONLY if we're doing async io
   if (!lazy && (in->file_caps() & (CEPH_CAP_WRBUFFER|CEPH_CAP_RDCACHE))) {
@@ -2932,29 +2940,9 @@ int Client::_read(Fh *f, off_t offset, off_t size, bufferlist *bl)
   if (g_conf.client_oc) {
     // object cache ON
     rvalue = r = in->fc.read(offset, size, *bl, client_lock);  // may block.
-
-    /*
-    if (in->inode.ino == 0x10000000075 && hackbuf) {
-      int s = MIN(size, bl->length());
-      char *v = bl->c_str();
-      for (int a=0; a<s; a++) 
-       if (v[a] != hackbuf[offset+a]) 
-         dout(1) << "** hackbuf differs from read value at offset " << a 
-                 << " hackbuf[a] = " << (int)hackbuf[a] << ", read got " << (int)v[a]
-                 << dendl;
-    }
-    */
-
   } else {
     // object cache OFF -- legacy inconsistent way.
 
-    // do we have read file cap?
-    while (!lazy && (in->file_caps() & CEPH_CAP_RD) == 0) {
-      dout(7) << " don't have read cap, waiting" << dendl;
-      Cond cond;
-      in->waitfor_read.push_back(&cond);
-      cond.Wait(client_lock);
-    }  
     // lazy cap?
     while (lazy && (in->file_caps() & CEPH_CAP_LAZYIO) == 0) {
       dout(7) << " don't have lazy cap, waiting" << dendl;
index 8ed72a14f4d13253173ed096dfad5002d50b2b34..0b7e30a9505f4041a80dc009f831bae37e7f96f2 100644 (file)
@@ -130,8 +130,8 @@ int main(int argc, const char **argv)
     if (now < next) {
       float s = next - now;
       s *= 1000 * 1000;  // s -> us
-      //cout << "sleeping for " << s << std::endl;
-      usleep(s);
+      //cout << "sleeping for " << s << " us" << std::endl;
+      usleep((int)s);
     }
   }