{
auto m = Compressor::get_comp_mode_type(cct->_conf->bluestore_compression_mode);
if (m) {
+ _clear_compression_alert();
comp_mode = *m;
} else {
derr << __func__ << " unrecognized value '"
<< "' for bluestore_compression_mode, reverting to 'none'"
<< dendl;
comp_mode = Compressor::COMP_NONE;
+ string s("unknown mode: ");
+ s += cct->_conf->bluestore_compression_mode;
+ _set_compression_alert(true, s.c_str());
}
compressor = nullptr;
if (!compressor) {
derr << __func__ << " unable to initialize " << alg_name.c_str() << " compressor"
<< dendl;
+ _set_compression_alert(false, alg_name.c_str());
}
}
bluefs->get_usage(&bluefs_usage);
ceph_assert(bluefs_usage.size() > bluefs_shared_bdev);
+ bool clear_alert = true;
+ if (bluefs_shared_bdev == BlueFS::BDEV_SLOW) {
+ auto& p = bluefs_usage[bluefs_shared_bdev];
+ if (p.first != p.second) {
+ string s("spilled over to slow device: ");
+ s += stringify(byte_u_t(p.second - p.first));
+ _set_spillover_alert(s.c_str());
+ clear_alert = false;
+ }
+ }
+ if (clear_alert) {
+ _clear_spillover_alert();
+ }
+
// fixme: look at primary bdev only for now
int64_t delta = _get_bluefs_size_delta(
bluefs_usage[bluefs_shared_bdev].first,
{
if (alerts) {
alerts->clear();
+ _log_alerts(*alerts);
}
_get_statfs_overall(buf);
{
if (!cp.get()) {
// if compressor isn't available - error, because cannot return
// decompressed data?
- derr << __func__ << " can't load decompressor " << alg << dendl;
+
+ const char* alg_name = Compressor::get_comp_alg_name(alg);
+ derr << __func__ << " can't load decompressor " << alg_name << dendl;
+ _set_compression_alert(false, alg_name);
r = -EIO;
} else {
r = cp->decompress(i, chdr.length, *result);
CompressorRef cp = compressor;
if (!cp || cp->get_type_name() != val) {
cp = Compressor::create(cct, val);
+ if (!cp) {
+ if (_set_compression_alert(false, val.c_str())) {
+ derr << __func__ << " unable to initialize " << val.c_str()
+ << " compressor" << dendl;
+ }
+ }
}
return boost::optional<CompressorRef>(cp);
}
txn->set(PREFIX_OBJ, o->key.c_str(), o->key.size(), bl);
}
+void BlueStore::_log_alerts(osd_alert_list_t& alerts)
+{
+ std::lock_guard l(qlock);
+
+ if (!spillover_alert.empty()) {
+ alerts.emplace(
+ "BLUEFS_SPILLOVER",
+ spillover_alert);
+ }
+ string s0(failed_cmode);
+
+ if (!failed_compressors.empty()) {
+ if (!s0.empty()) {
+ s0 += ", ";
+ }
+ s0 += "unable to load:";
+ bool first = true;
+ for (auto& s : failed_compressors) {
+ if (first) {
+ first = false;
+ } else {
+ s0 += ", ";
+ }
+ s0 += s;
+ }
+ alerts.emplace(
+ "BLUESTORE_NO_COMPRESSION",
+ s0);
+ }
+}
+
// ===========================================
// BlueStoreRepairer
debug_mdata_error_objects.erase(o);
}
}
+private:
+ ceph::mutex qlock = ceph::make_mutex("BlueStore::Alerts::qlock");
+ string failed_cmode;
+ set<string> failed_compressors;
+ string spillover_alert;
+
+ void _log_alerts(osd_alert_list_t& alerts);
+ bool _set_compression_alert(bool cmode, const char* s) {
+ std::lock_guard l(qlock);
+ if (cmode) {
+ bool ret = failed_cmode.empty();
+ failed_cmode = s;
+ return ret;
+ }
+ return failed_compressors.emplace(s).second;
+ }
+ void _clear_compression_alert() {
+ std::lock_guard l(qlock);
+ failed_compressors.clear();
+ failed_cmode.clear();
+ }
+
+ void _set_spillover_alert(const char* s) {
+ std::lock_guard l(qlock);
+ spillover_alert = s;
+ }
+ void _clear_spillover_alert() {
+ std::lock_guard l(qlock);
+ spillover_alert.clear();
+ }
+
private:
// --------------------------------------------------------