From 3ce9534d7865f63a913a3a4edf505cdf2d4db768 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 1 Apr 2011 16:21:27 -0700 Subject: [PATCH] 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 --- src/client/Client.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/client/Client.cc b/src/client/Client.cc index ca6fdc11db66a..aa50452e88f9e 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -1570,6 +1570,12 @@ void Client::send_reconnect(int mds) in->exporting_mds = -1; in->exporting_issued = 0; in->exporting_mseq = 0; + if (!in->is_any_caps()) { + dout(10) << " removing last cap, closing snaprealm" << dendl; + put_snap_realm(in->snaprealm); + in->snaprealm = 0; + in->snaprealm_item.remove_myself(); + } } } -- 2.39.5