@xiangli-cmu It seems like the `Do()` function should wait until the entry is committed or rolled back. It seems like the only cases for the function would be:

1. The entry commits and the function returns successfully.
2. Another server gets elected that contains the entry and the entry would be committed.
3. Another server gets elected that doesn't contain the entry and this server later rejoins and the entry would be rejected.
4. The server crashes and no response is returned.

That's a more involved fix. We can do that after the pull request merge.