- detect and deal with client failure
- failure during reconnect vs clientmap. although probalby the whole thing needs a larger overhaul...
+- inode.rmtime (recursive mtime)
+- make inode.size reflect directory size (number of entries)
+
- inode.max_size
- inode.allocated_size
class LogSegment {
public:
- off_t offset;
+ off_t offset, end;
int num_events;
// dirty items
C_Gather *try_to_expire(MDS *mds);
// cons
- LogSegment(off_t off) : offset(off), num_events(0),
+ LogSegment(off_t off) : offset(off), end(off), num_events(0),
allocv(0), clientmapv(0), anchortablev(0)
{ }
};
};
/* purge_inode in
- * will be called by on unlink or rmdir or truncate
- * caller responsible for journaling an appropriate EUpdate
+ * will be called by on unlink or rmdir or truncate or purge
+ * caller responsible for journaling a matching EUpdate
*/
void MDCache::purge_inode(CInode *in, off_t newsize, off_t oldsize, LogSegment *ls)
{
// journal it.
journaler->append_entry(bl); // bl is destroyed.
}
-
+
+ le->_segment->end = journaler->get_write_pos();
+
delete le;
-
+
if (logger) {
logger->inc("evadd");
logger->set("ev", num_events);
if (!capped && ls == get_current_segment()) {
dout(5) << "_expired not expiring " << ls->offset << ", last one and !capped" << dendl;
+ } else if (ls->end > journaler->get_write_ack_pos()) {
+ dout(5) << "_expired not expiring " << ls->offset << ", not fully flushed yet, ack "
+ << journaler->get_write_ack_pos() << " < end " << ls->end << dendl;
} else {
// expired.
expired_segments.insert(ls);
<< " : " << *le << dendl;
le->_segment = get_current_segment(); // replay may need this
le->_segment->num_events++;
+ le->_segment->end = journaler->get_read_pos();
num_events++;
le->replay(mds);
// HACK FOR NOW
- if (is_active()) {
+ if (is_active() || is_stopping()) {
// flush log to disk after every op. for now.
mdlog->flush();
}
assert(in);
-
- assert(in);
-
dout(12) << "including inode " << *in << dendl;
// add this dentry + inodeinfo
bool is_active() { return state == STATE_ACTIVE; }
off_t get_write_pos() const { return write_pos; }
+ off_t get_write_ack_pos() const { return ack_pos; }
off_t get_read_pos() const { return read_pos; }
off_t get_expire_pos() const { return expire_pos; }
off_t get_trimmed_pos() const { return trimmed_pos; }