After calling selfmanaged_snap_remove, we don't know
when trimming snapshot is finished.
So, we make the OSD to return EBUSY if the snapshot in removed_snap_queue,
then the unit test waits the completion
Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
(cherry-picked from commit
d6f9f23012b9ac133e767bd07a804707ba2207ef)
}
// snap
SnapSet& ss = obc->ssc->snapset;
+ const OSDMapRef& osdmap = get_osdmap();
for (vector<snapid_t>::const_reverse_iterator p = ss.clones.rbegin();
p != ss.clones.rend();
++p) {
ObjectContextRef obc_g = nullptr;
hobject_t clone_oid = obc->obs.oi.soid;
clone_oid.snap = *p;
+ if (osdmap->in_removed_snaps_queue(info.pgid.pgid.pool(), *p)) {
+ return -EBUSY;
+ }
ObjectContextRef clone_obc = get_object_context(clone_oid, false);
if (!clone_obc) {
break;
}
dst_refcount = refs.count();
}
- r = cls_cas_references_chunk(src_ioctx, src_oid, dst_oid);
- if (r == -ENOENT || r == -ENOLINK) {
- src_refcount = 0;
- } else {
- src_refcount = r;
+ for (int tries = 0; tries < 10; ++tries) {
+ r = cls_cas_references_chunk(src_ioctx, src_oid, dst_oid);
+ if (r == -ENOENT || r == -ENOLINK) {
+ src_refcount = 0;
+ } else if (r == -EBUSY) {
+ sleep(15);
+ continue;
+ } else {
+ src_refcount = r;
+ }
+ break;
}
ASSERT_TRUE(src_refcount >= 0);
ASSERT_TRUE(src_refcount == expected_refcount);