Skip to content

Commit 90bab02

Browse files
authored
Merge pull request ceph#56995 from athanatos/sjust/wip-65185-scrub-attr-error
osd: only call stat/getattrs once per object during deep-scrub Reviewed-by: Radoslaw Zarzynski <[email protected]>
2 parents 07afb4a + 915f92b commit 90bab02

File tree

4 files changed

+54
-30
lines changed

4 files changed

+54
-30
lines changed

src/os/ObjectStore.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ class ObjectStore {
617617
*
618618
* @param cid collection for object
619619
* @param oid oid of object
620-
* @param aset place to put output result.
620+
* @param aset upon success, will contain exactly the object attrs
621621
* @returns 0 on success, negative error code on failure.
622622
*/
623623
virtual int getattrs(CollectionHandle &c, const ghobject_t& oid,
@@ -628,13 +628,14 @@ class ObjectStore {
628628
*
629629
* @param cid collection for object
630630
* @param oid oid of object
631-
* @param aset place to put output result.
631+
* @param aset upon success, will contain exactly the object attrs
632632
* @returns 0 on success, negative error code on failure.
633633
*/
634634
int getattrs(CollectionHandle &c, const ghobject_t& oid,
635635
std::map<std::string,ceph::buffer::list,std::less<>>& aset) {
636636
std::map<std::string,ceph::buffer::ptr,std::less<>> bmap;
637637
int r = getattrs(c, oid, bmap);
638+
aset.clear();
638639
for (auto i = bmap.begin(); i != bmap.end(); ++i) {
639640
aset[i->first].append(i->second);
640641
}

src/os/bluestore/BlueStore.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12570,6 +12570,7 @@ int BlueStore::getattrs(
1257012570
r = -ENOENT;
1257112571
goto out;
1257212572
}
12573+
aset.clear();
1257312574
for (auto& i : o->onode.attrs) {
1257412575
aset.emplace(i.first.c_str(), i.second);
1257512576
}

src/osd/PGBackend.cc

Lines changed: 47 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -615,42 +615,61 @@ int PGBackend::be_scan_list(
615615
ceph_assert(pos.pos < pos.ls.size());
616616
hobject_t& poid = pos.ls[pos.pos];
617617

618-
struct stat st;
619-
int r = store->stat(
620-
ch,
621-
ghobject_t(
622-
poid, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard),
623-
&st,
624-
true);
625-
if (r == 0) {
626-
ScrubMap::object &o = map.objects[poid];
627-
o.size = st.st_size;
628-
ceph_assert(!o.negative);
629-
store->getattrs(
618+
int r = 0;
619+
ScrubMap::object &o = map.objects[poid];
620+
if (!pos.metadata_done) {
621+
struct stat st;
622+
r = store->stat(
630623
ch,
631624
ghobject_t(
632625
poid, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard),
633-
o.attrs);
626+
&st,
627+
true);
628+
629+
if (r == 0) {
630+
o.size = st.st_size;
631+
ceph_assert(!o.negative);
632+
r = store->getattrs(
633+
ch,
634+
ghobject_t(
635+
poid, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard),
636+
o.attrs);
637+
}
634638

635-
if (pos.deep) {
636-
r = be_deep_scrub(poid, map, pos, o);
639+
if (r == -ENOENT) {
640+
dout(25) << __func__ << " " << poid << " got " << r
641+
<< ", removing from map" << dendl;
642+
map.objects.erase(poid);
643+
} else if (r == -EIO) {
644+
dout(25) << __func__ << " " << poid << " got " << r
645+
<< ", stat_error" << dendl;
646+
o.stat_error = true;
647+
} else if (r != 0) {
648+
derr << __func__ << " got: " << cpp_strerror(r) << dendl;
649+
ceph_abort();
650+
}
651+
652+
if (r != 0) {
653+
dout(25) << __func__ << " " << poid << " got " << r
654+
<< ", skipping" << dendl;
655+
pos.next_object();
656+
return 0;
637657
}
658+
638659
dout(25) << __func__ << " " << poid << dendl;
639-
} else if (r == -ENOENT) {
640-
dout(25) << __func__ << " " << poid << " got " << r
641-
<< ", skipping" << dendl;
642-
} else if (r == -EIO) {
643-
dout(25) << __func__ << " " << poid << " got " << r
644-
<< ", stat_error" << dendl;
645-
ScrubMap::object &o = map.objects[poid];
646-
o.stat_error = true;
647-
} else {
648-
derr << __func__ << " got: " << cpp_strerror(r) << dendl;
649-
ceph_abort();
660+
pos.metadata_done = true;
650661
}
651-
if (r == -EINPROGRESS) {
652-
return -EINPROGRESS;
662+
663+
if (pos.deep) {
664+
r = be_deep_scrub(poid, map, pos, o);
665+
if (r == -EINPROGRESS) {
666+
return -EINPROGRESS;
667+
} else if (r != 0) {
668+
derr << __func__ << " be_deep_scrub got: " << cpp_strerror(r) << dendl;
669+
ceph_abort();
670+
}
653671
}
672+
654673
pos.next_object();
655674
return 0;
656675
}

src/osd/osd_types.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6302,6 +6302,7 @@ WRITE_CLASS_ENCODER(ScrubMap)
63026302
struct ScrubMapBuilder {
63036303
bool deep = false;
63046304
std::vector<hobject_t> ls;
6305+
bool metadata_done = false;
63056306
size_t pos = 0;
63066307
int64_t data_pos = 0;
63076308
std::string omap_pos;
@@ -6326,6 +6327,7 @@ struct ScrubMapBuilder {
63266327

63276328
void next_object() {
63286329
++pos;
6330+
metadata_done = false;
63296331
data_pos = 0;
63306332
omap_pos.clear();
63316333
omap_keys = 0;
@@ -6337,6 +6339,7 @@ struct ScrubMapBuilder {
63376339
if (pos.pos < pos.ls.size()) {
63386340
out << " " << pos.ls[pos.pos];
63396341
}
6342+
out << " metadata_done " << pos.metadata_done;
63406343
if (pos.data_pos < 0) {
63416344
out << " byte " << pos.data_pos;
63426345
}

0 commit comments

Comments
 (0)