Achieving reliable distributed systems : through efficient run-time monitoring and predicate detection