From bff67475c775914237604ed3374c8ccfe74d0ffd Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Fri, 14 Nov 2014 01:16:10 +0100 Subject: [PATCH] common: do not omit shard when ghobject NO_GEN is set Do not silence the display of shard_id when generation is NO_GEN. Erasure coded objects JSON representation used by ceph_objectstore_tool need the shard_id to find the file containing the chunk. Minimal testing is added to ceph_objectstore_tool.py http://tracker.ceph.com/issues/10063 Fixes: #10063 Signed-off-by: Loic Dachary (cherry picked from commit dcf09aed121f566221f539106d10283a09f15cf5) --- src/common/hobject.cc | 4 ++-- src/test/ceph_objectstore_tool.py | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/common/hobject.cc b/src/common/hobject.cc index 0abe59a0174f0..00b00195601dd 100644 --- a/src/common/hobject.cc +++ b/src/common/hobject.cc @@ -252,10 +252,10 @@ void ghobject_t::decode(json_spirit::Value& v) void ghobject_t::dump(Formatter *f) const { hobj.dump(f); - if (generation != NO_GEN) { + if (generation != NO_GEN) f->dump_int("generation", generation); + if (shard_id != shard_id_t::NO_SHARD) f->dump_int("shard_id", shard_id); - } } void ghobject_t::generate_test_instances(list& o) diff --git a/src/test/ceph_objectstore_tool.py b/src/test/ceph_objectstore_tool.py index ba0a8182731bd..194c7a3e91610 100755 --- a/src/test/ceph_objectstore_tool.py +++ b/src/test/ceph_objectstore_tool.py @@ -2,6 +2,7 @@ from subprocess import call from subprocess import check_output +import subprocess import os import time import sys @@ -526,6 +527,31 @@ def main(): for basename in db[nspace].keys(): file = os.path.join(DATADIR, nspace + "-" + basename) JSON = db[nspace][basename]['json'] + jsondict = json.loads(JSON) + + if 'shard_id' in jsondict: + logging.debug("ECobject " + JSON) + found = 0 + for pg in OBJECPGS: + OSDS = get_osds(pg, OSDDIR) + # Fix shard_id since we only have one json instance for each object + jsondict['shard_id'] = int(string.split(pg, 's')[1]) + JSON = json.dumps(jsondict) + for osd in OSDS: + cmd = (CFSD_PREFIX + "--pgid {pg} '{json}' get-attr hinfo_key").format(osd=osd, pg=pg, json=JSON) + logging.debug("TRY: " + cmd) + try: + out = check_output(cmd, shell=True, stderr=subprocess.STDOUT) + logging.debug("FOUND: {json} in {osd} has value '{val}'".format(osd=osd, json=JSON, val=out)) + found += 1 + except subprocess.CalledProcessError, e: + if "No such file or directory" not in e.output and "No data available" not in e.output: + raise + # Assuming k=2 m=1 for the default ec pool + if found != 3: + logging.error("{json} hinfo_key found {found} times instead of 3".format(json=JSON, found=found)) + ERRORS += 1 + for pg in OBJREPPGS: OSDS = get_osds(pg, OSDDIR) for osd in OSDS: -- 2.39.5