MCPcopy Create free account
hub / github.com/ceph/ceph / remove_clone

Function remove_clone

src/tools/ceph_objectstore_tool.cc:3212–3279  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3210}
3211
3212int 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 }

Callers 2

mainFunction · 0.85
remove_or_updateMethod · 0.85

Calls 10

get_snapsetFunction · 0.85
remove_fromFunction · 0.85
cpp_strerrorFunction · 0.85
encodeFunction · 0.50
beginMethod · 0.45
endMethod · 0.45
intersection_ofMethod · 0.45
setattrMethod · 0.45
open_collectionMethod · 0.45
queue_transactionMethod · 0.45

Tested by

no test coverage detected