]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: factor hobject key into child pgid calc during split
authorSage Weil <sage@newdream.net>
Mon, 20 Feb 2012 22:12:16 +0000 (14:12 -0800)
committerSage Weil <sage@newdream.net>
Mon, 27 Feb 2012 19:44:24 +0000 (11:44 -0800)
When we calculate the object's new pg, take the locator key into
consideration, to avoid a crash like

osd/OSD.cc: In function 'void OSD::split_pg(PG*, std::map<pg_t, PG*>&,ObjectStore::Transaction&)' thread 7fe3df8c4700 time 2012-02-20 18:22:19.900886
osd/OSD.cc: 4066: FAILED assert(child)

Signed-off-by: Sage Weil <sage@newdream.net>
src/osd/OSD.cc

index 99d41bba5d85503f72df19544057c0cefa859854..84abf08d534e3822f45938281bf34ec94941758a 100644 (file)
@@ -4117,8 +4117,11 @@ void OSD::split_pg(PG *parent, map<pg_t,PG*>& children, ObjectStore::Transaction
 
   for (vector<hobject_t>::iterator p = olist.begin(); p != olist.end(); p++) {
     hobject_t poid = *p;
-    ceph_object_layout l = osdmap->make_object_layout(poid.oid, parentid.pool(), parentid.preferred());
-    pg_t pgid = osdmap->raw_pg_to_pg(pg_t(l.ol_pgid));
+    object_locator_t oloc(parentid.pool(), parentid.preferred());
+    if (poid.get_key().size())
+      oloc.key = poid.get_key();
+    pg_t rawpg = osdmap->object_locator_to_pg(poid.oid, oloc);
+    pg_t pgid = osdmap->raw_pg_to_pg(rawpg);
     if (pgid != parentid) {
       dout(20) << "  moving " << poid << " from " << parentid << " -> " << pgid << dendl;
       PG *child = children[pgid];