Downstreamop

In master branch, clocksi_vnode will log upstream operations of a transaction during transaction execution. After a transaction has committed, downstream_generator_vnode will transfer all upstream ops of the previous transaction to downstream ops and log them again.

In this branch, downstream ops are generated and written to log during transaction execution. But these downstream ops do not contain commit_time, as commit_time can only be determined after the prepare phase of a transaction. After a transaction has committed, clocksi_vnode will know the commit_time of the transaction. It then update its copy of downstream ops by commit_time and write these updated downstream ops to materializer, without writing to log again.
The insertion to ETS seems to be guaranteed to be isolated and atomic and it will only return 'true', so I don't know if there is any other way to handle it.