[ 
https://issues.apache.org/jira/browse/CASSANDRA-21505?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Minal Kyada reassigned CASSANDRA-21505:
---------------------------------------

    Assignee: Minal Kyada

> PaxosV1MultiNodeTableWalkTest Failure - CAS on static column w/empty bytes
> --------------------------------------------------------------------------
>
>                 Key: CASSANDRA-21505
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-21505
>             Project: Apache Cassandra
>          Issue Type: Bug
>          Components: Feature/Lightweight Transactions
>            Reporter: C. Scott Andreas
>            Assignee: Minal Kyada
>            Priority: Normal
>
> {{PaxosV1MultiNodeTableWalkTest}} fails deterministically at a {{UPDATE ... 
> IF <double static column> = <empty bytes>}} CAS. The Harry model predicts the 
> CAS does not apply (expecting a failed-CAS result of {{{}[applied], s0, 
> s1{}}}), while Paxos v1 applies it (returning {{[applied]}} only). The 
> mismatch surfaces as an assertion in the model when it validates the returned 
> rows against the expected columns.
> The disagreement is in how {{s1 = <empty bytes>}} is evaluated when {{s1}} is 
> a {{double}} static column whose current value is empty bytes. This bug 
> covers determining whether Paxos v1's evaluation or the Harry model's 
> expectation is correct; and updating either the implementation or test.
>  
> *Environment*
>  * Apache Cassandra trunk at {{1332e21}}
>  * {{CasMultiNodeTableWalkBase}} uses {{ReadRepairStrategy.NONE}} and 
> {{paxos_variant = v1}} (this is a pure Paxos v1 path; no read repair).
>  * Reproduced locally with JDK 11 (in-JVM dtest). Observed in CI on 
> {{{}jvm21-dtests{}}}.
>  
> *Reproducing*
> {{org.apache.cassandra.distributed.test.cql3.PaxosV1MultiNodeTableWalkTest}} 
> (3-node cluster), pinned to the failing seed via the harness hook:
> // in 
> PaxosV1MultiNodeTableWalkTest.preCheck(...):builder.withSeed(-570398361159823834L);
>  
> then:
> {{ant test-jvm-dtest-some 
> -Dtest.name=org.apache.cassandra.distributed.test.cql3.PaxosV1MultiNodeTableWalkTest
>  -Dtest.methods=test}}
> It fails at step 387 (of 400) deterministically ({{{}Seed = 
> -570398361159823834, Examples = 10{}}}).
>  
> *Failure Observed*
> Schema:
> {{CREATE TABLE ks1.tbl (
>     pk0 timeuuid, ck0 inet,
>     s0 boolean static, s1 double static,
>     v0 uuid, v1 frozen<set<frozen<tuple<float>>>>,
>     PRIMARY KEY (pk0, ck0)
> )}}
> Shrunk operation history:
> {{INSERT INTO ks1.tbl (pk0, ck0, s0, s1, v0, v1)
>   VALUES (00000000-0000-1200-b500-000000000000, '3484:...:762b', false, 
> <empty bytes>, ...);   -- s1 set to empty bytes
> ...}}
> {{UPDATE ks1.tbl SET s1 = <double> WHERE pk0 = 
> 00000000-0000-1200-b500-000000000000
>   IF s0 = false AND s1 = <empty bytes>;}}
>  
> Model annotation for the CAS: "would apply false" (the model expects the 
> condition to be false, so the CAS should not apply).
> Assertion (Harry model validating the returned rows):
> {{java.lang.AssertionError: actual rows do not match the schema [[applied], 
> s0, s1];
>   found [java.nio.HeapByteBuffer[pos=0 lim=1 cap=1]]
>   at org.apache.cassandra.harry.model.ASTSingleTableModel 
> (ASTSingleTableModel.java:1474)}}
>  
> The model expected a failed-CAS result with three columns 
> ({{{}[applied]=false{}}}, plus the current {{s0}} and {{{}s1{}}}), but the 
> actual result had a single 1-byte value — the shape of a CAS that applied 
> ({{{}[applied]=true{}}}).
>  
> *Analysis*
>  * The row's {{s1}} (a {{double}} static column) was written as empty bytes. 
> The CAS condition compares {{{}s1 = <empty bytes>{}}}. Since the stored value 
> equals the compared value, Paxos v1 evaluates the condition as true and 
> applies the update (result {{{}[applied]{}}}, one column).
>  * The Harry model evaluated the same condition as false (annotating "would 
> apply false") and therefore expected the failed-CAS result shape 
> {{{}[applied], s0, s1{}}}.
>  * So the two disagree on the outcome of comparing a fixed-length numeric 
> column to an empty-bytes value. Empty bytes for a fixed-length type 
> ({{{}double{}}} is 8 bytes) is a degenerate value; the disagreement is in 
> empty-value comparison semantics.
> Two possibilities:
>  # Paxos v1 is correct (empty == empty, CAS applies) and the Harry model's 
> condition evaluation for empty bytes on a fixed-length column is wrong (model 
> bug in {{{}test/harry{}}}).
>  # The Harry model is correct and Paxos v1 mis-evaluates the condition for an 
> empty-bytes fixed-length column (product bug in the CAS condition path).
> Determining which requires comparing Cassandra's CQL semantics for {{= <empty 
> bytes>}} on a {{{}double{}}}column against the model's evaluation, and 
> checking whether the row's {{s1}} is treated as empty vs null.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to