void Journaler::handle_write_error(int r)
{
+ assert(lock.is_locked_by_me());
+
lderr(cct) << "handle_write_error " << cpp_strerror(r) << dendl;
if (on_write_error) {
on_write_error->complete(r);
on_write_error = NULL;
+ called_write_error = true;
+ } else if (called_write_error) {
+ /* We don't call error handler more than once, subsequent errors are dropped --
+ * this is okay as long as the error handler does something dramatic like respawn */
+ lderr(cct) << __func__ << ": multiple write errors, handler already called" << dendl;
} else {
assert(0 == "unhandled write error");
}
Mutex::Locker l(lock);
assert(!on_write_error);
on_write_error = wrap_finisher(c);
+ called_write_error = false;
}
// for wait_for_readable()
C_OnFinisher *on_readable;
C_OnFinisher *on_write_error;
+ bool called_write_error;
void _finish_read(int r, uint64_t offset, bufferlist &bl); // read completion callback
void _finish_retry_read(int r);
waiting_for_zero(false),
read_pos(0), requested_pos(0), received_pos(0),
fetch_len(0), temp_fetch_len(0),
- on_readable(0), on_write_error(NULL),
+ on_readable(0), on_write_error(NULL), called_write_error(false),
expire_pos(0), trimming_pos(0), trimmed_pos(0)
{
memset(&layout, 0, sizeof(layout));