}
}
} else if (ctx->new_snapset.clones.size() &&
- !ctx->cache_evict) {
+ !ctx->cache_evict &&
+ (!ctx->snapset_obc || !ctx->snapset_obc->obs.exists)) {
// save snapset on _snap
hobject_t snapoid(soid.oid, soid.get_key(), CEPH_SNAPDIR, soid.hash,
info.pgid.pool(), soid.get_namespace());
eversion_t(),
0, osd_reqid_t(), ctx->mtime));
- ctx->snapset_obc = get_object_context(snapoid, true);
+ if (!ctx->snapset_obc)
+ ctx->snapset_obc = get_object_context(snapoid, true);
bool got = ctx->snapset_obc->get_write_greedy(ctx->op);
assert(got);
dout(20) << " got greedy write on snapset_obc " << *ctx->snapset_obc << dendl;
EXPECT_EQ(0, ioctx.snap_remove("snapfoo"));
}
+TEST_F(LibRadosSnapshotsPP, SnapCreateRemovePP) {
+ // reproduces http://tracker.ceph.com/issues/10262
+ bufferlist bl;
+ bl.append("foo");
+ ASSERT_EQ(0, ioctx.write("foo", bl, bl.length(), 0));
+ ASSERT_EQ(0, ioctx.snap_create("snapfoo"));
+ ASSERT_EQ(0, ioctx.remove("foo"));
+ ASSERT_EQ(0, ioctx.snap_create("snapbar"));
+
+ librados::ObjectWriteOperation *op = new librados::ObjectWriteOperation();
+ op->create(false);
+ op->remove();
+ ASSERT_EQ(0, ioctx.operate("foo", op));
+
+ EXPECT_EQ(0, ioctx.snap_remove("snapfoo"));
+ EXPECT_EQ(0, ioctx.snap_remove("snapbar"));
+}
+
TEST_F(LibRadosSnapshotsSelfManaged, Snap) {
std::vector<uint64_t> my_snaps;
my_snaps.push_back(-2);