Sage Weil [Mon, 3 May 2010 22:04:16 +0000 (15:04 -0700)]
mds: acquire anchor_create locks in caller
We're not allowed to call acquire_locks again once we've completed locking.
Do it in the caller. Add a helper that will also take an rdlock to ensure
the anchor doesn't go away due to a racing operation.
Sage Weil [Mon, 3 May 2010 21:00:28 +0000 (14:00 -0700)]
mds: fix lock->sync rdlock rule
Observed symptom was touch foo on one node, and missing from ls on another
node.
Since auth rdlock isn't allowed for LOCk, it clearly shouldn't be for
LOCK->SYNC while e.g. wrlock modifications are still being flushed to the
journal and aren't yet applied.
Sage Weil [Fri, 30 Apr 2010 18:05:39 +0000 (11:05 -0700)]
mds: fix trim_dentry on dentry under unlinked dir
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.
Sage Weil [Fri, 30 Apr 2010 17:46:17 +0000 (10:46 -0700)]
osd: fix pg_to_acting_osds() calculation to consider pg_temp
The OSD was using pg_to_up_acting, the client uses pg_to_acting, and their
calculations of 'acting' weren't consistent because the latter did not
consider pg_temp.
Sage Weil [Fri, 30 Apr 2010 18:05:39 +0000 (11:05 -0700)]
mds: fix trim_dentry on dentry under unlinked dir
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.
Sage Weil [Fri, 30 Apr 2010 17:46:17 +0000 (10:46 -0700)]
osd: fix pg_to_acting_osds() calculation to consider pg_temp
The OSD was using pg_to_up_acting, the client uses pg_to_acting, and their
calculations of 'acting' weren't consistent because the latter did not
consider pg_temp.
Sage Weil [Thu, 29 Apr 2010 17:27:02 +0000 (10:27 -0700)]
mon: m->get_session() may return null if session has closed
because the session close clears connection->priv. We need to check at
each site anyway, either for null session, or for session->closed. So
check for null session.
Sage Weil [Thu, 29 Apr 2010 17:22:13 +0000 (10:22 -0700)]
mon: m->get_session() may return null if session has closed
because the session close clears connection->priv. We need to check at
each site anyway, either for null session, or for session->closed. So
check for null session.
Sage Weil [Fri, 23 Apr 2010 18:07:16 +0000 (11:07 -0700)]
mds: skip client snap notification on unlink
This is cheating a bit, but should be harmless. Basically, we spit off the
snaprealm when we unlink to keep the hierarchy vs snaprealm invariants
intact. But we don't really care if the client does so, so we skip the
client_snap notifications.
That means the client will leave unlinked inodes in the realm they were
in at the time of unlink. I'm pretty sure that won't cause problems
later.