Named them Callbacks. WriteCallbacks, specifically.
This is a 0.0.1 implementation of them. The ArrayList of WriteCallbacks is called before writing is done (and WriteCallback#beforeWrite(RowMutation, Table) is called on it) and after (where WriteCallback#afterWrite(RowMutation, Table) is called).
This does no filtering so even system table writes will be caught by it.
A singleton DatabaseDescriptor.callbackRunner is created and used.
No effort into making an easy API for new Message creation has been made (e.g. make it easy to send out new, different writes to the cluster).
No effort has been made to avoid slowdowns in the write path. ThreadPoolExecutors would probably be a good idea. The CallbackRunner is a good place to put such work.
It would probably be preferable that the WriteCallback and CallbackRunner were in a package other than org.apache.cassandra.db. This will have to be evaluated as we add features and other classes.
The WriteCallback class is just a simple class. It probably should be an interface. I have concern about that because we assume that the default no-args constructor works correctly when we load them from the config file.