pg->lock();
// adjust removed_snaps?
- if (!pg->pool->newly_removed_snaps.empty()) {
+ if (pg->is_active() &&
+ !pg->pool->newly_removed_snaps.empty()) {
for (map<snapid_t,snapid_t>::iterator p = pg->pool->newly_removed_snaps.m.begin();
p != pg->pool->newly_removed_snaps.m.end();
p++)
- for (snapid_t t = 0; t < p->second; ++t)
- pg->info.snap_trimq.insert(p->first + t);
- dout(10) << *pg << " snap_trimq now " << pg->info.snap_trimq << dendl;
+ pg->snap_trimq.insert(p->first, p->second);
+ dout(10) << *pg << " snap_trimq now " << pg->snap_trimq << dendl;
pg->dirty_info = true;
}
continue;
}
if (pg->is_active()) {
- // update started counter
- if (!pg->info.snap_trimq.empty())
+ // i am active
+ if (pg->is_primary() &&
+ !pg->snap_trimq.empty())
pg->queue_snap_trim();
}
else if (pg->is_primary() &&
child->info.last_complete = parent->info.last_complete;
child->info.log_tail = parent->log.tail;
child->info.log_backlog = parent->log.backlog;
- child->info.snap_trimq = parent->info.snap_trimq;
child->info.history.last_epoch_split = osdmap->get_epoch();
+ child->snap_trimq = parent->snap_trimq;
+
dout(20) << " child " << p->first << " log now ";
child->log.print(*_dout);
*_dout << dendl;
min_last_complete_ondisk = eversion_t();
stray_purged.clear();
+ snap_trimq.clear();
+
finish_sync_event = 0; // so that _finish_recvoery doesn't go off in another thread
missing_loc.clear();
peer_scrub_map.clear();
osd->recovery_wq.dequeue(this);
+ osd->snap_trim_wq.dequeue(this);
}
bool PG::choose_acting(int newest_update_osd)
write_info(t);
write_log(t);
- // clean up stray objects, snaps
+ // clean up stray objects
clean_up_local(t);
- if (!info.snap_trimq.empty())
+ // initialize snap_trimq
+ snap_trimq = pool->cached_removed_snaps;
+ snap_trimq.subtract(info.purged_snaps);
+ dout(10) << "activate - snap_trimq " << snap_trimq << dendl;
+ if (!snap_trimq.empty())
queue_snap_trim();
// init complete pointer
eversion_t log_tail; // oldest log entry.
bool log_backlog; // do we store a complete log?
- set<snapid_t> snap_trimq; // snaps we need to trim
+ interval_set<snapid_t> purged_snaps;
pg_stat_t stats;
bool dne() const { return history.epoch_created == 0; }
void encode(bufferlist &bl) const {
- __u8 v = 21;
+ __u8 v = 22;
::encode(v, bl);
::encode(pgid, bl);
::encode(log_backlog, bl);
::encode(stats, bl);
history.encode(bl);
- ::encode(snap_trimq, bl);
+ ::encode(purged_snaps, bl);
}
void decode(bufferlist::iterator &bl) {
__u8 v;
::decode(log_backlog, bl);
::decode(stats, bl);
history.decode(bl);
- ::decode(snap_trimq, bl);
+ if (v >= 22)
+ ::decode(purged_snaps, bl);
+ else {
+ set<snapid_t> snap_trimq;
+ ::decode(snap_trimq, bl);
+ }
}
};
//WRITE_CLASS_ENCODER(Info::History)
set<snapid_t> snap_collections;
map<epoch_t,Interval> past_intervals;
+ interval_set<snapid_t> snap_trimq;
+
xlist<PG*>::item recovery_item, backlog_item, scrub_item, snap_trim_item, remove_item, stat_queue_item;
int recovery_ops_active;
#ifdef DEBUG_RECOVERY_OIDS
if (lost)
out << " l=" << lost;
}
- //if (pg.info.snap_trimq.size())
- //out << " snaptrimq=" << pg.info.snap_trimq;
+ if (pg.snap_trimq.size())
+ out << " snaptrimq=" << pg.snap_trimq;
if (pg.deleting)
out << " DELETING";
lock();
dout(10) << "snap_trimmer start" << dendl;
- while (info.snap_trimq.size() &&
+ while (snap_trimq.size() &&
+ is_primary() &&
is_active()) {
- snapid_t sn = *info.snap_trimq.begin();
+ snapid_t sn = snap_trimq.start();
coll_t c = coll_t::build_snap_pg_coll(info.pgid, sn);
vector<sobject_t> ls;
osd->store->collection_list(c, ls);
int tr = osd->store->queue_transaction(&osr, t);
assert(tr == 0);
- info.snap_trimq.erase(sn);
+ snap_trimq.erase(sn);
}
// done