]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: honour allow-eio flag during read
authorxie xingguo <xie.xingguo@zte.com.cn>
Sat, 3 Sep 2016 08:49:29 +0000 (16:49 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Sat, 3 Sep 2016 08:56:17 +0000 (16:56 +0800)
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/os/bluestore/BlueStore.cc
src/os/bluestore/bluestore_types.h

index dbdec0b75cfec2bf5819766dba73852d4f00603e..565bf0b0a032532eac6c612fdff7351c7cd6bb30 100644 (file)
@@ -3694,6 +3694,7 @@ int BlueStore::read(
   }
 
  out:
+  assert(allow_eio || r != -EIO);
   c->cache->trim(
     g_conf->bluestore_onode_cache_size,
     g_conf->bluestore_buffer_cache_size);
@@ -3844,14 +3845,19 @@ int BlueStore::_do_read(
     if (bptr->get_blob().has_flag(bluestore_blob_t::FLAG_COMPRESSED)) {
       bufferlist compressed_bl, raw_bl;
       IOContext ioc(NULL);   // FIXME?
-      bptr->get_blob().map(
+      r = bptr->get_blob().map(
        0, bptr->get_blob().get_ondisk_length(),
        [&](uint64_t offset, uint64_t length) {
          bufferlist t;
          int r = bdev->read(offset, length, &t, &ioc, false);
-         assert(r == 0);
+         if (r < 0)
+            return r;
          compressed_bl.claim_append(t);
+          return 0;
        });
+      if (r < 0)
+        return r;
+
       if (_verify_csum(o, &bptr->get_blob(), 0, compressed_bl) < 0) {
        return -EIO;
       }
@@ -3890,14 +3896,19 @@ int BlueStore::_do_read(
        // read it
        IOContext ioc(NULL);  // FIXME?
        bufferlist bl;
-       bptr->get_blob().map(r_off, r_len,
+       r = bptr->get_blob().map(r_off, r_len,
                             [&](uint64_t offset, uint64_t length) {
            bufferlist t;
            int r = bdev->read(offset, length, &t, &ioc, false);
-           assert(r == 0);
+           if (r < 0)
+              return r;
            bl.claim_append(t);
+            return 0;
          });
-       int r = _verify_csum(o, &bptr->get_blob(), r_off, bl);
+        if (r < 0)
+          return r;
+
+       r = _verify_csum(o, &bptr->get_blob(), r_off, bl);
        if (r < 0) {
          return -EIO;
        }
@@ -3955,12 +3966,14 @@ int BlueStore::_verify_csum(OnodeRef& o,
   if (r < 0) {
     if (r == -1) {
       vector<bluestore_pextent_t> pex;
-      blob->map(
+      int r = blob->map(
        bad,
        blob->get_csum_chunk_size(),
        [&](uint64_t offset, uint64_t length) {
          pex.emplace_back(bluestore_pextent_t(offset, length));
+          return 0;
        });
+      assert(r == 0);
       derr << __func__ << " bad " << blob->get_csum_type_string(blob->csum_type)
           << "/0x" << std::hex << blob->get_csum_chunk_size()
           << " checksum at blob offset 0x" << bad
@@ -6164,11 +6177,13 @@ void BlueStore::_do_write_small(
       _buffer_cache_write(txc, b, b_off, padded,
                          wctx->buffered ? 0 : Buffer::FLAG_NOCACHE);
 
-      b->get_blob().map(
+      int r = b->get_blob().map(
        b_off, b_len,
        [&](uint64_t offset, uint64_t length) {
          op->extents.emplace_back(bluestore_pextent_t(offset, length));
+          return 0;
        });
+      assert(r == 0);
       if (b->get_blob().csum_type) {
        txc->add_deferred_csum(o, blob, b_off, padded);
       }
index 5308efcab38fbf12e923637f6bea27be953c7b78..ea227192ab7bfe8effa1ccce7cf3366600501c37 100644 (file)
@@ -458,8 +458,8 @@ struct bluestore_blob_t {
                uint64_t offset, uint64_t length,  uint64_t min_alloc_size,
                vector<bluestore_pextent_t> *r);
 
-  void map(uint64_t x_off, uint64_t x_len,
-          std::function<void(uint64_t,uint64_t)> f) const {
+  int map(uint64_t x_off, uint64_t x_len,
+          std::function<int(uint64_t,uint64_t)> f) const {
     auto p = extents.begin();
     assert(p != extents.end());
     while (x_off >= p->length) {
@@ -470,11 +470,14 @@ struct bluestore_blob_t {
     while (x_len > 0) {
       assert(p != extents.end());
       uint64_t l = MIN(p->length - x_off, x_len);
-      f(p->offset + x_off, l);
+      int r = f(p->offset + x_off, l);
+      if (r < 0)
+        return r;
       x_off = 0;
       x_len -= l;
       ++p;
     }
+    return 0;
   }
   void map_bl(uint64_t x_off,
              bufferlist& bl,