tolerating faults in distributed systems 2820101