client: close snaprealm on last cap removal during reconnect
The invariant is is_any_caps() IFF in->snaprealm, where is_any_caps() is
!caps.empty || exporting_mds >= 0. If we clear exporting_mds and caps can
be non-empty, we need to drop the snaprealm reference.
Fixes crash like
client/Client.cc: In function 'void Client::add_update_cap(Inode*, int, uint64_t, unsigned int, unsigned int, unsigned int, inodeno_t, int)', in thread '0x7f213df10700'
client/Client.cc: 2244: FAILED assert(in->snaprealm == 0)
client/Client.cc: In function 'void Client::add_update_cap(Inode*, int, uint64_t, unsigned int, unsigned int, unsigned int, inodeno_t, int)', in thread '0x7f213df10700'
client/Client.cc: 2244: FAILED assert(in->snaprealm == 0)
ceph version
0.25-570-g8ea9380 (commit:
8ea938000624b5d67237b52cceee83b04d310d3c)
1: (ceph::__ceph_assert_fail(char const*, char const*, int, char const*)+0x53) [0x7bd566]
2: (Client::add_update_cap(Inode*, int, unsigned long, unsigned int, unsigned int, unsigned int, inodeno_t, int)+0xe6) [0x64af82]
3: (Client::add_update_inode(InodeStat*, utime_t, int)+0xca2) [0x63e1ec]
4: (Client::insert_trace(MetaRequest*, utime_t, int)+0x5cf) [0x63f4cb]
5: (Client::handle_client_reply(MClientReply*)+0x915) [0x6448c7]
6: (Client::ms_dispatch(Message*)+0x167) [0x644d5b]
7: (Messenger::ms_deliver_dispatch(Message*)+0x63) [0x62e911]
8: (SimpleMessenger::dispatch_entry()+0x6fd) [0x61ace1]
9: (SimpleMessenger::DispatchThread::entry()+0x2c) [0x610b90]
10: (Thread::_entry_func(void*)+0x23) [0x62d7f3]
11: (()+0x68ba) [0x7f21418e98ba]
12: (clone()+0x6d) [0x7f21407e502d]
ceph version
0.25-570-g8ea9380 (commit:
8ea938000624b5d67237b52cceee83b04d310d3c)
triggered by an MDS reconnect on a 3-node cluster. (Workload in this case
was just csyn --syn makedirs 7 7 7.)
Signed-off-by: Sage Weil <sage.weil@dreamhost.com>