Skip to content

Commit f50f7fd

Browse files
authored
Merge pull request ceph#54930 from rzarzynski/wip-osd-ec-rework
osd: rework EC for the sake of integration with crimson
2 parents f83cac6 + b2fcc55 commit f50f7fd

27 files changed

+2403
-1717
lines changed

src/common/scrub_types.cc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,12 @@ static void encode(const osd_shard_t& shard, bufferlist& bl) {
5555

5656
void shard_info_wrapper::set_object(const ScrubMap::object& object)
5757
{
58-
for (auto attr : object.attrs) {
59-
bufferlist bl;
60-
bl.push_back(attr.second);
61-
attrs.insert(std::make_pair(attr.first, std::move(bl)));
58+
// logically no-op, changes the comparator from std::less<void>
59+
// while avoiding `reinterpret_cast<const std::map<std::string,
60+
// ceph::bufferlist>&>(object.attrs)`
61+
attrs.clear();
62+
for (const auto& kv : object.attrs) {
63+
attrs.insert(kv);
6264
}
6365
size = object.size;
6466
if (object.omap_digest_present) {

src/crimson/osd/osd_operations/scrub_events.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ ScrubScan::ifut<> ScrubScan::scan_object(
221221
if (i.second.length() == 0) {
222222
entry.attrs[i.first];
223223
} else {
224-
entry.attrs.emplace(i.first, i.second.front());
224+
entry.attrs.emplace(i.first, i.second);
225225
}
226226
}
227227
}).handle_error_interruptible(

src/crimson/osd/pg_backend.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,4 +451,22 @@ class PGBackend
451451
std::vector<pg_log_entry_t>&& log_entries) = 0;
452452
friend class ReplicatedRecoveryBackend;
453453
friend class ::crimson::osd::PG;
454+
455+
protected:
456+
boost::container::flat_set<hobject_t> temp_contents;
457+
458+
template <class... Args>
459+
void add_temp_obj(Args&&... args) {
460+
temp_contents.insert(std::forward<Args>(args)...);
461+
}
462+
void clear_temp_obj(const hobject_t &oid) {
463+
temp_contents.erase(oid);
464+
}
465+
template <class T>
466+
void clear_temp_objs(const T &cont) {
467+
for (const auto& oid : cont) {
468+
clear_temp_obj(oid);
469+
}
470+
}
471+
friend class RecoveryBackend;
454472
};

src/crimson/osd/recovery_backend.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,16 @@ hobject_t RecoveryBackend::get_temp_recovery_object(
3232
return hoid;
3333
}
3434

35+
void RecoveryBackend::add_temp_obj(const hobject_t &oid)
36+
{
37+
backend->add_temp_obj(oid);
38+
}
39+
40+
void RecoveryBackend::clear_temp_obj(const hobject_t &oid)
41+
{
42+
backend->clear_temp_obj(oid);
43+
}
44+
3545
void RecoveryBackend::clean_up(ceph::os::Transaction& t,
3646
std::string_view why)
3747
{

src/crimson/osd/recovery_backend.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -201,12 +201,9 @@ class RecoveryBackend {
201201

202202
boost::container::flat_set<hobject_t> temp_contents;
203203

204-
void add_temp_obj(const hobject_t &oid) {
205-
temp_contents.insert(oid);
206-
}
207-
void clear_temp_obj(const hobject_t &oid) {
208-
temp_contents.erase(oid);
209-
}
204+
void add_temp_obj(const hobject_t &oid);
205+
void clear_temp_obj(const hobject_t &oid);
206+
210207
void clean_up(ceph::os::Transaction& t, std::string_view why);
211208
virtual seastar::future<> on_stop() = 0;
212209
private:

src/crimson/osd/scrub/scrub_validator.cc

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,9 @@ shard_evaluation_t evaluate_object_shard(
9696
if (xiter == obj.attrs.end()) {
9797
ret.shard_info.set_info_missing();
9898
} else {
99-
bufferlist bl;
100-
bl.push_back(xiter->second);
10199
ret.object_info = object_info_t{};
102100
try {
103-
auto bliter = bl.cbegin();
101+
auto bliter = xiter->second.cbegin();
104102
::decode(*(ret.object_info), bliter);
105103
} catch (...) {
106104
ret.shard_info.set_info_corrupted();
@@ -120,11 +118,9 @@ shard_evaluation_t evaluate_object_shard(
120118
if (xiter == obj.attrs.end()) {
121119
ret.shard_info.set_snapset_missing();
122120
} else {
123-
bufferlist bl;
124-
bl.push_back(xiter->second);
125121
ret.snapset = SnapSet{};
126122
try {
127-
auto bliter = bl.cbegin();
123+
auto bliter = xiter->second.cbegin();
128124
::decode(*(ret.snapset), bliter);
129125
} catch (...) {
130126
ret.shard_info.set_snapset_corrupted();
@@ -138,11 +134,9 @@ shard_evaluation_t evaluate_object_shard(
138134
if (xiter == obj.attrs.end()) {
139135
ret.shard_info.set_hinfo_missing();
140136
} else {
141-
bufferlist bl;
142-
bl.push_back(xiter->second);
143137
ret.hinfo = ECUtil::HashInfo{};
144138
try {
145-
auto bliter = bl.cbegin();
139+
auto bliter = xiter->second.cbegin();
146140
decode(*(ret.hinfo), bliter);
147141
} catch (...) {
148142
ret.shard_info.set_hinfo_corrupted();

src/mon/OSDMonitor.cc

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8032,10 +8032,7 @@ int OSDMonitor::prepare_new_pool(string& name,
80328032
/* crimson-osd requires that the pool be replicated and that pg_num/pgp_num
80338033
* be static. User must also have specified set-allow-crimson */
80348034
const auto *suffix = " (--crimson specified or osd_pool_default_crimson set)";
8035-
if (pool_type != pg_pool_t::TYPE_REPLICATED) {
8036-
*ss << "crimson-osd only supports replicated pools" << suffix;
8037-
return -EINVAL;
8038-
} else if (pg_autoscale_mode != "off") {
8035+
if (pg_autoscale_mode != "off") {
80398036
*ss << "crimson-osd does not support changing pg_num or pgp_num, "
80408037
<< "pg_autoscale_mode must be set to 'off'" << suffix;
80418038
return -EINVAL;

src/osd/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ set(osd_srcs
1717
PGLog.cc
1818
PrimaryLogPG.cc
1919
ReplicatedBackend.cc
20+
ECCommon.cc
2021
ECBackend.cc
2122
ECTransaction.cc
2223
PGBackend.cc

0 commit comments

Comments
 (0)