dout(20) << __func__ << dendl;
// Attach contexts to wait for all expiring segments to expire
- MDSGatherBuilder *expiry_gather = new MDSGatherBuilder(g_ceph_context);
+ MDSGatherBuilder expiry_gather(g_ceph_context);
const auto &expiring_segments = mdlog->get_expiring_segments();
for (auto p : expiring_segments) {
- p->wait_for_expiry(expiry_gather->new_sub());
+ p->wait_for_expiry(expiry_gather.new_sub());
}
- dout(5) << __func__ << ": waiting for " << expiry_gather->num_subs_created()
+ dout(5) << __func__ << ": waiting for " << expiry_gather.num_subs_created()
<< " segments to expire" << dendl;
- if (!expiry_gather->has_subs()) {
+ if (!expiry_gather.has_subs()) {
trim_segments();
- delete expiry_gather;
return;
}
Context *ctx = new LambdaContext([this](int r) {
handle_expire_segments(r);
});
- expiry_gather->set_finisher(new MDSInternalContextWrapper(mds, ctx));
- expiry_gather->activate();
+ expiry_gather.set_finisher(new MDSInternalContextWrapper(mds, ctx));
+ expiry_gather.activate();
}
void handle_expire_segments(int r) {
auto now = mono_clock::now();
auto duration = std::chrono::duration<double>(now-recall_start).count();
- MDSGatherBuilder *gather = new MDSGatherBuilder(g_ceph_context);
+ MDSGatherBuilder gather(g_ceph_context);
auto flags = Server::RecallFlags::STEADY|Server::RecallFlags::TRIM;
- auto [throttled, count] = server->recall_client_state(gather, flags);
+ auto [throttled, count] = server->recall_client_state(&gather, flags);
dout(10) << __func__
<< (throttled ? " (throttled)" : "")
<< " recalled " << count << " caps" << dendl;
recall_client_state();
}));
ctx->start_timer();
- gather->set_finisher(new MDSInternalContextWrapper(mds, ctx));
- gather->activate();
+ gather.set_finisher(new MDSInternalContextWrapper(mds, ctx));
+ gather.activate();
mdlog->flush(); /* use down-time to incrementally flush log */
do_trim(); /* use down-time to incrementally trim cache */
} else {
- if (!gather->has_subs()) {
- delete gather;
+ if (!gather.has_subs()) {
return handle_recall_client_state(0);
} else if (recall_timeout > 0 && duration > recall_timeout) {
- gather->set_finisher(new C_MDSInternalNoop);
- gather->activate();
+ gather.set_finisher(new C_MDSInternalNoop);
+ gather.activate();
return handle_recall_client_state(-ETIMEDOUT);
} else {
uint64_t remaining = (recall_timeout == 0 ? 0 : recall_timeout-duration);
}));
ctx->start_timer();
- gather->set_finisher(new MDSInternalContextWrapper(mds, ctx));
- gather->activate();
+ gather.set_finisher(new MDSInternalContextWrapper(mds, ctx));
+ gather.activate();
}
}
}
}
}
-void Server::flush_session(Session *session, MDSGatherBuilder *gather) {
+void Server::flush_session(Session *session, MDSGatherBuilder& gather) {
if (!session->is_open() ||
!session->get_connection() ||
!session->get_connection()->has_feature(CEPH_FEATURE_EXPORT_PEER)) {
return;
}
- version_t seq = session->wait_for_flush(gather->new_sub());
+ version_t seq = session->wait_for_flush(gather.new_sub());
mds->send_message_client(
make_message<MClientSession>(CEPH_SESSION_FLUSHMSG, seq), session);
}
void Server::flush_client_sessions(set<client_t>& client_set, MDSGatherBuilder& gather)
{
- for (set<client_t>::iterator p = client_set.begin(); p != client_set.end(); ++p) {
- Session *session = mds->sessionmap.get_session(entity_name_t::CLIENT(p->v));
+ for (const auto& client : client_set) {
+ Session *session = mds->sessionmap.get_session(entity_name_t::CLIENT(client.v));
ceph_assert(session);
- flush_session(session, &gather);
+ flush_session(session, gather);
}
}
m->head.max_caps = newlim;
mds->send_message_client(m, session);
if (gather) {
- flush_session(session, gather);
+ flush_session(session, *gather);
}
caps_recalled += session->notify_recall_sent(newlim);
recall_throttle.hit(recall);