This code in StorageProxy.beginAndRepairPaxos() takes a timestamp in microseconds but divides it by 1000 before adding one. So if the summary is null, ballotMillis would be the same for up to 1000 possible state timestamp values:
state.getTimestamp() returns the time in micro seconds and it ensures to add one microsecond to any previously used timestamp if the client sends the same or an older timestamp.
Initially I used this code in ModificationStatement.casInternal(), introduced by
CASSANDRA-9160 to support cas unit tests, but occasionally these tests were failing. It was only when I ensured uniqueness of the ballot that the tests started to pass reliably.
I wonder if we could ever have the same issue in StorageProxy?