This routine cleans up all MPI states. Once this routine is called, no MPI
routine (not even MPI_Init) may be called, except for MPI_Get_version,
MPI_Initialized, and MPI_Finalized. Unless there has been a call to
MPI_Abort, you must ensure that all pending communications involving a
process are complete before the process calls MPI_Finalize. If the call
returns, each process may either continue local computations or exit without
participating in further communication with other processes. *At the moment
when the last process calls MPI_Finalize, all pending sends must be matched
by a receive, and all pending receives must be matched by a send. *

So I believe what Bill is alluding to is that after you called the second
Isend, your receive side hasn't posted the second Irecv; thus when
mpi_finalize is called on the send side, the message got thrown out. When
your receive side does get to the second Irecv, it is waiting for a message
that'll never arrive.