Looked at the patch. It looks fine overall. A few comments:
1. In CL.maybeUpdateHeader(), why are there 2 identical if tests?
2. In CL.discard(), the following should never happen. Otherwise, the recovery logic won't be right. So, we probably should change the if test to as assertion.
if ( cLogCtx.position < commitLogHeader.getPosition(id) )
3. This is an optimization and should be left to another jira if we want to pursue this. I don't quite understand why a new CL has to inherit the dirty bits from the old one. If during the lifetime of a CL, a CF is not updated, its bit can be left off. This allows CLs to be GCed early.