Skip to content

Commit a6a499e

Browse files
Igor Fedotovifed01
authored andcommitted
os/bluestore: preload all the compressor plugins on mount.
Fixes: https://tracker.ceph.com/issues/69507 Signed-off-by: Igor Fedotov <[email protected]>
1 parent e24bb7e commit a6a499e

File tree

2 files changed

+130
-102
lines changed

2 files changed

+130
-102
lines changed

src/os/bluestore/BlueStore.cc

Lines changed: 121 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -5877,8 +5877,6 @@ void BlueStore::_set_compression()
58775877
_set_compression_alert(true, s.c_str());
58785878
}
58795879

5880-
compressor = nullptr;
5881-
58825880
if (cct->_conf->bluestore_compression_min_blob_size) {
58835881
comp_min_blob_size = cct->_conf->bluestore_compression_min_blob_size;
58845882
} else {
@@ -5900,19 +5898,36 @@ void BlueStore::_set_compression()
59005898
comp_max_blob_size = cct->_conf->bluestore_compression_max_blob_size_ssd;
59015899
}
59025900
}
5903-
5904-
auto& alg_name = cct->_conf->bluestore_compression_algorithm;
5905-
if (!alg_name.empty()) {
5906-
compressor = Compressor::create(cct, alg_name);
5907-
if (!compressor) {
5901+
if (compressors.size() == 0) {
5902+
compressors.resize(Compressor::COMP_ALG_LAST);
5903+
compressors[Compressor::COMP_ALG_NONE] = nullptr;
5904+
int alg = Compressor::COMP_ALG_NONE + 1;
5905+
while (alg < Compressor::COMP_ALG_LAST) {
5906+
compressors[alg] = Compressor::create(cct, alg);
5907+
++alg;
5908+
}
5909+
}
5910+
auto alg_name = cct->_conf->bluestore_compression_algorithm;
5911+
CompressorRef c =
5912+
!alg_name.empty() ? Compressor::create(cct, alg_name) : CompressorRef();
5913+
if (c) {
5914+
ceph_assert(c->get_type() < int(compressors.size()));
5915+
def_compressor_alg = c->get_type();
5916+
alg_name = c->get_type_name(); // let's use actual resulting alg name
5917+
} else {
5918+
if (!alg_name.empty()) {
59085919
derr << __func__ << " unable to initialize " << alg_name.c_str() << " compressor"
59095920
<< dendl;
59105921
_set_compression_alert(false, alg_name.c_str());
5922+
} else {
5923+
_clear_compression_alert();
59115924
}
5925+
def_compressor_alg = Compressor::COMP_ALG_NONE;
5926+
alg_name = "(none)";
59125927
}
5913-
5928+
59145929
dout(10) << __func__ << " mode " << Compressor::get_comp_mode_name(comp_mode)
5915-
<< " alg " << (compressor ? compressor->get_type_name() : "(none)")
5930+
<< " alg " << alg_name
59165931
<< " min_blob " << comp_min_blob_size
59175932
<< " max_blob " << comp_max_blob_size
59185933
<< dendl;
@@ -12317,6 +12332,67 @@ int BlueStore::set_collection_opts(
1231712332
return -ENOENT;
1231812333
std::unique_lock l{c->lock};
1231912334
c->pool_opts = opts;
12335+
12336+
string val;
12337+
c->compression_algorithm.reset();
12338+
if (c->pool_opts.get(pool_opts_t::COMPRESSION_ALGORITHM, &val)) {
12339+
auto alg = Compressor::get_comp_alg_type(val);
12340+
CompressorRef cp;
12341+
if (alg.has_value() && *alg != Compressor::COMP_ALG_NONE) {
12342+
cp = *alg < compressors.size() ? compressors[*alg] : cp;
12343+
if (!cp) {
12344+
_set_compression_alert(false, val.c_str());
12345+
derr << __func__ << " unable to load compressor plugin for " << val.c_str()
12346+
<< dendl;
12347+
} else {
12348+
ceph_assert(cp->get_type() == *alg);
12349+
c->compression_algorithm = cp->get_type();
12350+
}
12351+
}
12352+
}
12353+
c->compression_mode.reset();
12354+
if (c->pool_opts.get(pool_opts_t::COMPRESSION_MODE, &val)) {
12355+
auto cm = Compressor::get_comp_mode_type(val);
12356+
if (!cm) {
12357+
derr << __func__ << " unrecognized compression mode: " << val.c_str()
12358+
<< dendl;
12359+
} else {
12360+
c->compression_mode = cm;
12361+
}
12362+
}
12363+
int64_t ival;
12364+
c->csum_type.reset();
12365+
if (c->pool_opts.get(pool_opts_t::CSUM_TYPE, &ival)) {
12366+
if (ival >= Checksummer::CSUM_MAX) {
12367+
derr << __func__ << " unrecognized checksum type: " << ival
12368+
<< dendl;
12369+
} else {
12370+
c->csum_type = Checksummer::CSumType(ival);
12371+
}
12372+
}
12373+
c->comp_min_blob_size.reset();
12374+
if (c->pool_opts.get(pool_opts_t::COMPRESSION_MIN_BLOB_SIZE, &ival)) {
12375+
if (ival <= 0) {
12376+
derr << __func__ << " invalid min compression blob size: " << ival
12377+
<< dendl;
12378+
} else {
12379+
c->comp_min_blob_size = ival;
12380+
}
12381+
}
12382+
c->comp_max_blob_size.reset();
12383+
if (c->pool_opts.get(pool_opts_t::COMPRESSION_MAX_BLOB_SIZE, &ival)) {
12384+
if (ival <= 0) {
12385+
derr << __func__ << " invalid max compression blob size: " << ival
12386+
<< dendl;
12387+
} else {
12388+
c->comp_max_blob_size = ival;
12389+
}
12390+
}
12391+
double dval;
12392+
c->compression_req_ratio.reset();
12393+
if (c->pool_opts.get(pool_opts_t::COMPRESSION_REQUIRED_RATIO, &dval)) {
12394+
c->compression_req_ratio = dval;
12395+
}
1232012396
return 0;
1232112397
}
1232212398

@@ -12827,20 +12903,25 @@ int BlueStore::_decompress(bufferlist& source, bufferlist* result)
1282712903
bluestore_compression_header_t chdr;
1282812904
decode(chdr, i);
1282912905
int alg = int(chdr.type);
12830-
CompressorRef cp = compressor;
12831-
if (!cp || (int)cp->get_type() != alg) {
12832-
cp = Compressor::create(cct, alg);
12833-
}
12834-
12906+
CompressorRef cp =
12907+
alg < int(compressors.size()) ? compressors[alg] : CompressorRef();
1283512908
if (!cp.get()) {
12836-
// if compressor isn't available - error, because cannot return
12837-
// decompressed data?
12838-
12839-
const char* alg_name = Compressor::get_comp_alg_name(alg);
12840-
derr << __func__ << " can't load decompressor " << alg_name << dendl;
12841-
_set_compression_alert(false, alg_name);
12842-
r = -EIO;
12909+
if (alg != Compressor::COMP_ALG_NONE) {
12910+
// if compressor isn't available - error, because cannot return
12911+
// decompressed data?
12912+
const char* alg_name = Compressor::get_comp_alg_name(alg);
12913+
derr << __func__ << " can't locate compressor plugin for " << alg_name
12914+
<< dendl;
12915+
_set_compression_alert(false, alg_name);
12916+
r = -EIO;
12917+
} else {
12918+
dout(0) << __func__
12919+
<< " [warn] Compressed Blob has got no alg in the header "
12920+
<< dendl;
12921+
i.copy_all(*result);
12922+
}
1284312923
} else {
12924+
ceph_assert((int)cp->get_type() == alg);
1284412925
r = cp->decompress(i, chdr.length, *result, chdr.compressor_message);
1284512926
if (r < 0) {
1284612927
derr << __func__ << " decompression failed with exit code " << r << dendl;
@@ -16790,39 +16871,12 @@ int BlueStore::_do_alloc_write(
1679016871
CompressorRef c;
1679116872
double crr = 0;
1679216873
if (wctx->compress) {
16793-
c = select_option(
16794-
"compression_algorithm",
16795-
compressor,
16796-
[&]() {
16797-
string val;
16798-
if (coll->pool_opts.get(pool_opts_t::COMPRESSION_ALGORITHM, &val)) {
16799-
CompressorRef cp = compressor;
16800-
if (!cp || cp->get_type_name() != val) {
16801-
cp = Compressor::create(cct, val);
16802-
if (!cp) {
16803-
if (_set_compression_alert(false, val.c_str())) {
16804-
derr << __func__ << " unable to initialize " << val.c_str()
16805-
<< " compressor" << dendl;
16806-
}
16807-
}
16808-
}
16809-
return std::optional<CompressorRef>(cp);
16810-
}
16811-
return std::optional<CompressorRef>();
16812-
}
16813-
);
16814-
16815-
crr = select_option(
16816-
"compression_required_ratio",
16817-
cct->_conf->bluestore_compression_required_ratio,
16818-
[&]() {
16819-
double val;
16820-
if (coll->pool_opts.get(pool_opts_t::COMPRESSION_REQUIRED_RATIO, &val)) {
16821-
return std::optional<double>(val);
16822-
}
16823-
return std::optional<double>();
16824-
}
16825-
);
16874+
c = coll->compression_algorithm.has_value() ?
16875+
compressors[*(coll->compression_algorithm)]:
16876+
compressors[def_compressor_alg];
16877+
crr = coll->compression_req_ratio.has_value() ?
16878+
*(coll->compression_req_ratio) :
16879+
cct->_conf->bluestore_compression_required_ratio;
1682616880
}
1682716881

1682816882
// checksum
@@ -17231,34 +17285,16 @@ void BlueStore::_choose_write_options(
1723117285
wctx->csum_order = block_size_order;
1723217286

1723317287
// checksum
17234-
int64_t csum = csum_type.load();
17235-
csum = select_option(
17236-
"csum_type",
17237-
csum,
17238-
[&]() {
17239-
int64_t val;
17240-
if (c->pool_opts.get(pool_opts_t::CSUM_TYPE, &val)) {
17241-
return std::optional<int64_t>(val);
17242-
}
17243-
return std::optional<int64_t>();
17244-
}
17245-
);
17246-
wctx->csum_type = csum;
17288+
wctx->csum_type= c->csum_type.has_value() ?
17289+
*(c->csum_type):
17290+
csum_type.load();
1724717291

1724817292
// compression parameters
1724917293
unsigned alloc_hints = o->onode.alloc_hint_flags;
17250-
auto cm = select_option(
17251-
"compression_mode",
17252-
comp_mode.load(),
17253-
[&]() {
17254-
string val;
17255-
if (c->pool_opts.get(pool_opts_t::COMPRESSION_MODE, &val)) {
17256-
return std::optional<Compressor::CompressionMode>(
17257-
Compressor::get_comp_mode_type(val));
17258-
}
17259-
return std::optional<Compressor::CompressionMode>();
17260-
}
17261-
);
17294+
17295+
auto cm = c->compression_mode.has_value() ?
17296+
*(c->compression_mode) :
17297+
comp_mode.load();
1726217298

1726317299
wctx->compress = (cm != Compressor::COMP_NONE) &&
1726417300
((cm == Compressor::COMP_FORCE) ||
@@ -17283,31 +17319,15 @@ void BlueStore::_choose_write_options(
1728317319
}
1728417320

1728517321
if (wctx->compress) {
17286-
wctx->target_blob_size = select_option(
17287-
"compression_max_blob_size",
17288-
comp_max_blob_size.load(),
17289-
[&]() {
17290-
int64_t val;
17291-
if (c->pool_opts.get(pool_opts_t::COMPRESSION_MAX_BLOB_SIZE, &val)) {
17292-
return std::optional<uint64_t>((uint64_t)val);
17293-
}
17294-
return std::optional<uint64_t>();
17295-
}
17296-
);
17322+
wctx->target_blob_size = c->comp_max_blob_size.has_value() ?
17323+
*(c->comp_max_blob_size):
17324+
comp_max_blob_size.load();
1729717325
}
1729817326
} else {
1729917327
if (wctx->compress) {
17300-
wctx->target_blob_size = select_option(
17301-
"compression_min_blob_size",
17302-
comp_min_blob_size.load(),
17303-
[&]() {
17304-
int64_t val;
17305-
if (c->pool_opts.get(pool_opts_t::COMPRESSION_MIN_BLOB_SIZE, &val)) {
17306-
return std::optional<uint64_t>((uint64_t)val);
17307-
}
17308-
return std::optional<uint64_t>();
17309-
}
17310-
);
17328+
wctx->target_blob_size = c->comp_min_blob_size.has_value() ?
17329+
*(c->comp_min_blob_size):
17330+
comp_min_blob_size.load();
1731117331
}
1731217332
}
1731317333

src/os/bluestore/BlueStore.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1682,6 +1682,13 @@ class BlueStore : public ObjectStore,
16821682

16831683
//pool options
16841684
pool_opts_t pool_opts;
1685+
std::optional<int> compression_algorithm;
1686+
std::optional<int> compression_mode;
1687+
std::optional<int> csum_type;
1688+
std::optional<int64_t> comp_min_blob_size;
1689+
std::optional<int64_t> comp_max_blob_size;
1690+
std::optional<double> compression_req_ratio;
1691+
16851692
ContextQueue *commit_queue;
16861693

16871694
OnodeCacheShard* get_onode_cache() const {
@@ -2494,7 +2501,8 @@ class BlueStore : public ObjectStore,
24942501

24952502
std::atomic<Compressor::CompressionMode> comp_mode =
24962503
{Compressor::COMP_NONE}; ///< compression mode
2497-
CompressorRef compressor;
2504+
std::atomic<int> def_compressor_alg = {Compressor::COMP_ALG_NONE};
2505+
std::vector<CompressorRef> compressors;
24982506
std::atomic<uint64_t> comp_min_blob_size = {0};
24992507
std::atomic<uint64_t> comp_max_blob_size = {0};
25002508

0 commit comments

Comments
 (0)