}
void ResizeRequest::finish_request() {
- CephContext *cct = m_image_ctx.cct;
+ RWLock::WLocker object_map_locker(m_image_ctx.object_map_lock);
+ CephContext *cct = m_image_ctx.cct;
ldout(cct, 5) << this << " resizing in-memory object map: "
<< m_num_objs << dendl;
+
resize(m_object_map, m_num_objs, m_default_object_state);
}
<< "->" << static_cast<uint32_t>(m_new_state)
<< dendl;
- // rebuilding the object map might update on-disk only
- if (m_snap_id == m_image_ctx.snap_id) {
- assert(m_image_ctx.object_map_lock.is_wlocked());
- for (uint64_t object_no = m_start_object_no;
- object_no < MIN(m_end_object_no, m_object_map.size());
- ++object_no) {
- uint8_t state = m_object_map[object_no];
- if (!m_current_state || state == *m_current_state ||
- (*m_current_state == OBJECT_EXISTS && state == OBJECT_EXISTS_CLEAN)) {
- m_object_map[object_no] = m_new_state;
- }
- }
- }
-
librados::ObjectWriteOperation op;
if (m_snap_id == CEPH_NOSNAP) {
rados::cls::lock::assert_locked(&op, RBD_LOCK_NAME, LOCK_EXCLUSIVE, "", "");
}
void UpdateRequest::finish_request() {
+ RWLock::RLocker snap_locker(m_image_ctx.snap_lock);
+ RWLock::WLocker object_map_locker(m_image_ctx.object_map_lock);
ldout(m_image_ctx.cct, 20) << this << " on-disk object map updated"
<< dendl;
+
+ // rebuilding the object map might update on-disk only
+ if (m_snap_id == m_image_ctx.snap_id) {
+ for (uint64_t object_no = m_start_object_no;
+ object_no < MIN(m_end_object_no, m_object_map.size());
+ ++object_no) {
+ uint8_t state = m_object_map[object_no];
+ if (!m_current_state || state == *m_current_state ||
+ (*m_current_state == OBJECT_EXISTS && state == OBJECT_EXISTS_CLEAN)) {
+ m_object_map[object_no] = m_new_state;
+ }
+ }
+ }
}
} // namespace object_map
#include "librbd/ImageState.h"
#include "librbd/internal.h"
#include "librbd/ObjectMap.h"
+#include "librbd/Operations.h"
#include "librbd/object_map/UpdateRequest.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
+
+ librbd::NoOpProgressContext no_progress;
+ ASSERT_EQ(0, ictx->operations->resize(4 << ictx->order, true, no_progress));
ASSERT_EQ(0, acquire_exclusive_lock(*ictx));
ceph::BitVector<2> object_map;
- object_map.resize(1024);
+ object_map.resize(4);
for (uint64_t i = 0; i < object_map.size(); ++i) {
object_map[i] = i % 4;
}