]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Merge branch 'librbd-cache-iohint' of git://github.com/majianpeng/ceph
authorJosh Durgin <jdurgin@redhat.com>
Sun, 1 Feb 2015 20:17:34 +0000 (21:17 +0100)
committerJosh Durgin <jdurgin@redhat.com>
Sun, 1 Feb 2015 20:30:57 +0000 (21:30 +0100)
Reviewed-by: Sage Weil <sage@redhat.com>
Reviewed-by: Josh Durgin <jdurgin@redhat.com>
Conflicts:
src/librbd/ImageCtx.cc
src/librbd/ImageCtx.h
src/osdc/ObjectCacher.cc
src/osdc/ObjectCacher.h

1  2 
src/librbd/ImageCtx.cc
src/librbd/ImageCtx.h
src/librbd/internal.cc
src/osdc/ObjectCacher.cc
src/osdc/ObjectCacher.h

index 0bd2372e111474dd20d85d66c1d475589e42e1ef,92da3194e2d6ef3e273e4f5726ba262de74f038c..f8649e28e611a25685631ecd579d41cb70dcdaff
@@@ -488,13 -485,12 +488,14 @@@ namespace librbd 
      return -ENOENT;
    }
  
 -  void ImageCtx::aio_read_from_cache(object_t o, bufferlist *bl, size_t len,
 -                                   uint64_t off, Context *onfinish, int fadvise_flags) {
 +  void ImageCtx::aio_read_from_cache(object_t o, uint64_t object_no,
 +                                   bufferlist *bl, size_t len,
-                                    uint64_t off, Context *onfinish) {
++                                   uint64_t off, Context *onfinish,
++                                   int fadvise_flags) {
      snap_lock.get_read();
-     ObjectCacher::OSDRead *rd = object_cacher->prepare_read(snap_id, bl, 0);
+     ObjectCacher::OSDRead *rd = object_cacher->prepare_read(snap_id, bl, fadvise_flags);
      snap_lock.put_read();
 -    ObjectExtent extent(o, 0 /* a lie */, off, len, 0);
 +    ObjectExtent extent(o, object_no, off, len, 0);
      extent.oloc.pool = data_ctx.get_id();
      extent.buffer_extents.push_back(make_pair(0, len));
      rd->extents.push_back(extent);
        onfinish->complete(r);
    }
  
 -  void ImageCtx::write_to_cache(object_t o, bufferlist& bl, size_t len,
 -                              uint64_t off, Context *onfinish, int fadvise_flags) {
 +  void ImageCtx::write_to_cache(object_t o, const bufferlist& bl, size_t len,
-                               uint64_t off, Context *onfinish) {
++                              uint64_t off, Context *onfinish,
++                              int fadvise_flags) {
      snap_lock.get_read();
      ObjectCacher::OSDWrite *wr = object_cacher->prepare_write(snapc, bl,
-                                                             utime_t(), 0);
+                                                             utime_t(), fadvise_flags);
      snap_lock.put_read();
      ObjectExtent extent(o, 0, off, len, 0);
      extent.oloc.pool = data_ctx.get_id();
      Cond cond;
      bool done;
      Context *onfinish = new C_SafeCond(&mylock, &cond, &done, &r);
-     aio_read_from_cache(o, object_no, bl, len, off, onfinish);
 -    aio_read_from_cache(o, bl, len, off, onfinish, 0);
++    aio_read_from_cache(o, object_no, bl, len, off, onfinish, 0);
      mylock.Lock();
      while (!done)
        cond.Wait(mylock);
index 16a46aaf13f5eecf12b2ba8eec1c068455078e06,df9c84988d83537971502fb4c61c0514d8d60472..5dd5b8adbf9f9724e05bae3f1ce9fd1dde03d912
@@@ -161,12 -155,11 +161,13 @@@ namespace librbd 
      uint64_t get_parent_snap_id(librados::snap_t in_snap_id) const;
      int get_parent_overlap(librados::snap_t in_snap_id,
                           uint64_t *overlap) const;
 -    void aio_read_from_cache(object_t o, bufferlist *bl, size_t len,
 -                           uint64_t off, Context *onfinish, int fadvise_flags);
 -    void write_to_cache(object_t o, bufferlist& bl, size_t len, uint64_t off,
 -                      Context *onfinish, int fadivse_flags);
 -    int read_from_cache(object_t o, bufferlist *bl, size_t len, uint64_t off);
 +    void aio_read_from_cache(object_t o, uint64_t object_no, bufferlist *bl,
-                            size_t len, uint64_t off, Context *onfinish);
++                           size_t len, uint64_t off, Context *onfinish,
++                           int fadvise_flags);
 +    void write_to_cache(object_t o, const bufferlist& bl, size_t len,
-                       uint64_t off, Context *onfinish);
++                      uint64_t off, Context *onfinish, int fadvise_flags);
 +    int read_from_cache(object_t o, uint64_t object_no, bufferlist *bl,
 +                      size_t len, uint64_t off);
      void user_flushed();
      void flush_cache_aio(Context *onfinish);
      int flush_cache();
index 64b95a9950b85c5467de2afa4b14c2adf69ff6cf,7cf63ae8eaa7ee39304c1a13ac06b5048542556a..c77e40646e833fecc91267f39456c0fd78e0d7e1
@@@ -3437,9 -3795,9 +3437,9 @@@ reprotect_and_return_err
  
          Context *req_comp = new C_RBD_Readahead(ictx, q->oid, q->offset, q->length);
          ictx->readahead.inc_pending();
 -        ictx->aio_read_from_cache(q->oid, NULL,
 +        ictx->aio_read_from_cache(q->oid, q->objectno, NULL,
                                    q->length, q->offset,
-                                   req_comp);
+                                   req_comp, 0);
        }
        }
        ictx->perfcounter->inc(l_librbd_readahead);
  
        if (ictx->object_cacher) {
          C_CacheRead *cache_comp = new C_CacheRead(req);
 -        ictx->aio_read_from_cache(q->oid, &req->data(),
 +        ictx->aio_read_from_cache(q->oid, q->objectno, &req->data(),
                                    q->length, q->offset,
-                                   cache_comp);
+                                   cache_comp, op_flags);
        } else {
          r = req->send();
          if (r == -ENOENT)
index ee79da733dd761db4a8577370d2658e94edecfd8,3ee61991c84690d1555489c4ef5fe87f02bc7465..70426b6437904474253ed3fc977c648a42c5b17f
@@@ -1046,8 -1064,9 +1068,9 @@@ int ObjectCacher::_readx(OSDRead *rd, O
  
      // get Object cache
      sobject_t soid(ex_it->oid, rd->snap);
 -    Object *o = get_object(soid, oset, ex_it->oloc, ex_it->truncate_size, oset->truncate_seq);
 +    Object *o = get_object(soid, ex_it->objectno, oset, ex_it->oloc, ex_it->truncate_size, oset->truncate_seq);
-     touch_ob(o);
+     if (external_call)
+       touch_ob(o);
  
      // does not exist and no hits?
      if (oset->return_enoent && !o->exists) {
index 3b6561b96af678c27fe1f99f6cc39e2a24fdd4c5,0c6e71cf92811f810aa5410fb290903b6614f7b6..880e6eb6b6dcf81e57b58add7b54c5d1b20d14f6
@@@ -70,13 -70,11 +70,13 @@@ class ObjectCacher 
      SnapContext snapc;
      bufferlist bl;
      utime_t mtime;
-     int flags;
+     int fadvise_flags;
 -    OSDWrite(const SnapContext& sc, bufferlist& b, utime_t mt, int f) : snapc(sc), bl(b), mtime(mt), fadvise_flags(f) {}
 +    OSDWrite(const SnapContext& sc, const bufferlist& b, utime_t mt, int f)
-       : snapc(sc), bl(b), mtime(mt), flags(f) {}
++      : snapc(sc), bl(b), mtime(mt), fadvise_flags(f) {}
    };
  
 -  OSDWrite *prepare_write(const SnapContext& sc, bufferlist &b, utime_t mt, int f) { 
 +  OSDWrite *prepare_write(const SnapContext& sc, const bufferlist &b,
 +                        utime_t mt, int f) { 
      return new OSDWrite(sc, b, mt, f); 
    }