#include "common/config.h"
#include "common/perf_counters.h"
-#include "common/Finisher.h"
#include "include/str_list.h"
#include "common/errno.h"
info->finished_async();
info->put();
- objecter->_linger_callback_finish();
}
};
info->last_error = r;
if (info->watch_context) {
finisher->queue(new C_DoWatchError(this, info, r));
- _linger_callback_queue();
}
}
wl.unlock();
info->last_error = r;
if (info->watch_context) {
finisher->queue(new C_DoWatchError(this, info, r));
- _linger_callback_queue();
}
}
} else {
info->last_error = -ENOTCONN;
if (info->watch_context) {
finisher->queue(new C_DoWatchError(this, info, -ENOTCONN));
- _linger_callback_queue();
}
}
} else if (!info->is_watch) {
}
} else {
finisher->queue(new C_DoWatchNotify(this, info, m));
- _linger_callback_queue();
}
}
info->finished_async();
info->put();
m->put();
- _linger_callback_finish();
}
bool Objecter::ms_dispatch(Message *m)
#include "common/admin_socket.h"
#include "common/ceph_time.h"
#include "common/ceph_timer.h"
+#include "common/Finisher.h"
#include "common/shunique_lock.h"
#include "messages/MOSDOp.h"
map<uint64_t, LingerOp*> linger_ops;
// we use this just to confirm a cookie is valid before dereferencing the ptr
set<LingerOp*> linger_ops_set;
- int num_linger_callbacks;
- std::mutex linger_callback_lock;
- typedef std::unique_lock<std::mutex> unique_linger_cb_lock;
- typedef std::lock_guard<std::mutex> linger_cb_lock_guard;
- std::condition_variable linger_callback_cond;
map<ceph_tid_t,PoolStatOp*> poolstat_ops;
map<ceph_tid_t,StatfsOp*> statfs_ops;
uint32_t register_gen);
int _normalize_watch_error(int r);
- void _linger_callback_queue() {
- linger_cb_lock_guard l(linger_callback_lock);
- ++num_linger_callbacks;
- }
- void _linger_callback_finish() {
- linger_cb_lock_guard l(linger_callback_lock);
- if (--num_linger_callbacks == 0)
- linger_callback_cond.notify_all();
- assert(num_linger_callbacks >= 0);
- }
friend class C_DoWatchError;
public:
- void linger_callback_flush() {
- unique_linger_cb_lock l(linger_callback_lock);
- linger_callback_cond.wait(l, [this]() {
- return num_linger_callbacks <= 0;
- });
+ void linger_callback_flush(Context *ctx) {
+ finisher->queue(ctx);
}
private:
keep_balanced_budget(false), honor_osdmap_full(true),
last_seen_osdmap_version(0), last_seen_pgmap_version(0),
logger(NULL), tick_event(0), m_request_state_hook(NULL),
- num_linger_callbacks(0), num_homeless_ops(0),
+ num_homeless_ops(0),
homeless_session(new OSDSession(cct, -1)),
mon_timeout(ceph::make_timespan(mon_timeout)),
osd_timeout(ceph::make_timespan(osd_timeout)),