void Journaler::_finish_reread_head(int r, bufferlist& bl, Context *finish)
{
lock_guard l(lock);
+ if (stopping) {
+ finish->complete(-EAGAIN);
+ return;
+ }
//read on-disk header into
assert(bl.length() || r < 0 );
void Journaler::_finish_read_head(int r, bufferlist& bl)
{
lock_guard l(lock);
+ if (stopping)
+ return;
assert(state == STATE_READHEAD);
C_OnFinisher *onfinish)
{
lock_guard l(lock);
+ if (stopping) {
+ onfinish->complete(-EAGAIN);
+ return;
+ }
assert(new_end >= write_pos || r < 0);
ldout(cct, 1) << "_finish_reprobe new_end = " << new_end
void Journaler::_finish_probe_end(int r, uint64_t end)
{
lock_guard l(lock);
+ if (stopping)
+ return;
assert(state == STATE_PROBING);
if (r < 0) { // error in probing
{
// Expect to be called back from finish_reread_head, which already takes lock
// lock is locked
+ if (stopping) {
+ onfinish->complete(-EAGAIN);
+ return;
+ }
assert(!r); //if we get an error, we're boned
_reprobe(onfinish);
void Journaler::_do_flush(unsigned amount)
{
+ if (stopping)
+ return;
if (write_pos == flush_pos)
return;
assert(write_pos > flush_pos);
void Journaler::flush(Context *onsafe)
{
lock_guard l(lock);
+ if (stopping) {
+ onsafe->complete(-EAGAIN);
+ return;
+ }
_flush(wrap_finisher(onsafe));
}
void Journaler::_prefetch()
{
+ if (stopping)
+ return;
+
ldout(cct, 10) << "_prefetch" << dendl;
// prefetch
uint64_t pf;
void Journaler::_finish_erase(int data_result, C_OnFinisher *completion)
{
lock_guard l(lock);
+ if (stopping) {
+ completion->complete(-EAGAIN);
+ return;
+ }
if (data_result == 0) {
// Async delete the journal header
void Journaler::_trim()
{
+ if (stopping)
+ return;
+
assert(!readonly);
uint64_t period = get_layout_period();
uint64_t trim_to = last_committed.expire_pos;
f->complete(-EAGAIN);
}
- finish_contexts(cct, waitfor_recover, -ESHUTDOWN);
+ list<Context*> ls;
+ ls.swap(waitfor_recover);
+ finish_contexts(cct, ls, -ESHUTDOWN);
std::map<uint64_t, std::list<Context*> >::iterator i;
for (i = waitfor_safe.begin(); i != waitfor_safe.end(); ++i) {