  Taking snapshots of the state of a distributed computation is useful for
off-line analysis of the computational state, for later restarting from the
saved snapshot, for cloning a copy of the computation, and for migration to a
new cluster. The problem is made more difficult when supporting collective
operations across processes, such as barrier, reduce operations, scatter and
gather, etc. Some processes may have reached the barrier or other collective
operation, while other processes wait a long time to reach that same barrier or
collective operation. At least two solutions are well-known in the literature:
(I) draining in-flight network messages and then freezing the network at
checkpoint time; and (ii) adding a barrier prior to the collective operation,
and either completing the operation or aborting the barrier if not all
processes are present. Both solutions suffer important drawbacks. The code in
the first solution must be updated whenever one ports to a newer network. The
second solution implies additional barrier-related network traffic prior to
each collective operation. This work presents a third solution that avoids both
drawbacks. There is no additional barrier-related traffic, and the solution is
implemented entirely above the network layer. The work is demonstrated in the
context of transparent checkpointing of MPI libraries for parallel computation,
where each of the first two solutions have already been used in prior systems,
and then abandoned due to the aforementioned drawbacks. Experiments demonstrate
the low runtime overhead of this new, network-agnostic approach. The approach
is also extended to non-blocking, collective operations in order to handle
overlapping of computation and communication.
