]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: align readahead with object boundaries
authorSage Weil <sage@newdream.net>
Tue, 8 Jul 2008 17:39:22 +0000 (10:39 -0700)
committerSage Weil <sage@newdream.net>
Tue, 8 Jul 2008 17:39:22 +0000 (10:39 -0700)
src/client/Client.cc

index a3f31f137ff1e918d51276eb969edfc786eba214..8ca0c0f0339f4d14fe631c0857d35d39e8e15e06 100644 (file)
@@ -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;