Skip to content

Commit

Permalink
Merge remote-tracking branch 'gh/wip-6047'
Browse files Browse the repository at this point in the history
Reviewed-by: Sage Weil <[email protected]>
  • Loading branch information
Sage Weil committed Sep 4, 2013
2 parents b05f7ea + 7e72224 commit 6a4f4f0
Show file tree
Hide file tree
Showing 3 changed files with 139 additions and 61 deletions.
39 changes: 39 additions & 0 deletions qa/workunits/mon/rbd_snaps_ops.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/bin/bash

# attempt to trigger #6047


cmd_no=0
expect()
{
cmd_no=$(($cmd_no+1))
cmd="$1"
expected=$2
echo "[$cmd_no] $cmd"
eval $cmd
ret=$?
if [[ $ret -ne $expected ]]; then
echo "[$cmd_no] unexpected return '$ret', expected '$expected'"
exit 1
fi
}

expect 'ceph osd pool create test 256 256' 0
expect 'ceph osd pool mksnap test snapshot' 0
expect 'ceph osd pool rmsnap test snapshot' 0

expect 'rbd --pool=test create --size=102400 image' 0
expect 'rbd --pool=test snap create image@snapshot' 22

expect 'ceph osd pool delete test test --yes-i-really-really-mean-it' 0
expect 'ceph osd pool create test 256 256' 0
expect 'rbd --pool=test create --size=102400 image' 0
expect 'rbd --pool=test snap create image@snapshot' 0
expect 'rbd --pool=test snap ls image' 0
expect 'rbd --pool=test snap rm image@snapshot' 0

expect 'ceph osd pool mksnap test snapshot' 22

expect 'ceph osd pool delete test test --yes-i-really-really-mean-it' 0

echo OK
51 changes: 45 additions & 6 deletions src/mon/OSDMonitor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3381,7 +3381,11 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
string snapname;
cmd_getval(g_ceph_context, cmdmap, "snap", snapname);
const pg_pool_t *p = osdmap.get_pg_pool(pool);
if (p->snap_exists(snapname.c_str())) {
if (p->is_unmanaged_snaps_mode()) {
ss << "pool " << poolstr << " is in unmanaged snaps mode";
err = -EINVAL;
goto reply;
} else if (p->snap_exists(snapname.c_str())) {
ss << "pool " << poolstr << " snap " << snapname << " already exists";
err = 0;
goto reply;
Expand Down Expand Up @@ -3415,7 +3419,11 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
string snapname;
cmd_getval(g_ceph_context, cmdmap, "snap", snapname);
const pg_pool_t *p = osdmap.get_pg_pool(pool);
if (!p->snap_exists(snapname.c_str())) {
if (p->is_unmanaged_snaps_mode()) {
ss << "pool " << poolstr << " is in unmanaged snaps mode";
err = -EINVAL;
goto reply;
} else if (!p->snap_exists(snapname.c_str())) {
ss << "pool " << poolstr << " snap " << snapname << " does not exist";
err = 0;
goto reply;
Expand Down Expand Up @@ -3866,7 +3874,7 @@ bool OSDMonitor::preprocess_pool_op(MPoolOp *m)
_pool_op_reply(m, 0, osdmap.get_epoch());
return true;
}

// check if the snap and snapname exists
bool snap_exists = false;
const pg_pool_t *p = osdmap.get_pg_pool(m->pool);
Expand Down Expand Up @@ -3962,6 +3970,38 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m)
int ret = 0;
bool changed = false;

if (!osdmap.have_pg_pool(m->pool)) {
_pool_op_reply(m, -ENOENT, osdmap.get_epoch());
return false;
}

const pg_pool_t *pool = osdmap.get_pg_pool(m->pool);

switch (m->op) {
case POOL_OP_CREATE_SNAP:
case POOL_OP_DELETE_SNAP:
if (!pool->is_unmanaged_snaps_mode()) {
bool snap_exists = pool->snap_exists(m->name.c_str());
if ((m->op == POOL_OP_CREATE_SNAP && snap_exists)
|| (m->op == POOL_OP_CREATE_SNAP && !snap_exists)) {
ret = 0;
} else {
break;
}
} else {
ret = -EINVAL;
}
_pool_op_reply(m, ret, osdmap.get_epoch());
return false;

case POOL_OP_CREATE_UNMANAGED_SNAP:
case POOL_OP_DELETE_UNMANAGED_SNAP:
if (pool->is_pool_snaps_mode()) {
_pool_op_reply(m, -EINVAL, osdmap.get_epoch());
return false;
}
}

// projected pool info
pg_pool_t pp;
if (pending_inc.new_pools.count(m->pool))
Expand All @@ -3988,7 +4028,7 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m)
goto out;
}
}

switch (m->op) {
case POOL_OP_CREATE_SNAP:
if (!pp.snap_exists(m->name.c_str())) {
Expand Down Expand Up @@ -4043,8 +4083,7 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m)

out:
wait_for_finished_proposal(new OSDMonitor::C_PoolOp(this, m, ret, pending_inc.epoch, &reply_data));
propose_pending();
return false;
return true;
}

bool OSDMonitor::prepare_pool_op_create(MPoolOp *m)
Expand Down
Loading

0 comments on commit 6a4f4f0

Please sign in to comment.