summary = "BlueStore compression broken";
} else if (asum.first == "BLUESTORE_LEGACY_STATFS") {
summary = "Legacy BlueStore stats reporting detected";
+ } else if (asum.first == "BLUESTORE_DISK_SIZE_MISMATCH") {
+ summary = "BlueStore has dangerous mismatch between block device and free list sizes";
}
summary += " on ";
summary += stringify(asum.second.first);
fm = NULL;
return r;
}
+ // if space size tracked by free list manager is that higher than actual
+ // dev size one can hit out-of-space allocation which will result
+ // in data loss and/or assertions
+ // Probably user altered the device size somehow.
+ // The only fix for now is to redeploy OSD.
+ if (fm->get_size() >= bdev->get_size() + min_alloc_size) {
+ ostringstream ss;
+ ss << "slow device size mismatch detected, "
+ << " fm size(" << fm->get_size()
+ << ") > slow device size(" << bdev->get_size()
+ << "), Please stop using this OSD as it might cause data loss.";
+ _set_disk_size_mismatch_alert(ss.str());
+ }
return 0;
}
{
std::lock_guard l(qlock);
+ if (!disk_size_mismatch_alert.empty()) {
+ alerts.emplace(
+ "BLUESTORE_DISK_SIZE_MISMATCH",
+ disk_size_mismatch_alert);
+ }
if (!legacy_statfs_alert.empty()) {
alerts.emplace(
"BLUESTORE_LEGACY_STATFS",
set<string> failed_compressors;
string spillover_alert;
string legacy_statfs_alert;
+ string disk_size_mismatch_alert;
void _log_alerts(osd_alert_list_t& alerts);
bool _set_compression_alert(bool cmode, const char* s) {
}
void _check_legacy_statfs_alert();
+ void _set_disk_size_mismatch_alert(const string& s) {
+ std::lock_guard l(qlock);
+ disk_size_mismatch_alert = s;
+ }
private: