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
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;
}
//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--;