From 6a081888fd72f9e0675aaba453c9c1176372b348 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 20 Feb 2012 14:12:16 -0800 Subject: [PATCH] osd: factor hobject key into child pgid calc during split 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&,ObjectStore::Transaction&)' thread 7fe3df8c4700 time 2012-02-20 18:22:19.900886 osd/OSD.cc: 4066: FAILED assert(child) Signed-off-by: Sage Weil --- src/osd/OSD.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 99d41bba5d855..84abf08d534e3 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -4117,8 +4117,11 @@ void OSD::split_pg(PG *parent, map& children, ObjectStore::Transaction for (vector::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]; -- 2.39.5