diff options
author | Samuel Just <sam.just@inktank.com> | 2013-05-08 11:14:11 -0700 |
---|---|---|
committer | Samuel Just <sam.just@inktank.com> | 2013-05-08 11:14:11 -0700 |
commit | 61354b21d37eae394534103914565f2162672b5f (patch) | |
tree | 5e9552875ed1a387dadd99efb509fa94e64bad74 | |
parent | 393c9372f82ef37fc6497dd46fc453507a463d42 (diff) | |
parent | 8e89db89cb36a217fd97cbc1f24fd643b62400dc (diff) | |
download | ceph-61354b21d37eae394534103914565f2162672b5f.tar.gz |
Merge branch 'wip_split_upgrade' into next
Fixes: #4927
-rw-r--r-- | src/osd/OSD.cc | 40 | ||||
-rw-r--r-- | src/osd/PG.cc | 1 |
2 files changed, 24 insertions, 17 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 690bce68787..d27a3b51a3c 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1775,8 +1775,29 @@ void OSD::load_pgs() dout(10) << "PG " << pg->info.pgid << " must upgrade..." << dendl; pg->upgrade(store, i->second); - } else { - assert(i->second.empty()); + } else if (!i->second.empty()) { + // handle upgrade bug + for (interval_set<snapid_t>::iterator j = i->second.begin(); + j != i->second.end(); + ++j) { + for (snapid_t k = j.get_start(); + k != j.get_start() + j.get_len(); + ++k) { + assert(store->collection_empty(coll_t(pgid, k))); + ObjectStore::Transaction t; + t.remove_collection(coll_t(pgid, k)); + store->apply_transaction(t); + } + } + } + + if (!pg->snap_collections.empty()) { + pg->snap_collections.clear(); + pg->dirty_big_info = true; + pg->dirty_info = true; + ObjectStore::Transaction t; + pg->write_if_dirty(t); + store->apply_transaction(t); } service.init_splits_between(pg->info.pgid, pg->get_osdmap(), osdmap); @@ -4951,21 +4972,6 @@ void OSD::split_pgs( i->m_seed, coll_t::make_temp_coll(*i)); } - for (interval_set<snapid_t>::iterator k = parent->snap_collections.begin(); - k != parent->snap_collections.end(); - ++k) { - for (snapid_t j = k.get_start(); j < k.get_start() + k.get_len(); - ++j) { - rctx->transaction->create_collection( - coll_t(*i, j)); - rctx->transaction->split_collection( - coll_t(parent->info.pgid, j), - split_bits, - i->m_seed, - coll_t(*i, j)); - } - } - child->snap_collections = parent->snap_collections; parent->split_into( *i, child, diff --git a/src/osd/PG.cc b/src/osd/PG.cc index ae88be652da..f4ad633ab13 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2565,6 +2565,7 @@ void PG::upgrade(ObjectStore *store, const interval_set<snapid_t> &snapcolls) objects.clear(); } ObjectStore::Transaction t; + snap_collections.clear(); dirty_info = true; write_if_dirty(t); int r = store->apply_transaction(t); |