]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: don't do readahead when m_readahead_pos reaching limit 4281/head
authorZhiqiang Wang <zhiqiang.wang@intel.com>
Tue, 7 Apr 2015 06:23:38 +0000 (14:23 +0800)
committerZhiqiang Wang <zhiqiang.wang@intel.com>
Tue, 7 Apr 2015 06:23:38 +0000 (14:23 +0800)
When m_readahead_pos reaches the limit, there's no need to call
_compute_readahead to calculate the readahead. Just return with no
readahead.

Signed-off-by: Zhiqiang Wang <zhiqiang.wang@intel.com>
src/common/Readahead.cc

index 77ab92eba4ff1facc0c124474f833cd018dd96f8..b1ee2e099c6f314100e249dea61fa69103757280 100644 (file)
@@ -30,6 +30,10 @@ Readahead::extent_t Readahead::update(const vector<extent_t>& extents, uint64_t
   for (vector<extent_t>::const_iterator p = extents.begin(); p != extents.end(); ++p) {
     _observe_read(p->first, p->second);
   }
+  if (m_readahead_pos >= limit) {
+    m_lock.Unlock();
+    return extent_t(0, 0);
+  }
   pair<uint64_t, uint64_t> extent = _compute_readahead(limit);
   m_lock.Unlock();
   return extent;
@@ -38,6 +42,10 @@ Readahead::extent_t Readahead::update(const vector<extent_t>& extents, uint64_t
 Readahead::extent_t Readahead::update(uint64_t offset, uint64_t length, uint64_t limit) {
   m_lock.Lock();
   _observe_read(offset, length);
+  if (m_readahead_pos >= limit) {
+    m_lock.Unlock();
+    return extent_t(0, 0);
+  }
   extent_t extent = _compute_readahead(limit);
   m_lock.Unlock();
   return extent;
@@ -52,6 +60,7 @@ void Readahead::_observe_read(uint64_t offset, uint64_t length) {
     m_consec_read_bytes = 0;
     m_readahead_trigger_pos = 0;
     m_readahead_size = 0;
+    m_readahead_pos = 0;
   }
   m_last_pos = offset + length;
 }