Skip to content

Commit

Permalink
Merge pull request #10010: jewel: Object map/fast-diff invalidated if…
Browse files Browse the repository at this point in the history
… journal replays the same snap remove event

Reviewed-by: Loic Dachary <ldachary@redhat.com>
  • Loading branch information
Loic Dachary committed Jul 1, 2016
2 parents 2c5458a + dd635e4 commit c63eb10
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 1 deletion.
5 changes: 5 additions & 0 deletions src/librbd/object_map/SnapshotRemoveRequest.cc
Expand Up @@ -72,6 +72,11 @@ bool SnapshotRemoveRequest::should_complete(int r) {
bool finished = false;
switch (m_state) {
case STATE_LOAD_MAP:
if (r == -ENOENT) {
finished = true;
break;
}

if (r == 0) {
bufferlist::iterator it = m_out_bl.begin();
r = cls_client::object_map_load_finish(&it, &m_snap_object_map);
Expand Down
3 changes: 2 additions & 1 deletion src/librbd/object_map/SnapshotRemoveRequest.h
Expand Up @@ -58,7 +58,8 @@ class SnapshotRemoveRequest : public AsyncRequest<> {
virtual bool should_complete(int r);

virtual int filter_return_code(int r) const {
if (m_state == STATE_REMOVE_MAP && r == -ENOENT) {
if ((m_state == STATE_LOAD_MAP || m_state == STATE_REMOVE_MAP) &&
r == -ENOENT) {
return 0;
}
return r;
Expand Down
25 changes: 25 additions & 0 deletions src/test/librbd/object_map/test_mock_SnapshotRemoveRequest.cc
Expand Up @@ -101,6 +101,31 @@ TEST_F(TestMockObjectMapSnapshotRemoveRequest, Success) {
expect_unlock_exclusive_lock(*ictx);
}

TEST_F(TestMockObjectMapSnapshotRemoveRequest, LoadMapMissing) {
REQUIRE_FEATURE(RBD_FEATURE_FAST_DIFF);

librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
ASSERT_EQ(0, snap_create(*ictx, "snap1"));
ASSERT_EQ(0, ictx->state->refresh_if_required());

uint64_t snap_id = ictx->snap_info.rbegin()->first;
expect_load_map(ictx, snap_id, -ENOENT);

ceph::BitVector<2> object_map;
C_SaferCond cond_ctx;
AsyncRequest<> *request = new SnapshotRemoveRequest(
*ictx, &object_map, snap_id, &cond_ctx);
{
RWLock::RLocker owner_locker(ictx->owner_lock);
RWLock::WLocker snap_locker(ictx->snap_lock);
request->send();
}
ASSERT_EQ(0, cond_ctx.wait());

expect_unlock_exclusive_lock(*ictx);
}

TEST_F(TestMockObjectMapSnapshotRemoveRequest, LoadMapError) {
REQUIRE_FEATURE(RBD_FEATURE_FAST_DIFF);

Expand Down

0 comments on commit c63eb10

Please sign in to comment.