Merge pull request #4124 from ceph/wip-omap-clear

osd: fix omap_clear handling

Reviewed-by: Samuel Just <sjust@redhat.com>
This commit is contained in:
Samuel Just 2015-03-25 08:27:59 -07:00
commit 0ff3d58757
3 changed files with 50 additions and 2 deletions

View File

@ -1243,6 +1243,7 @@ int MemStore::_omap_clear(coll_t cid, const ghobject_t &oid)
if (!o)
return -ENOENT;
o->omap.clear();
o->omap_header.clear();
return 0;
}

View File

@ -5034,8 +5034,6 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
{
if (maybe_create_new_object(ctx)) {
t->touch(soid);
} else {
obs.oi.clear_omap_digest();
}
map<string, bufferlist> to_set;
try {
@ -5057,6 +5055,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
ctx->delta_stats.num_wr++;
}
obs.oi.set_flag(object_info_t::FLAG_OMAP);
obs.oi.clear_omap_digest();
break;
case CEPH_OSD_OP_OMAPSETHEADER:
@ -5077,6 +5076,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
ctx->delta_stats.num_wr++;
}
obs.oi.set_flag(object_info_t::FLAG_OMAP);
obs.oi.clear_omap_digest();
break;
case CEPH_OSD_OP_OMAPCLEAR:

View File

@ -1491,6 +1491,53 @@ TEST(LibRadosAio, OmapPP) {
ASSERT_EQ(set_got.size(), (unsigned)0);
}
// omap_clear clears header *and* keys
{
boost::scoped_ptr<AioCompletion> my_completion(cluster.aio_create_completion(0, 0, 0));
ObjectWriteOperation op;
bufferlist bl;
bl.append("some data");
map<string,bufferlist> to_set;
to_set["foo"] = bl;
to_set["foo2"] = bl;
to_set["qfoo3"] = bl;
op.omap_set(to_set);
op.omap_set_header(bl);
ioctx.aio_operate("foo3", my_completion.get(), &op);
{
TestAlarm alarm;
ASSERT_EQ(0, my_completion->wait_for_complete());
}
EXPECT_EQ(0, my_completion->get_return_value());
}
{
boost::scoped_ptr<AioCompletion> my_completion(cluster.aio_create_completion(0, 0, 0));
ObjectWriteOperation op;
op.omap_clear();
ioctx.aio_operate("foo3", my_completion.get(), &op);
{
TestAlarm alarm;
ASSERT_EQ(0, my_completion->wait_for_complete());
}
EXPECT_EQ(0, my_completion->get_return_value());
}
{
boost::scoped_ptr<AioCompletion> my_completion(cluster.aio_create_completion(0, 0, 0));
ObjectReadOperation op;
set<string> set_got;
bufferlist hdr;
op.omap_get_keys("", -1, &set_got, 0);
op.omap_get_header(&hdr, NULL);
ioctx.aio_operate("foo3", my_completion.get(), &op, 0);
{
TestAlarm alarm;
ASSERT_EQ(0, my_completion->wait_for_complete());
}
EXPECT_EQ(0, my_completion->get_return_value());
ASSERT_EQ(set_got.size(), (unsigned)0);
ASSERT_EQ(hdr.length(), 0u);
}
ioctx.remove("test_obj");
destroy_one_pool_pp(pool_name, cluster);
}