From: liyichao Date: Wed, 5 Dec 2018 04:22:20 +0000 (+0800) Subject: tools: Add clear-data-digest command to objectstore tool. X-Git-Tag: v13.2.7~232^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F29196%2Fhead;p=ceph.git tools: Add clear-data-digest command to objectstore tool. There may be a situation where data digest in object info is inconsistent with that computed from object data, then deep-scrub will fail even though all three repicas have the same object data. Fixes: https://tracker.ceph.com/issues/37935 Signed-off-by: Li Yichao (cherry picked from commit da5832b2b49be4ab23f7ffc5ba1ba630168b886f) Conflicts: src/tools/ceph_objectstore_tool.cc - change cbegin() to begin() to get it to build --- diff --git a/qa/standalone/special/ceph_objectstore_tool.py b/qa/standalone/special/ceph_objectstore_tool.py index bb226ee4a95d..86ae5d9a013b 100755 --- a/qa/standalone/special/ceph_objectstore_tool.py +++ b/qa/standalone/special/ceph_objectstore_tool.py @@ -1742,6 +1742,27 @@ def main(argv): ERRORS += EXP_ERRORS + print("Test clear-data-digest") + for nspace in db.keys(): + for basename in db[nspace].keys(): + JSON = db[nspace][basename]['json'] + cmd = (CFSD_PREFIX + "'{json}' clear-data-digest").format(osd='osd0', json=JSON) + logging.debug(cmd) + ret = call(cmd, shell=True, stdout=nullfd, stderr=nullfd) + if ret != 0: + logging.error("Clearing data digest failed for {json}".format(json=JSON)) + ERRORS += 1 + break + cmd = (CFSD_PREFIX + "'{json}' dump | grep '\"data_digest\": \"0xff'").format(osd='osd0', json=JSON) + logging.debug(cmd) + ret = call(cmd, shell=True, stdout=nullfd, stderr=nullfd) + if ret != 0: + logging.error("Data digest not cleared for {json}".format(json=JSON)) + ERRORS += 1 + break + break + break + print("Test pg removal") RM_ERRORS = 0 for pg in ALLREPPGS + ALLECPGS: diff --git a/src/tools/ceph_objectstore_tool.cc b/src/tools/ceph_objectstore_tool.cc index 9c9007e157d6..52231bdd8f12 100644 --- a/src/tools/ceph_objectstore_tool.cc +++ b/src/tools/ceph_objectstore_tool.cc @@ -2658,6 +2658,42 @@ int set_size( return 0; } +int clear_data_digest(ObjectStore *store, coll_t coll, ghobject_t &ghobj) { + auto ch = store->open_collection(coll); + bufferlist attr; + int r = store->getattr(ch, ghobj, OI_ATTR, attr); + if (r < 0) { + cerr << "Error getting attr on : " << make_pair(coll, ghobj) << ", " + << cpp_strerror(r) << std::endl; + return r; + } + object_info_t oi; + auto bp = attr.begin(); + try { + decode(oi, bp); + } catch (...) { + r = -EINVAL; + cerr << "Error getting attr on : " << make_pair(coll, ghobj) << ", " + << cpp_strerror(r) << std::endl; + return r; + } + if (!dry_run) { + attr.clear(); + oi.clear_data_digest(); + encode(oi, attr, -1); /* fixme: using full features */ + ObjectStore::Transaction t; + t.setattr(coll, ghobj, OI_ATTR, attr); + auto ch = store->open_collection(coll); + r = store->queue_transaction(ch, std::move(t)); + if (r < 0) { + cerr << "Error writing object info: " << make_pair(coll, ghobj) << ", " + << cpp_strerror(r) << std::endl; + return r; + } + } + return 0; +} + int clear_snapset(ObjectStore *store, coll_t coll, ghobject_t &ghobj, string arg) { @@ -2987,6 +3023,7 @@ void usage(po::options_description &desc) cerr << "ceph-objectstore-tool ... remove|removeall" << std::endl; cerr << "ceph-objectstore-tool ... dump" << std::endl; cerr << "ceph-objectstore-tool ... set-size" << std::endl; + cerr << "ceph-objectstore-tool ... clear-data-digest" << std::endl; cerr << "ceph-objectstore-tool ... remove-clone-metadata " << std::endl; cerr << std::endl; cerr << " can be a JSON object description as displayed" << std::endl; @@ -4076,6 +4113,9 @@ int main(int argc, char **argv) uint64_t size = atoll(arg1.c_str()); ret = set_size(fs, coll, ghobj, size, formatter, corrupt); goto out; + } else if (objcmd == "clear-data-digest") { + ret = clear_data_digest(fs, coll, ghobj); + goto out; } else if (objcmd == "clear-snapset") { // UNDOCUMENTED: For testing zap SnapSet // IGNORE extra args since not in usage anyway