ok, this is actually also a race that can cause the register_pipe assert. the locking needs to be reworked here. putting a sleep(2) in fault() after pipe_lock unlock and msgr->lock lock got me
2012-12-22 21:37:30.360401 7fe85bfe7700 1 -- 10.3.64.22:0/21242 --> 10.3.64.22:6802/20741 -- osd_ping(ping e131 stamp 2012-12-22 21:37:30.360322) v2 -- ?+0 0x29dc510 con 0x7fe85403b900
2012-12-22 21:37:30.360553 7fe85bfe7700 20 -- 10.3.64.22:0/21242 submit_message osd_ping(ping e131 stamp 2012-12-22 21:37:30.360322) v2 remote, 10.3.64.22:6802/20741, had pipe, but it closed.
2012-12-22 21:37:30.360619 7fe85bfe7700 20 -- 10.3.64.22:0/21242 submit_message osd_ping(ping e131 stamp 2012-12-22 21:37:30.360322) v2 remote, 10.3.64.22:6802/20741, new pipe.
2012-12-22 21:37:30.360638 7fe85bfe7700 10 -- 10.3.64.22:0/21242 connect_rank to 10.3.64.22:6802/20741, creating pipe and registering
2012-12-22 21:37:30.361036 7fe85bfe7700 10 -- 10.3.64.22:0/21242 >> :/0 pipe(0x29dcc10 sd=-1 :0 s=1 pgs=0 cs=0 l=0).randomize_out_seq 732632941
2012-12-22 21:37:30.361324 7fe85bfe7700 10 -- 10.3.64.22:0/21242 >> 10.3.64.22:6802/20741 pipe(0x29dcc10 sd=-1 :0 s=1 pgs=0 cs=0 l=1).register_pipe
2012-12-22 21:37:30.361350 7fe86c6f7700 10 -- 10.3.64.22:0/21242 >> 10.3.64.22:6802/20741 pipe(0x29dcc10 sd=-1 :0 s=1 pgs=0 cs=0 l=1).writer: state = connecting policy.server=0
2012-12-22 21:37:30.361451 7fe86c6f7700 10 -- 10.3.64.22:0/21242 >> 10.3.64.22:6802/20741 pipe(0x29dcc10 sd=-1 :0 s=1 pgs=0 cs=0 l=1).connect 0
2012-12-22 21:37:30.361547 7fe86c6f7700 10 -- 10.3.64.22:0/21242 >> 10.3.64.22:6802/20741 pipe(0x29dcc10 sd=34 :0 s=1 pgs=0 cs=0 l=1).connecting to 10.3.64.22:6802/20741
2012-12-22 21:37:30.361773 7fe86c6f7700 2 -- 10.3.64.22:0/21242 >> 10.3.64.22:6802/20741 pipe(0x29dcc10 sd=34 :0 s=1 pgs=0 cs=0 l=1).connect error 10.3.64.22:6802/20741, 111: Connection refused
2012-12-22 21:37:30.361805 7fe86c6f7700 2 -- 10.3.64.22:0/21242 >> 10.3.64.22:6802/20741 pipe(0x29dcc10 sd=34 :0 s=1 pgs=0 cs=0 l=1).fault 111: Connection refused
2012-12-22 21:37:30.361840 7fe86c6f7700 0 -- 10.3.64.22:0/21242 >> 10.3.64.22:6802/20741 pipe(0x29dcc10 sd=34 :0 s=1 pgs=0 cs=0 l=1).fault
2012-12-22 21:37:30.361854 7fe86c6f7700 10 -- 10.3.64.22:0/21242 >> 10.3.64.22:6802/20741 pipe(0x29dcc10 sd=34 :0 s=1 pgs=0 cs=0 l=1).writer: state = connecting policy.server=0
2012-12-22 21:37:30.361865 7fe86c6f7700 10 -- 10.3.64.22:0/21242 >> 10.3.64.22:6802/20741 pipe(0x29dcc10 sd=34 :0 s=1 pgs=0 cs=0 l=1).connect 0
2012-12-22 21:37:30.361936 7fe86c6f7700 10 -- 10.3.64.22:0/21242 >> 10.3.64.22:6802/20741 pipe(0x29dcc10 sd=34 :0 s=1 pgs=0 cs=0 l=1).connecting to 10.3.64.22:6802/20741
2012-12-22 21:37:30.362004 7fe86c6f7700 2 -- 10.3.64.22:0/21242 >> 10.3.64.22:6802/20741 pipe(0x29dcc10 sd=34 :0 s=1 pgs=0 cs=0 l=1).connect error 10.3.64.22:6802/20741, 111: Connection refused
2012-12-22 21:37:30.362031 7fe86c6f7700 2 -- 10.3.64.22:0/21242 >> 10.3.64.22:6802/20741 pipe(0x29dcc10 sd=34 :0 s=1 pgs=0 cs=0 l=1).fault 111: Connection refused
2012-12-22 21:37:30.362052 7fe86c6f7700 10 -- 10.3.64.22:0/21242 >> 10.3.64.22:6802/20741 pipe(0x29dcc10 sd=34 :0 s=1 pgs=0 cs=0 l=1).fault waiting 0.200000
2012-12-22 21:37:30.380333 7fe85bfe7700 -1 msg/Pipe.cc: In function 'void Pipe::register_pipe()' thread 7fe85bfe7700 time 2012-12-22 21:37:30.361441
msg/Pipe.cc: 1039: FAILED assert(msgr->rank_pipe.count(peer_addr) == 0)
ceph version 0.55.1-352-gbf98c06 (bf98c062aa3a688f7caa7dea25b15ef1f9c14ad3)
1: (ceph::__ceph_assert_fail(char const*, char const*, int, char const*)+0x80) [0x11a29ec]
2: (Pipe::register_pipe()+0x194) [0x127fb42]
3: (SimpleMessenger::connect_rank(entity_addr_t const&, int, Connection*, Message*)+0x2de) [0x11844c2]
4: (SimpleMessenger::submit_message(Message*, Connection*, entity_addr_t const&, int, bool)+0xae7) [0x1185533]
5: (SimpleMessenger::_send_message(Message*, Connection*, bool)+0x2e1) [0x1182a87]
6: (SimpleMessenger::send_message(Message*, Connection*)+0x2d) [0x1189041]
7: (OSD::heartbeat()+0x7f5) [0xea16c5]
8: (OSD::heartbeat_entry()+0x41) [0xea03c1]
9: (OSD::T_Heartbeat::entry()+0x1c) [0xed282c]
10: (Thread::_entry_func(void*)+0x23) [0x119113d]
11: (()+0x6b50) [0x7fe8772cdb50]
12: (clone()+0x6d) [0x7fe8759506dd]
NOTE: a copy of the executable, or `objdump -rdS <executable>` is needed to interpret this.