mirror of
https://github.com/ceph/ceph
synced 2025-03-11 02:39:05 +00:00
ceph-objectstore-tool: update-mon-db: do not fail if incmap is missing
there is chance that we could use an OSD which does not have incmap of a certain epoch for rebuilding the monstore. and since OSD does not read and store the incmap if the MOSDMap message already has the fullmap of that fullmap, and if an OSD does not have previous fullmap, monitor will just send it the fullmao. so it's not unusual that an OSD has a fullmap of some epoch without corresponding incmap. Fixes: https://tracker.ceph.com/issues/41177 Signed-off-by: Kefu Chai <kchai@redhat.com>
This commit is contained in:
parent
801d2f0449
commit
2e2414b3df
@ -244,13 +244,13 @@ int update_osdmap(ObjectStore& fs, OSDSuperblock& sb, MonitorDBStore& ms)
|
||||
uint32_t crc = -1;
|
||||
uint64_t features = 0;
|
||||
// add inc maps
|
||||
{
|
||||
auto add_inc_result = [&] {
|
||||
const auto oid = OSD::get_inc_osdmap_pobject_name(e);
|
||||
bufferlist bl;
|
||||
int nread = fs.read(ch, oid, 0, 0, bl);
|
||||
if (nread <= 0) {
|
||||
cerr << "missing " << oid << std::endl;
|
||||
return -EINVAL;
|
||||
cout << "missing " << oid << std::endl;
|
||||
return -ENOENT;
|
||||
}
|
||||
t->put(prefix, e, bl);
|
||||
|
||||
@ -277,6 +277,17 @@ int update_osdmap(ObjectStore& fs, OSDSuperblock& sb, MonitorDBStore& ms)
|
||||
// inc.decode() verifies `inc_crc`, so it's been taken care of.
|
||||
}
|
||||
}
|
||||
}();
|
||||
switch (add_inc_result) {
|
||||
case -ENOENT:
|
||||
// no worries, we always have full map
|
||||
break;
|
||||
case -EINVAL:
|
||||
return -EINVAL;
|
||||
case 0:
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
// add full maps
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user