[
https://issues.apache.org/jira/browse/CASSANDRA-16657?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17347139#comment-17347139
]
Ekaterina Dimitrova edited comment on CASSANDRA-16657 at 5/19/21, 2:29 AM:
---------------------------------------------------------------------------
I have added some logging around Paxos
[here|https://github.com/ekaterinadimitrova2/cassandra/pull/113/commits/b67b9779d8d85bd85dbe5c85dcccc3daf63bca42]
and I didn't find any Paxos related errors in the logs of the failed runs of
this test.
According to this
[warning|https://github.com/apache/cassandra-dtest/blob/trunk/paxos_test.py#L65-L6],
I verified which key corresponds to which token using our partitioner utility
functions and also printing from the code which node is targeted for replica
for which key (double-checking myself).
-The last _INSERT_ (where all the failures of this test happen) should insert
to node 2. So my first thought was that there was delay in bringing up node 2.
But it turned out that for that statement to be executed, we need both node 2
and node 3 to be up, if I comment out the start of any of those 2, the test
consistently fails. -
My understanding is that this test has to verify that the following issue was
solved - PAXOS required all nodes for CAS (CASSANDRA-8640). -It seems to me
that maybe this was solved partially or something has changed later(I will dig
into that as a next step) as this is a pretty old ticket. What I mean is that
the first 4 operations always succeed but the last one always fails in case
node 3 is also down, even if we should require only the replica, node2 to be
available at this point. The replication factor is 1.-
{code:java}
session.execute("INSERT INTO test (k, v) VALUES (0, 0) IF NOT EXISTS") #
respective token belongs to node 2
node3.stop()
session.execute("INSERT INTO test (k, v) VALUES (1, 1) IF NOT EXISTS") #
respective token belongs to node 2
node2.stop()
session.execute("INSERT INTO test (k, v) VALUES (3, 2) IF NOT EXISTS") #
respective token belongs to node 1
node2.start()
session.execute("INSERT INTO test (k, v) VALUES (5, 5) IF NOT EXISTS") #
respective token belongs to node1
node3.start()
session.execute("INSERT INTO test (k, v) VALUES (6, 6) IF NOT EXISTS") #
respective token belongs to node2{code}
--So now the logical question was why the first insert of key 1 to node 2 after
stopping node 3 is always successful? Then I checked the logs and here it comes
the confusion:
CAS completes on node2 before node3 is stopped:-
{code:java}
DEBUG [MutationStage-1] 2021-05-18 02:49:54,316 PaxosState.java:78 - Promising
ballot b958b790-b783-11eb-52d1-a2e59ce8c54f
DEBUG [MutationStage-1] 2021-05-18 02:49:54,323 PaxosState.java:116 - Accepting
proposal Commit(b958b790-b783-11eb-52d1-a2e59ce8c54f, [ks.test] key=1
partition_deletion=deletedAt=-9223372036854775808, localDeletion=2147483647
columns=[[] | [v]]
Row[info=[ts=1621306194313000] ]: EMPTY | [v=1 ts=1621306194313000])
DEBUG [MutationStage-1] 2021-05-18 02:49:54,326 PaxosState.java:153 -
Committing proposal Commit(b958b790-b783-11eb-52d1-a2e59ce8c54f, [ks.test]
key=1 partition_deletion=deletedAt=-9223372036854775808,
localDeletion=2147483647 columns=[[] | [v]]
Row[info=[ts=1621306194313000] ]: EMPTY | [v=1 ts=1621306194313000])
{code}
-node3 stop:-
{code:java}
DEBUG [StorageServiceShutdownHook] 2021-05-18 02:49:47,201
StorageService.java:1619 - DRAINING: starting drain process
INFO [StorageServiceShutdownHook] 2021-05-18 02:49:47,202
HintsService.java:220 - Paused hints dispatch
INFO [StorageServiceShutdownHook] 2021-05-18 02:49:47,204 Server.java:171 -
Stop listening for CQL clients
INFO [StorageServiceShutdownHook] 2021-05-18 02:49:47,204 Gossiper.java:1962 -
Announcing shutdown
{code}-
I will add further logs and check for related post-CASSANDRA-8640 changes in
the area.
//CC [~blerer] as I remember you were working at some point on some PAXOS
related issues too
was (Author: e.dimitrova):
I have added some logging around Paxos
[here|https://github.com/ekaterinadimitrova2/cassandra/pull/113/commits/b67b9779d8d85bd85dbe5c85dcccc3daf63bca42]
and I didn't find any Paxos related errors in the logs of the failed runs of
this test.
According to this
[warning|https://github.com/apache/cassandra-dtest/blob/trunk/paxos_test.py#L65-L6],
I verified which key corresponds to which token using our partitioner utility
functions and also printing from the code which node is targeted for replica
for which key (double-checking myself).
-The last _INSERT_ (where all the failures of this test happen) should insert
to node 2. So my first thought was that there was delay in bringing up node 2.
But it turned out that for that statement to be executed, we need both node 2
and node 3 to be up, if I comment out the start of any of those 2, the test
consistently fails. -
My understanding is that this test has to verify that the following issue was
solved - PAXOS required all nodes for CAS (CASSANDRA-8640). -It seems to me
that maybe this was solved partially or something has changed later(I will dig
into that as a next step) as this is a pretty old ticket. What I mean is that
the first 4 operations always succeed but the last one always fails in case
node 3 is also down, even if we should require only the replica, node2 to be
available at this point. The replication factor is 1.-
{code:java}
session.execute("INSERT INTO test (k, v) VALUES (0, 0) IF NOT EXISTS") #
respective token belongs to node 2
node3.stop()
session.execute("INSERT INTO test (k, v) VALUES (1, 1) IF NOT EXISTS") #
respective token belongs to node 2
node2.stop()
session.execute("INSERT INTO test (k, v) VALUES (3, 2) IF NOT EXISTS") #
respective token belongs to node 1
node2.start()
session.execute("INSERT INTO test (k, v) VALUES (5, 5) IF NOT EXISTS") #
respective token belongs to node1
node3.start()
session.execute("INSERT INTO test (k, v) VALUES (6, 6) IF NOT EXISTS") #
respective token belongs to node2{code}
-So now the logical question was why the first insert of key 1 to node 2 after
stopping node 3 is always successful? Then I checked the logs and here it comes
the confusion:
CAS completes on node2 before node3 is stopped:
{code:java}
DEBUG [MutationStage-1] 2021-05-18 02:49:54,316 PaxosState.java:78 - Promising
ballot b958b790-b783-11eb-52d1-a2e59ce8c54f
DEBUG [MutationStage-1] 2021-05-18 02:49:54,323 PaxosState.java:116 - Accepting
proposal Commit(b958b790-b783-11eb-52d1-a2e59ce8c54f, [ks.test] key=1
partition_deletion=deletedAt=-9223372036854775808, localDeletion=2147483647
columns=[[] | [v]]
Row[info=[ts=1621306194313000] ]: EMPTY | [v=1 ts=1621306194313000])
DEBUG [MutationStage-1] 2021-05-18 02:49:54,326 PaxosState.java:153 -
Committing proposal Commit(b958b790-b783-11eb-52d1-a2e59ce8c54f, [ks.test]
key=1 partition_deletion=deletedAt=-9223372036854775808,
localDeletion=2147483647 columns=[[] | [v]]
Row[info=[ts=1621306194313000] ]: EMPTY | [v=1 ts=1621306194313000])
{code}
node3 stop:
{code:java}
DEBUG [StorageServiceShutdownHook] 2021-05-18 02:49:47,201
StorageService.java:1619 - DRAINING: starting drain process
INFO [StorageServiceShutdownHook] 2021-05-18 02:49:47,202
HintsService.java:220 - Paused hints dispatch
INFO [StorageServiceShutdownHook] 2021-05-18 02:49:47,204 Server.java:171 -
Stop listening for CQL clients
INFO [StorageServiceShutdownHook] 2021-05-18 02:49:47,204 Gossiper.java:1962 -
Announcing shutdown
{code}-
I will add further logs and check for related post-CASSANDRA-8640 changes in
the area.
//CC [~blerer] as I remember you were working at some point on some PAXOS
related issues too
> Flaky TestPaxos
> ---------------
>
> Key: CASSANDRA-16657
> URL: https://issues.apache.org/jira/browse/CASSANDRA-16657
> Project: Cassandra
> Issue Type: Bug
> Components: Test/dtest/python
> Reporter: Berenguer Blasi
> Assignee: Ekaterina Dimitrova
> Priority: Normal
> Fix For: 4.0-rc
>
>
> During testing for some other ticket I found in a test run
> [this|https://ci-cassandra.apache.org/job/Cassandra-devbranch/736/testReport/junit/dtest-novnode.paxos_test/TestPaxos/test_cluster_availability/]
> paxos failure
> {noformat}
> Error Message
> cassandra.Unavailable: Error from server: code=1000 [Unavailable exception]
> message="Cannot achieve consistency level SERIAL" info={'consistency':
> 'SERIAL', 'required_replicas': 1, 'alive_replicas': 0}
> Stacktrace
> self = <paxos_test.TestPaxos object at 0x7fafbd3f4850>
> @pytest.mark.no_vnodes
> def test_cluster_availability(self):
> # Warning, a change in partitioner or a change in CCM token allocation
> # may require the partition keys of these inserts to be changed.
> # This must not use vnodes as it relies on assumed token values.
>
> session = self.prepare(nodes=3)
> session.execute("CREATE TABLE test (k int PRIMARY KEY, v int)")
> session.execute("INSERT INTO test (k, v) VALUES (0, 0) IF NOT EXISTS")
>
> self.cluster.nodelist()[2].stop()
> session.execute("INSERT INTO test (k, v) VALUES (1, 1) IF NOT EXISTS")
>
> self.cluster.nodelist()[1].stop()
> session.execute("INSERT INTO test (k, v) VALUES (3, 2) IF NOT EXISTS")
>
> self.cluster.nodelist()[1].start()
> session.execute("INSERT INTO test (k, v) VALUES (5, 5) IF NOT EXISTS")
>
> self.cluster.nodelist()[2].start()
> > session.execute("INSERT INTO test (k, v) VALUES (6, 6) IF NOT EXISTS")
> paxos_test.py:83:
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
> _
> ../venv/src/cassandra-driver/cassandra/cluster.py:2618: in execute
> return self.execute_async(query, parameters, trace, custom_payload,
> timeout, execution_profile, paging_state, host, execute_as).result()
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
> _
> self = <ResponseFuture: query='<SimpleStatement query="INSERT INTO test (k,
> v) VALUES (6, 6) IF NOT EXISTS", consistency=Not ...el SERIAL"
> info={'consistency': 'SERIAL', 'required_replicas': 1, 'alive_replicas': 0}
> coordinator_host=127.0.0.2:9042>
> def result(self):
> """
> Return the final result or raise an Exception if errors were
> encountered. If the final result or error has not been set
> yet, this method will block until it is set, or the timeout
> set for the request expires.
>
> Timeout is specified in the Session request execution functions.
> If the timeout is exceeded, an :exc:`cassandra.OperationTimedOut`
> will be raised.
> This is a client-side timeout. For more information
> about server-side coordinator timeouts, see
> :class:`.policies.RetryPolicy`.
>
> Example usage::
>
> >>> future = session.execute_async("SELECT * FROM mycf")
> >>> # do other stuff...
>
> >>> try:
> ... rows = future.result()
> ... for row in rows:
> ... ... # process results
> ... except Exception:
> ... log.exception("Operation failed:")
>
> """
> self._event.wait()
> if self._final_result is not _NOT_SET:
> return ResultSet(self, self._final_result)
> else:
> > raise self._final_exception
> E cassandra.Unavailable: Error from server: code=1000 [Unavailable
> exception] message="Cannot achieve consistency level SERIAL"
> info={'consistency': 'SERIAL', 'required_replicas': 1, 'alive_replicas': 0}
> ../venv/src/cassandra-driver/cassandra/cluster.py:4894: Unavailable
> {noformat}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]