We can get a dentry that is trimmable (e.g. null) under a new unlinked dir,
which has no subtree. This will only happen on the auth. In that case,
having no container is harmless--it's only needed for replicas.
This fixes the following crash:
mds/MDCache.cc: In function 'void MDCache::trim_dentry(CDentry*, std::map<int, MCacheExpire*, std::less<int>, std::allocator<std::pair<const int, MCacheExpire*> > >&)':
mds/MDCache.cc:4797: FAILED assert(con)
1: (MDCache::trim(int)+0x214) [0x4ffbc4]
2: (MDS::tick()+0x4c1) [0x48f3b1]
3: (SafeTimer::EventWrapper::finish(int)+0x269) [0x683a89]
4: (Timer::timer_entry()+0x819) [0x685909]
5: (Timer::TimerThread::entry()+0xd) [0x47528d]
6: (Thread::_entry_func(void*)+0x7) [0x48a8a7]
7: /lib/libpthread.so.0 [0x7ffe62356fc7]
8: (clone()+0x6d) [0x7ffe615835ad]
NOTE: a copy of the executable, or `objdump -rdS <executable>` is needed to interpret this.
Signed-off-by: Sage Weil <sage@newdream.net>
assert(dir);
CDir *con = get_subtree_root(dir);
- assert(con);
-
- dout(12) << " in container " << *con << dendl;
+ if (con)
+ dout(12) << " in container " << *con << dendl;
+ else {
+ dout(12) << " no container; under a not-yet-linked dir" << dendl;
+ assert(dn->is_auth());
+ }
// notify dentry authority?
if (!dn->is_auth()) {