[
https://issues.apache.org/jira/browse/CASSANDRA-19842?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Yifan Cai updated CASSANDRA-19842:
----------------------------------
Fix Version/s: NA
Since Version: NA
Source Control Link:
https://github.com/apache/cassandra-analytics/commit/cfe293dadcf7a1d4491591cfd39fc410a8fa52ba
Resolution: Fixed
Status: Resolved (was: Ready to Commit)
> [Analytics] Consistency level check incorrectly passes when majority of the
> replica set is unavailable for write
> ----------------------------------------------------------------------------------------------------------------
>
> Key: CASSANDRA-19842
> URL: https://issues.apache.org/jira/browse/CASSANDRA-19842
> Project: Cassandra
> Issue Type: Bug
> Components: Analytics Library
> Reporter: Yifan Cai
> Assignee: Yifan Cai
> Priority: Normal
> Fix For: NA
>
> Time Spent: 2h
> Remaining Estimate: 0h
>
> Consistency level check is performed before proceeding to bulk writing data.
> The check yields wrong results that when the majority of a replica set is
> unavailable, it still passes. Leading to writing data to replicas that cannot
> satisfy the desired consistency level.
> The following is the test to prove the bug. The test sets all 3 instances in
> the replica set as blocked (unavailable), so the validation is expected to
> throw. But it does not.
> {code:java}
> @Test
> void test()
> {
> BulkWriterContext mockWriterContext = mock(BulkWriterContext.class);
> ClusterInfo mockClusterInfo = mock(ClusterInfo.class);
> when(mockWriterContext.cluster()).thenReturn(mockClusterInfo);
> CassandraContext mockCassandraContext = mock(CassandraContext.class);
>
> when(mockClusterInfo.getCassandraContext()).thenReturn(mockCassandraContext);
> Map<String, String> replicationOptions = new HashMap<>();
> replicationOptions.put("class", "SimpleStrategy");
> replicationOptions.put("replication_factor", "3");
> TokenRangeMapping<RingInstance> topology =
> CassandraClusterInfo.getTokenRangeReplicas(() ->
> mockSimpleTokenRangeReplicasResponse(10, 3),
>
> () -> Partitioner.Murmur3Partitioner,
>
> () -> new ReplicationFactor(replicationOptions),
>
> ringInstance -> {
>
> int nodeId =
> Integer.parseInt(ringInstance.ipAddress().replace("localhost", ""));
>
> return nodeId <= 2; // block nodes 0, 1, 2
>
> });
>
> when(mockClusterInfo.getTokenRangeMapping(anyBoolean())).thenReturn(topology);
> JobInfo mockJobInfo = mock(JobInfo.class);
> UUID jobId = UUID.randomUUID();
> when(mockJobInfo.getId()).thenReturn(jobId.toString());
> when(mockJobInfo.getRestoreJobId()).thenReturn(jobId);
> when(mockJobInfo.qualifiedTableName()).thenReturn(new
> QualifiedTableName("testkeyspace", "testtable"));
>
> when(mockJobInfo.getConsistencyLevel()).thenReturn(ConsistencyLevel.CL.QUORUM);
> when(mockJobInfo.effectiveSidecarPort()).thenReturn(9043);
> when(mockJobInfo.jobKeepAliveMinutes()).thenReturn(-1);
> when(mockWriterContext.job()).thenReturn(mockJobInfo);
> BulkWriteValidator writerValidator = new
> BulkWriteValidator(mockWriterContext, new
> ReplicaAwareFailureHandler<>(Partitioner.Murmur3Partitioner));
> assertThatThrownBy(() -> writerValidator.validateClOrFail(topology))
> .isExactlyInstanceOf(RuntimeException.class)
> .hasMessageContaining("Failed to load");
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]