From: Josh Durgin Date: Thu, 30 Apr 2015 16:21:48 +0000 (-0700) Subject: Merge pull request #4461 from ceph/wip-11372 X-Git-Tag: v9.0.1~47 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0358840a597f1f5518d0b33e6b1fc45320a91174;p=ceph.git Merge pull request #4461 from ceph/wip-11372 librbd: add valgrind memory checks for unit tests Reviewed-by: Josh Durgin --- 0358840a597f1f5518d0b33e6b1fc45320a91174 diff --cc src/librbd/RebuildObjectMapRequest.cc index 2df56fab8162,4d9df00fa072..87cee7e421d4 --- a/src/librbd/RebuildObjectMapRequest.cc +++ b/src/librbd/RebuildObjectMapRequest.cc @@@ -82,54 -72,13 +82,55 @@@ private this, NULL, rados_ctx_cb); librados::ObjectReadOperation op; - op.assert_exists(); - int r = m_image_ctx.data_ctx.aio_operate(m_oid, comp, &op, NULL); + op.list_snaps(&m_snap_set, &m_snap_list_ret); + + int r = m_io_ctx.aio_operate(m_oid, comp, &op, NULL); assert(r == 0); + comp->release(); } - bool update_object_map(bool exists) { + uint8_t get_object_state() { + RWLock::RLocker snap_locker(m_image_ctx.snap_lock); + for (std::vector::const_iterator r = + m_snap_set.clones.begin(); r != m_snap_set.clones.end(); ++r) { + librados::snap_t from_snap_id; + librados::snap_t to_snap_id; + if (r->cloneid == librados::SNAP_HEAD) { + from_snap_id = next_valid_snap_id(m_snap_set.seq + 1); + to_snap_id = librados::SNAP_HEAD; + } else { + from_snap_id = next_valid_snap_id(r->snaps[0]); + to_snap_id = r->snaps[r->snaps.size()-1]; + } + + if (to_snap_id < m_snap_id) { + continue; + } else if (m_snap_id < from_snap_id) { + break; + } + + RWLock::RLocker snap_locker(m_image_ctx.snap_lock); + if ((m_image_ctx.features & RBD_FEATURE_FAST_DIFF) != 0 && + from_snap_id != m_snap_id) { + return OBJECT_EXISTS_CLEAN; + } + return OBJECT_EXISTS; + } + return OBJECT_NONEXISTENT; + } + + uint64_t next_valid_snap_id(uint64_t snap_id) { + assert(m_image_ctx.snap_lock.is_locked()); + + std::map::iterator it = + m_image_ctx.snap_info.lower_bound(snap_id); + if (it == m_image_ctx.snap_info.end()) { + return CEPH_NOSNAP; + } + return it->first; + } + + bool update_object_map(uint8_t new_state) { CephContext *cct = m_image_ctx.cct; bool lost_exclusive_lock = false; @@@ -370,14 -317,17 +371,15 @@@ bool RebuildObjectMapRequest::send_upda if (m_image_ctx.image_watcher->is_lock_supported()) { m_image_ctx.image_watcher->assert_header_locked(&op); } - cls_client::set_flags(&op, m_image_ctx.snap_id, 0, - RBD_FLAG_OBJECT_MAP_INVALID); + cls_client::set_flags(&op, m_image_ctx.snap_id, 0, flags); - int r = m_image_ctx.md_ctx.aio_operate(m_image_ctx.header_oid, - create_callback_completion(), &op); + librados::AioCompletion *comp = create_callback_completion(); + int r = m_image_ctx.md_ctx.aio_operate(m_image_ctx.header_oid, comp, &op); assert(r == 0); + comp->release(); RWLock::WLocker snap_locker(m_image_ctx.snap_lock); - m_image_ctx.update_flags(m_image_ctx.snap_id, RBD_FLAG_OBJECT_MAP_INVALID, - false); + m_image_ctx.update_flags(m_image_ctx.snap_id, flags, false); return false; } }