[
https://issues.apache.org/jira/browse/CASSANDRA-12694?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15548420#comment-15548420
]
Alex Petrov commented on CASSANDRA-12694:
-----------------------------------------
Thank you for the comment.
The javadoc on {{ColumnFilter}} also says that it's ok to use selection for
some internal purposes, and it seems to me that this is exactly the case.
Problem with switching to {{allColumns}} is that we (yet again) are going to
break the failure result (which is not a problem on in unit tests, but we'll
have even more special-casing on LWTs in dtest code), which was exactly the
reason why I've chosen changing {{columnsToRead}} instead. I have tried the
approach you describe and have opted out for the current version.
I went through all combinations and cases and having the mentioned conditions
satisfies all the requirements and can guarantee that we know whether or not
partition exists, both in case with static and partition conditions and does
not break the existing behaviour of what we return on CAS failure. We also did
not do the same change (query all columns) in [CASSANDRA-12060] and opted out
for special-casing static columns with {{LIMIT 1}} in order to make sure that
partition exists.
> PAXOS Update Corrupted empty row exception
> ------------------------------------------
>
> Key: CASSANDRA-12694
> URL: https://issues.apache.org/jira/browse/CASSANDRA-12694
> Project: Cassandra
> Issue Type: Bug
> Components: Local Write-Read Paths
> Environment: 3 node cluster using RF=3 running on cassandra 3.7
> Reporter: Cameron Zemek
> Assignee: Alex Petrov
>
> {noformat}
> cqlsh> create table test.test (test_id TEXT, last_updated TIMESTAMP,
> message_id TEXT, PRIMARY KEY(test_id));
> update test.test set last_updated = 1474494363669 where test_id = 'test1' if
> message_id = null;
> {noformat}
> Then nodetool flush on the all 3 nodes.
> {noformat}
> cqlsh> update test.test set last_updated = 1474494363669 where test_id =
> 'test1' if message_id = null;
> ServerError: <ErrorMessage code=0000 [Server error] message="java.io.IOError:
> java.io.IOException: Corrupt empty row found in unfiltered partition">
> {noformat}
> From cassandra log
> {noformat}
> ERROR [SharedPool-Worker-1] 2016-09-23 12:09:13,179 Message.java:611 -
> Unexpected exception during request; channel = [id: 0x7a22599e,
> L:/127.0.0.1:9042 - R:/127.0.0.1:58297]
> java.io.IOError: java.io.IOException: Corrupt empty row found in unfiltered
> partition
> at
> org.apache.cassandra.db.rows.UnfilteredRowIteratorSerializer$1.computeNext(UnfilteredRowIteratorSerializer.java:224)
> ~[main/:na]
> at
> org.apache.cassandra.db.rows.UnfilteredRowIteratorSerializer$1.computeNext(UnfilteredRowIteratorSerializer.java:212)
> ~[main/:na]
> at
> org.apache.cassandra.utils.AbstractIterator.hasNext(AbstractIterator.java:47)
> ~[main/:na]
> at
> org.apache.cassandra.db.rows.UnfilteredRowIterators.digest(UnfilteredRowIterators.java:125)
> ~[main/:na]
> at
> org.apache.cassandra.db.partitions.UnfilteredPartitionIterators.digest(UnfilteredPartitionIterators.java:249)
> ~[main/:na]
> at
> org.apache.cassandra.db.ReadResponse.makeDigest(ReadResponse.java:87)
> ~[main/:na]
> at
> org.apache.cassandra.db.ReadResponse$DataResponse.digest(ReadResponse.java:192)
> ~[main/:na]
> at
> org.apache.cassandra.service.DigestResolver.resolve(DigestResolver.java:80)
> ~[main/:na]
> at
> org.apache.cassandra.service.ReadCallback.get(ReadCallback.java:139)
> ~[main/:na]
> at
> org.apache.cassandra.service.AbstractReadExecutor.get(AbstractReadExecutor.java:145)
> ~[main/:na]
> at
> org.apache.cassandra.service.StorageProxy$SinglePartitionReadLifecycle.awaitResultsAndRetryOnDigestMismatch(StorageProxy.java:1714)
> ~[main/:na]
> at
> org.apache.cassandra.service.StorageProxy.fetchRows(StorageProxy.java:1663)
> ~[main/:na]
> at
> org.apache.cassandra.service.StorageProxy.readRegular(StorageProxy.java:1604)
> ~[main/:na]
> at
> org.apache.cassandra.service.StorageProxy.read(StorageProxy.java:1523)
> ~[main/:na]
> at
> org.apache.cassandra.service.StorageProxy.readOne(StorageProxy.java:1497)
> ~[main/:na]
> at
> org.apache.cassandra.service.StorageProxy.readOne(StorageProxy.java:1491)
> ~[main/:na]
> at
> org.apache.cassandra.service.StorageProxy.cas(StorageProxy.java:249)
> ~[main/:na]
> at
> org.apache.cassandra.cql3.statements.ModificationStatement.executeWithCondition(ModificationStatement.java:441)
> ~[main/:na]
> at
> org.apache.cassandra.cql3.statements.ModificationStatement.execute(ModificationStatement.java:416)
> ~[main/:na]
> at
> org.apache.cassandra.cql3.QueryProcessor.processStatement(QueryProcessor.java:208)
> ~[main/:na]
> at
> org.apache.cassandra.cql3.QueryProcessor.process(QueryProcessor.java:239)
> ~[main/:na]
> at
> org.apache.cassandra.cql3.QueryProcessor.process(QueryProcessor.java:224)
> ~[main/:na]
> at
> org.apache.cassandra.transport.messages.QueryMessage.execute(QueryMessage.java:115)
> ~[main/:na]
> at
> org.apache.cassandra.transport.Message$Dispatcher.channelRead0(Message.java:507)
> [main/:na]
> at
> org.apache.cassandra.transport.Message$Dispatcher.channelRead0(Message.java:401)
> [main/:na]
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)