void ReplicatedPG::calc_trim_to()
{
- if (!is_degraded() && is_clean() && !(is_scrubbing() && scrubber.classic)) {
- if (min_last_complete_ondisk != eversion_t() &&
- min_last_complete_ondisk != pg_trim_to &&
- log.approx_size() > g_conf->osd_min_pg_log_entries) {
- size_t num_to_trim = log.approx_size() - g_conf->osd_min_pg_log_entries;
- list<pg_log_entry_t>::const_iterator it = log.log.begin();
- eversion_t new_trim_to;
- for (size_t i = 0; i < num_to_trim; ++i) {
- new_trim_to = it->version;
- ++it;
- if (new_trim_to > min_last_complete_ondisk) {
- new_trim_to = min_last_complete_ondisk;
- dout(10) << "calc_trim_to trimming to min_last_complete_ondisk" << dendl;
- break;
- }
+ if (is_degraded() || !is_clean()) {
+ dout(10) << "calc_trim_to no trim while degraded or not clean" << dendl;
+ pg_trim_to = eversion_t();
+ return;
+ }
+
+ if (is_scrubbing() && scrubber.classic) {
+ dout(10) << "calc_trim_to no trim during classic scrub" << dendl;
+ pg_trim_to = eversion_t();
+ return;
+ }
+
+ size_t target = g_conf->osd_min_pg_log_entries;
+ if (min_last_complete_ondisk != eversion_t() &&
+ min_last_complete_ondisk != pg_trim_to &&
+ log.approx_size() > target) {
+ size_t num_to_trim = log.approx_size() - target;
+ list<pg_log_entry_t>::const_iterator it = log.log.begin();
+ eversion_t new_trim_to;
+ for (size_t i = 0; i < num_to_trim; ++i) {
+ new_trim_to = it->version;
+ ++it;
+ if (new_trim_to > min_last_complete_ondisk) {
+ new_trim_to = min_last_complete_ondisk;
+ dout(10) << "calc_trim_to trimming to min_last_complete_ondisk" << dendl;
+ break;
}
- dout(10) << "calc_trim_to " << pg_trim_to << " -> " << new_trim_to << dendl;
- pg_trim_to = new_trim_to;
- assert(pg_trim_to <= log.head);
- assert(pg_trim_to <= min_last_complete_ondisk);
}
- } else {
- // don't trim
- pg_trim_to = eversion_t();
+ dout(10) << "calc_trim_to " << pg_trim_to << " -> " << new_trim_to << dendl;
+ pg_trim_to = new_trim_to;
+ assert(pg_trim_to <= log.head);
+ assert(pg_trim_to <= min_last_complete_ondisk);
}
}