From: Sage Weil Date: Wed, 23 Sep 2009 17:00:32 +0000 (-0700) Subject: mds: warn on dup inodes; don't crash X-Git-Tag: v0.16~86 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=fcdfaa272a6ccf1ba3ad18b904a19bf37ba6e054;p=ceph.git mds: warn on dup inodes; don't crash We just ignore the second instance of the inode. It can get cleaned up transparently if/when the directory gets saved. --- diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 58982d1faad3a..5a2908c5d7b46 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -1227,10 +1227,18 @@ void CDir::_fetched(bufferlist &bl) CInode *in = 0; if (cache->have_inode(inode.ino, last)) { in = cache->get_inode(inode.ino, last); - dout(-12) << "_fetched got (but i already had) " << *in + dout(-12) << "_fetched badness: got (but i already had) " << *in << " mode " << in->inode.mode << " mtime " << in->inode.mtime << dendl; - assert(0); // this shouldn't happen!! + stringstream ss; + string dirpath, inopath; + this->inode->make_path_string(dirpath); + in->make_path_string(inopath); + ss << "loaded dup inode " << inode.ino << " [" << first << "," << last << "] v" << inode.version + << " at " << dirpath << "/" << dname + << ", but inode " << in->vino() << " v" << in->inode.version << " already exists at " << inopath; + cache->mds->logclient.log(LOG_ERROR, ss); + continue; } else { // inode in = new CInode(cache, true, first, last);