case EVENT_STRING: le = new EString; break;
case EVENT_SUBTREEMAP: le = new ESubtreeMap; break;
+ case EVENT_SUBTREEMAP_TEST:
+ le = new ESubtreeMap;
+ le->set_type(type);
+ break;
case EVENT_EXPORT: le = new EExport; break;
case EVENT_IMPORTSTART: le = new EImportStart; break;
case EVENT_IMPORTFINISH: le = new EImportFinish; break;
#define EVENT_TABLECLIENT 42
#define EVENT_TABLESERVER 43
+#define EVENT_SUBTREEMAP_TEST 50
#include <string>
: _type(t), _start_off(0), _segment(0) { }
virtual ~LogEvent() { }
- int get_type() { return _type; }
+ int get_type() const { return _type; }
+ void set_type(int t) { _type = t; }
+
uint64_t get_start_off() const { return _start_off; }
void set_start_off(uint64_t o) { _start_off = o; }
- utime_t get_stamp() const { return stamp; }
+ utime_t get_stamp() const { return stamp; }
void set_stamp(utime_t t) { stamp = t; }
// encoding
void MDCache::truncate_inode_finish(CInode *in, LogSegment *ls)
{
dout(10) << "truncate_inode_finish " << *in << dendl;
-
- ls->truncating_inodes.erase(in);
+
+ set<CInode*>::iterator p = ls->truncating_inodes.find(in);
+ assert(p != ls->truncating_inodes.end());
+ ls->truncating_inodes.erase(p);
// update
inode_t *pi = in->project_inode();
void MDCache::add_recovered_truncate(CInode *in, LogSegment *ls)
{
+ dout(20) << "add_recovered_truncate " << *in << " in " << ls << " offset " << ls->offset << dendl;
ls->truncating_inodes.insert(in);
in->get(CInode::PIN_TRUNCATING);
}
void MDCache::remove_recovered_truncate(CInode *in, LogSegment *ls)
{
+ dout(20) << "remove_recovered_truncate " << *in << " in " << ls << " offset " << ls->offset << dendl;
// if we have the logseg the truncate started in, it must be in our list.
set<CInode*>::iterator p = ls->truncating_inodes.find(in);
assert(p != ls->truncating_inodes.end());
<< ", cur pos = " << journaler->get_write_pos() << dendl;
start_new_segment();
} else if (g_conf->mds_debug_subtrees &&
+ le->get_type() != EVENT_SUBTREEMAP_TEST &&
le->get_type() != EVENT_SUBTREEMAP) {
- // debug: journal this every time to catch subtree replay bugs
- submit_entry(mds->mdcache->create_subtree_map());
+ // debug: journal this every time to catch subtree replay bugs.
+ // use a different event id so it doesn't get interpreted as a
+ // LogSegment boundary on replay.
+ LogEvent *le = mds->mdcache->create_subtree_map();
+ le->set_type(EVENT_SUBTREEMAP_TEST);
+ submit_entry(le);
}
delete le;
return NULL;
}
-
void flush_logger();
size_t get_num_events() { return num_events; }