]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
dirty performance hack to streamline single-block appends
authorsageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Sat, 29 Sep 2007 00:17:34 +0000 (00:17 +0000)
committersageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Sat, 29 Sep 2007 00:17:34 +0000 (00:17 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1867 29311d96-e01e-0410-9327-a35deaab8ce9

trunk/ceph/ebofs/BufferCache.cc
trunk/ceph/ebofs/Onode.h

index 837c67f132e4342865e2849f54d452b10b5f0b84..b1c98455f827891545b2d2c292dc0abce261f7c6 100644 (file)
@@ -428,7 +428,19 @@ int ObjectCache::map_write(block_t start, block_t len,
                            map<block_t, BufferHead*>& hits,
                            version_t super_epoch)
 {
-  map<block_t, BufferHead*>::iterator p = data.lower_bound(start);
+  map<block_t, BufferHead*>::iterator p;
+
+  // hack speed up common cases
+  if (start == 0) {
+    p = data.begin();
+  } else if (start + len == on->object_blocks && len == 1 && !data.empty()) {
+    // append hack.
+    p = data.end();
+    p--;
+    if (p->first < start) p++;
+  } else {
+    p = data.lower_bound(start);  
+  }
 
   dout(10) << "map_write " << *on << " " << start << "~" << len << dendl;
   // p->first >= start
index 16cd3e17f9bc5ca268b7a1d6ff4dc3bbd6b312f6..1d79d317dd96a0acb426b9530ffeebadfbe3b54d 100644 (file)
@@ -67,7 +67,8 @@ public:
  public:
   Onode(object_t oid) : ref(0), object_id(oid), version(0),
                        readonly(false),
-                       object_size(0), object_blocks(0), oc(0),
+                       object_size(0), object_blocks(0),
+                       oc(0),
                        dirty(false), dangling(false), deleted(false) { 
     onode_loc.length = 0;
   }
@@ -239,7 +240,23 @@ public:
 
     //assert(start+len <= object_blocks);
 
-    map<block_t,Extent>::iterator p = extent_map.lower_bound(start);
+    map<block_t,Extent>::iterator p;
+    
+    // hack hack speed up common cases!
+    if (start == 0) {
+      p = extent_map.begin();
+    } else if (start+len == object_blocks && len == 1 && !extent_map.empty()) {
+      // append hack.
+      p = extent_map.end();
+      p--;
+      if (p->first < start) p++;
+      //while (p->first >= start) p--;
+      //p++;
+    } else {
+      // normal
+      p = extent_map.lower_bound(start);
+    }
+
     if (p != extent_map.begin() &&
         (p == extent_map.end() || p->first > start && p->first)) {
       p--;