Attaining transient fault-tolerance in distributed systems