Stefania created CASSANDRA-9649:
-----------------------------------

             Summary: Paxos ballot in StorageProxy could clash
                 Key: CASSANDRA-9649
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-9649
             Project: Cassandra
          Issue Type: Bug
            Reporter: Stefania
            Assignee: Stefania
            Priority: Minor


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:

{code}
    long currentTime = (state.getTimestamp() / 1000) + 1;
    long ballotMillis = summary == null
                                 ? currentTime
                                 : Math.max(currentTime, 1 +    
UUIDGen.unixTimestamp(summary.mostRecentInProgressCommit.ballot));
    UUID ballot = UUIDGen.getTimeUUID(ballotMillis);
{code}

{{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?

cc [~jbellis] and [~slebresne] for CASSANDRA-7801



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to