From: Sage Weil Date: Tue, 8 Jul 2008 17:39:22 +0000 (-0700) Subject: client: align readahead with object boundaries X-Git-Tag: v0.3~21 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=177bd066370d37259af48229132b1c93a8e38e8e;p=ceph.git client: align readahead with object boundaries --- diff --git a/src/client/Client.cc b/src/client/Client.cc index a3f31f137ff..8ca0c0f0339 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3128,10 +3128,18 @@ int Client::_read(Fh *f, __s64 offset, __u64 size, bufferlist *bl) // readahead? if (f->nr_consec_read) { loff_t l = f->consec_read_bytes * 2; - l = MAX(l, g_conf.client_readahead_min); - l = MIN(l, MIN(g_conf.client_readahead_max_bytes, - g_conf.client_readahead_max_periods - * ceph_file_layout_period(in->inode.layout))); + if (g_conf.client_readahead_min) + l = MAX(l, g_conf.client_readahead_min); + if (g_conf.client_readahead_max_bytes) + l = MIN(l, g_conf.client_readahead_max_bytes); + loff_t p = ceph_file_layout_period(in->inode.layout); + if (g_conf.client_readahead_max_periods) + l = MIN(l, g_conf.client_readahead_max_periods * p); + if (l >= 2*p) { + // align with object_size + l -= (offset+l) % in->inode.layout.fl_object_size; + } + dout(10) << "readahead " << f->nr_consec_read << " reads " << f->consec_read_bytes << " bytes ... readahead " << offset << "~" << l << " (caller wants " << offset << "~" << size << ")" << dendl;