Skip to content

Commit

Permalink
Merge pull request #6289: librbd: invalidate object map on error even…
Browse files Browse the repository at this point in the history
… w/o holding lock

Reviewed-by: Loic Dachary <ldachary@redhat.com>
  • Loading branch information
Loic Dachary committed Nov 16, 2015
2 parents 1966859 + af734e6 commit 71ce803
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 11 deletions.
20 changes: 10 additions & 10 deletions src/librbd/ObjectMap.cc
Expand Up @@ -176,7 +176,7 @@ void ObjectMap::refresh(uint64_t snap_id)
if (r < 0) {
lderr(cct) << "error refreshing object map: " << cpp_strerror(r)
<< dendl;
invalidate();
invalidate(false);
m_object_map.clear();
return;
}
Expand All @@ -189,7 +189,7 @@ void ObjectMap::refresh(uint64_t snap_id)
if (m_object_map.size() < num_objs) {
lderr(cct) << "object map smaller than current object count: "
<< m_object_map.size() << " != " << num_objs << dendl;
invalidate();
invalidate(false);
} else if (m_object_map.size() > num_objs) {
// resize op might have been interrupted
ldout(cct, 1) << "object map larger than current object count: "
Expand Down Expand Up @@ -227,7 +227,7 @@ void ObjectMap::rollback(uint64_t snap_id) {
if (r < 0) {
lderr(cct) << "unable to load snapshot object map '" << snap_oid << "': "
<< cpp_strerror(r) << dendl;
invalidate();
invalidate(false);
return;
}

Expand All @@ -239,7 +239,7 @@ void ObjectMap::rollback(uint64_t snap_id) {
if (r < 0) {
lderr(cct) << "unable to rollback object map: " << cpp_strerror(r)
<< dendl;
invalidate();
invalidate(true);
}
}

Expand All @@ -265,15 +265,16 @@ void ObjectMap::snapshot(uint64_t snap_id) {
if (r < 0) {
lderr(cct) << "unable to load object map: " << cpp_strerror(r)
<< dendl;
invalidate();
invalidate(false);
return;
}

std::string snap_oid(object_map_name(m_image_ctx.id, snap_id));
r = m_image_ctx.md_ctx.write_full(snap_oid, bl);
if (r < 0) {
lderr(cct) << "unable to snapshot object map '" << snap_oid << "': "
<< cpp_strerror(r) << dendl;
invalidate();
invalidate(false);
}
}

Expand Down Expand Up @@ -333,7 +334,7 @@ bool ObjectMap::aio_update(uint64_t start_object_no, uint64_t end_object_no,
return false;
}

void ObjectMap::invalidate() {
void ObjectMap::invalidate(bool force) {
assert(m_image_ctx.snap_lock.is_wlocked());
assert(m_image_ctx.object_map_lock.is_wlocked());
uint64_t flags;
Expand All @@ -355,7 +356,7 @@ void ObjectMap::invalidate() {
}

librados::ObjectWriteOperation op;
if (m_image_ctx.snap_id == CEPH_NOSNAP) {
if (m_image_ctx.snap_id == CEPH_NOSNAP && !force) {
m_image_ctx.image_watcher->assert_header_locked(&op);
}
cls_client::set_flags(&op, m_image_ctx.snap_id, m_image_ctx.flags,
Expand All @@ -380,7 +381,7 @@ bool ObjectMap::Request::should_complete(int r) {
case STATE_REQUEST:
if (r == -EBUSY) {
lderr(cct) << "object map lock not owned by client" << dendl;
return true;
return invalidate();
} else if (r < 0) {
lderr(cct) << "failed to update object map: " << cpp_strerror(r)
<< dendl;
Expand Down Expand Up @@ -425,7 +426,6 @@ bool ObjectMap::Request::invalidate() {
m_image_ctx.flags |= RBD_FLAG_OBJECT_MAP_INVALID;

librados::ObjectWriteOperation op;
m_image_ctx.image_watcher->assert_header_locked(&op);
cls_client::set_flags(&op, CEPH_NOSNAP, m_image_ctx.flags,
RBD_FLAG_OBJECT_MAP_INVALID);

Expand Down
2 changes: 1 addition & 1 deletion src/librbd/ObjectMap.h
Expand Up @@ -131,7 +131,7 @@ class ObjectMap {

bool m_enabled;

void invalidate();
void invalidate(bool force);

};

Expand Down

0 comments on commit 71ce803

Please sign in to comment.