{
bool done = false;
Cond cond;
+ int r = 0;
int rank = strtol(g_conf->name.get_id().c_str(), 0, 0);
inodeno_t ino = MDS_INO_LOG_OFFSET + rank;
lock.Lock();
- journaler->recover(new C_SafeCond(&lock, &cond, &done));
+ journaler->recover(new C_SafeCond(&lock, &cond, &done, &r));
while (!done)
cond.Wait(lock);
lock.Unlock();
+ if (r < 0) { // Error
+ derr << "error on recovery: " << cpp_strerror(r) << dendl;
+ messenger->shutdown();
+ // wait for messenger to finish
+ messenger->wait();
+ shutdown();
+ }
+
uint64_t start = journaler->get_read_pos();
uint64_t end = journaler->get_write_pos();
uint64_t len = end-start;
int err = errno;
derr << "unable to open " << dump_file << ": " << cpp_strerror(err) << dendl;
}
+
messenger->shutdown();
// wait for messenger to finish
void Journaler::_finish_reprobe(int r, uint64_t new_end, Context *onfinish) {
assert(new_end >= write_pos);
- assert(r >= 0);
ldout(cct, 1) << "_finish_reprobe new_end = " << new_end
<< " (header had " << write_pos << ")."
<< dendl;
void Journaler::_finish_probe_end(int r, uint64_t end)
{
assert(state == STATE_PROBING);
-
+ if (r < 0) { // error in probing
+ goto out;
+ }
if (((int64_t)end) == -1) {
end = write_pos;
ldout(cct, 1) << "_finish_probe_end write_pos = " << end
assert(0); // hrm.
} else {
assert(end >= write_pos);
- assert(r >= 0);
ldout(cct, 1) << "_finish_probe_end write_pos = " << end
<< " (header had " << write_pos << "). recovered."
<< dendl;
prezeroing_pos = prezero_pos = write_pos = flush_pos = safe_pos = end;
+out:
// done.
list<Context*> ls;
ls.swap(waitfor_recover);
- finish_contexts(cct, ls, 0);
+ finish_contexts(cct, ls, r);
}
class Journaler::C_RereadHeadProbe : public Context