]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix trim_dentry on dentry under unlinked dir
authorSage Weil <sage@newdream.net>
Fri, 30 Apr 2010 18:05:39 +0000 (11:05 -0700)
committerSage Weil <sage@newdream.net>
Fri, 30 Apr 2010 20:02:11 +0000 (13:02 -0700)
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>
src/mds/MDCache.cc

index 4eb4beeb71af41a436f1452c949f9c17ad4ba8fe..1f1bc11216754cfa873996e823f07de48ab7e80e 100644 (file)
@@ -4794,9 +4794,12 @@ void MDCache::trim_dentry(CDentry *dn, map<int, MCacheExpire*>& expiremap)
   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()) {