template <typename I>
RefreshRequest<I>::~RefreshRequest() {
- delete m_object_map;
-
// these require state machine to close
assert(m_exclusive_lock == nullptr);
+ assert(m_object_map == nullptr);
assert(m_journal == nullptr);
assert(m_refresh_parent == nullptr);
}
template <typename I>
Context *RefreshRequest<I>::send_v2_close_journal() {
if (m_journal == nullptr) {
- return send_flush_aio();
+ return send_v2_close_object_map();
}
CephContext *cct = m_image_ctx.cct;
delete m_journal;
m_journal = nullptr;
+ return send_v2_close_object_map();
+}
+
+template <typename I>
+Context *RefreshRequest<I>::send_v2_close_object_map() {
+ if (m_object_map == nullptr) {
+ return send_flush_aio();
+ }
+
+ CephContext *cct = m_image_ctx.cct;
+ ldout(cct, 10) << this << " " << __func__ << dendl;
+
+ // object map was dynamically disabled
+ using klass = RefreshRequest<I>;
+ Context *ctx = create_context_callback<
+ klass, &klass::handle_v2_close_object_map>(this);
+ m_object_map->close(ctx);
+ return nullptr;
+}
+
+template <typename I>
+Context *RefreshRequest<I>::handle_v2_close_object_map(int *result) {
+ CephContext *cct = m_image_ctx.cct;
+ ldout(cct, 10) << this << " " << __func__ << ": r=" << *result << dendl;
+
+ assert(*result == 0);
+ assert(m_object_map != nullptr);
+ delete m_object_map;
+ m_object_map = nullptr;
+
return send_flush_aio();
}
Context *send_v2_close_journal();
Context *handle_v2_close_journal(int *result);
+ Context *send_v2_close_object_map();
+ Context *handle_v2_close_object_map(int *result);
+
Context *send_flush_aio();
Context *handle_flush_aio(int *result);