A Scalable Communication-Induced Checkpointing Algorithm for Distributed Systems