From: sage Date: Sat, 2 Jul 2005 20:08:29 +0000 (+0000) Subject: filer fixes? X-Git-Tag: v0.1~1996 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=59d6cd989ac1b894a27f1208046b2a5fbe5638b9;p=ceph.git filer fixes? git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@385 29311d96-e01e-0410-9327-a35deaab8ce9 --- diff --git a/ceph/config.cc b/ceph/config.cc index 51ba1550e43..a98509ddaea 100644 --- a/ceph/config.cc +++ b/ceph/config.cc @@ -26,9 +26,9 @@ OSDFileLayout g_OSD_FileLayout( 1<<20, 1, 1<<20 ); // stripe files over whole OSDFileLayout g_OSD_MDDirLayout( 1<<14, 1<<2, 1<<19 ); // stripe mds log over 128 byte bits (see mds_log_pad_entry below to match!) -OSDFileLayout g_OSD_MDLogLayout( 1<<7, 32, 1<<20 ); +OSDFileLayout g_OSD_MDLogLayout( 1<<7, 32, 1<<20 ); // new (good?) way //OSDFileLayout g_OSD_MDLogLayout( 57, 32, 1<<20 ); // pathological case to test striping buffer mapping -//OSDFileLayout g_OSD_MDLogLayout( 1<<20, 1, 1<<20 ); +//OSDFileLayout g_OSD_MDLogLayout( 1<<20, 1, 1<<20 ); // old way md_config_t g_conf = { diff --git a/ceph/include/bufferlist.h b/ceph/include/bufferlist.h index 8c1596d2fb8..8785ed75a55 100644 --- a/ceph/include/bufferlist.h +++ b/ceph/include/bufferlist.h @@ -385,7 +385,7 @@ inline ostream& operator<<(ostream& out, bufferlist& bl) { // encoder/decode helpers // string -inline void _encode(string& s, bufferlist& bl) +inline void _encode(const string& s, bufferlist& bl) { bl.append(s.c_str(), s.length()+1); } diff --git a/ceph/osd/OSDMap.h b/ceph/osd/OSDMap.h index 74e9a22e7d2..7de72611eb4 100644 --- a/ceph/osd/OSDMap.h +++ b/ceph/osd/OSDMap.h @@ -88,7 +88,7 @@ class OSDExtent { object_t oid; // object id repgroup_t rg; // replica group size_t offset, len; // extent within the object - map extents_in_buffer; // off -> len. extents in buffer being mapped (may be fragmented bc of striping!) + map buffer_extents; // off -> len. extents in buffer being mapped (may be fragmented bc of striping!) OSDExtent() : osd(0), oid(0), rg(0), offset(0), len(0) { } }; @@ -251,7 +251,7 @@ class OSDCluster { list& extents) { /* we want only one extent per object! * this means that each extent we read may map into different bits of the - * final read buffer.. hence OSDExtent.extents_in_buffer + * final read buffer.. hence OSDExtent.buffer_extents */ map< object_t, OSDExtent > object_extents; @@ -302,7 +302,7 @@ class OSDCluster { ex->offset = x_offset; ex->len = x_len; } - ex->extents_in_buffer[cur-offset] = x_len; + ex->buffer_extents[cur-offset] = x_len; //cout << "map: ino " << ino << " oid " << ex.oid << " osd " << ex.osd << " offset " << ex.offset << " len " << ex.len << " ... left " << left << endl; diff --git a/ceph/osdc/Filer.cc b/ceph/osdc/Filer.cc index bebffdc094c..42819c555a8 100644 --- a/ceph/osdc/Filer.cc +++ b/ceph/osdc/Filer.cc @@ -102,7 +102,7 @@ Filer::read(inodeno_t ino, OSD_OP_READ); m->set_length(it->len); m->set_offset(it->offset); - dout(15) << " read on " << last_tid << " from oid " << it->oid << " off " << it->offset << " len " << it->len << " (" << it->extents_in_buffer.size() << " buffer bits)" << endl; + dout(15) << " read on " << last_tid << " from oid " << it->oid << " off " << it->offset << " len " << it->len << " (" << it->buffer_extents.size() << " buffer bits)" << endl; messenger->send_message(m, MSG_ADDR_OSD(it->osd), 0); // add to gather set @@ -152,7 +152,8 @@ Filer::handle_osd_read_reply(MOSDOpReply *m) // map extents back into buffer map by_off; // buffer offset -> bufferlist - + + // for each object extent for (list::iterator eit = p->extents.begin(); eit != p->extents.end(); eit++) { @@ -161,26 +162,32 @@ Filer::handle_osd_read_reply(MOSDOpReply *m) int ox_off = 0; assert(ox_len <= eit->len); - for (map::iterator bit = eit->extents_in_buffer.begin(); - bit != eit->extents_in_buffer.end(); + // for each buffer extent we're mapping into... + for (map::iterator bit = eit->buffer_extents.begin(); + bit != eit->buffer_extents.end(); bit++) { - dout(10) << "object " << eit->oid << " extent (...) : offset " << ox_off << " -> buffer " << bit->first << " len " << bit->second << endl; + dout(10) << "object " << eit->oid << " extent " << eit->offset << " len " << eit->len << " : ox offset " << ox_off << " -> buffer extent " << bit->first << " len " << bit->second << endl; by_off[bit->first] = new bufferlist; + if (ox_off + bit->second <= ox_len) { + // we got the whole bx by_off[bit->first]->substr_of(*ox_buf, ox_off, bit->second); if (p->bytes_read < bit->first + bit->second) p->bytes_read = bit->first + bit->second; - } else if (ox_off > ox_len) { + } else if (ox_off + bit->second > ox_len && ox_off < ox_len) { + // we got part of this bx by_off[bit->first]->substr_of(*ox_buf, ox_off, (ox_len-ox_off)); if (p->bytes_read < bit->first + ox_len-ox_off) p->bytes_read = bit->first + ox_len-ox_off; - // zero end bit + // zero end of bx + dout(10) << " adding some zeros to the end " << ox_off + bit->second-ox_len << endl; bufferptr z = new buffer(ox_off + bit->second - ox_len); memset(z.c_str(), 0, z.length()); by_off[bit->first]->append( z ); } else { - // zero whole bit + // we got none of this bx. zero whole thing. + dout(10) << " adding all zeros for this bit " << bit->second << endl; bufferptr z = new buffer(bit->second); memset(z.c_str(), 0, z.length()); by_off[bit->first]->append( z ); @@ -285,8 +292,8 @@ Filer::write(inodeno_t ino, // map buffer segments into this extent // (may be fragmented bc of striping) bufferlist cur; - for (map::iterator bit = it->extents_in_buffer.begin(); - bit != it->extents_in_buffer.end(); + for (map::iterator bit = it->buffer_extents.begin(); + bit != it->buffer_extents.end(); bit++) { bufferlist thisbit; thisbit.substr_of(bl, bit->first, bit->second);