@@ -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
0 commit comments