| 3210 | } |
| 3211 | |
| 3212 | int remove_clone( |
| 3213 | ObjectStore *store, coll_t coll, ghobject_t &ghobj, snapid_t cloneid, bool force) |
| 3214 | { |
| 3215 | // XXX: Don't allow this if in a cache tier or former cache tier |
| 3216 | // bool allow_incomplete_clones() const { |
| 3217 | // return cache_mode != CACHEMODE_NONE || has_flag(FLAG_INCOMPLETE_CLONES); |
| 3218 | |
| 3219 | SnapSet snapset; |
| 3220 | int ret = get_snapset(store, coll, ghobj, snapset); |
| 3221 | if (ret < 0) |
| 3222 | return ret; |
| 3223 | |
| 3224 | // Derived from trim_object() |
| 3225 | // ...from snapset |
| 3226 | vector<snapid_t>::iterator p; |
| 3227 | for (p = snapset.clones.begin(); p != snapset.clones.end(); ++p) |
| 3228 | if (*p == cloneid) |
| 3229 | break; |
| 3230 | if (p == snapset.clones.end()) { |
| 3231 | cerr << "Clone " << cloneid << " not present"; |
| 3232 | return -ENOENT; |
| 3233 | } |
| 3234 | if (p != snapset.clones.begin()) { |
| 3235 | // not the oldest... merge overlap into next older clone |
| 3236 | vector<snapid_t>::iterator n = p - 1; |
| 3237 | hobject_t prev_coid = ghobj.hobj; |
| 3238 | prev_coid.snap = *n; |
| 3239 | //bool adjust_prev_bytes = is_present_clone(prev_coid); |
| 3240 | |
| 3241 | //if (adjust_prev_bytes) |
| 3242 | // ctx->delta_stats.num_bytes -= snapset.get_clone_bytes(*n); |
| 3243 | |
| 3244 | snapset.clone_overlap[*n].intersection_of( |
| 3245 | snapset.clone_overlap[*p]); |
| 3246 | |
| 3247 | //if (adjust_prev_bytes) |
| 3248 | // ctx->delta_stats.num_bytes += snapset.get_clone_bytes(*n); |
| 3249 | } |
| 3250 | |
| 3251 | ret = remove_from(snapset.clones, "clones", cloneid, force); |
| 3252 | if (ret) return ret; |
| 3253 | ret = remove_from(snapset.clone_overlap, "clone_overlap", cloneid, force); |
| 3254 | if (ret) return ret; |
| 3255 | ret = remove_from(snapset.clone_size, "clone_size", cloneid, force); |
| 3256 | if (ret) return ret; |
| 3257 | |
| 3258 | if (dry_run) |
| 3259 | return 0; |
| 3260 | |
| 3261 | bufferlist bl; |
| 3262 | encode(snapset, bl); |
| 3263 | ObjectStore::Transaction t; |
| 3264 | t.setattr(coll, ghobj, SS_ATTR, bl); |
| 3265 | auto ch = store->open_collection(coll); |
| 3266 | if (!ch) { |
| 3267 | cerr << "Collection " << coll << " does not exist" << std::endl; |
| 3268 | return -ENOENT; |
| 3269 | } |
no test coverage detected