[ https://issues.apache.org/jira/browse/CASSANDRA-15363?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16954592#comment-16954592 ]
Benedict Elliott Smith commented on CASSANDRA-15363: ---------------------------------------------------- The patch LGTM. I've done my best to guarantee we cannot erroneously produce a row marker in 3.0: [here|https://github.com/apache/cassandra/blob/665f74740ce48bf476a9941793d44d9c588eca3c/src/java/org/apache/cassandra/db/RowUpdateBuilder.java#L89] we guarantee only to produce row markers for CQL3 tables, which is defined as excluding static compact tables [here|https://github.com/apache/cassandra/blob/fc862e207b04ed92f15b2129ae7738186ebc6d69/src/java/org/apache/cassandra/config/CFMetaData.java#L1172] However, in 2.1 we _seem_ to be able to [here|https://github.com/apache/cassandra/blob/64d8a1d9fdacf3e7396cdf2f5c61171c1c9bccf2/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java#L940], and nowhere else. It seems to be an oversight that we do so here, as all other commentary and location rule out doing so. Since this is only on _select_, I don't think any problematic scenario can arise that wouldn't already be covered by the patch. Marcus has also experimentally tried to produce such a row marker in a mixed-mode cluster and failed to do so. So I think we're OK in that respect. However, I do wonder if it would be worth being ultra paranoid and modifying {{LegacyLayout.fromRow}} to simply never convert any row deletion into a range tombstone for compact tables, since they make no sense - a compact table row deletion is equivalent to a cell deletion. > Read repair in mixed mode between 2.1 and 3.0 on COMPACT STORAGE tables > causes unreadable sstables after upgrade > ---------------------------------------------------------------------------------------------------------------- > > Key: CASSANDRA-15363 > URL: https://issues.apache.org/jira/browse/CASSANDRA-15363 > Project: Cassandra > Issue Type: Bug > Components: Consistency/Coordination > Reporter: Marcus Eriksson > Assignee: Marcus Eriksson > Priority: Normal > Fix For: 3.0.x, 3.11.x > > > if we have a table like this: > {{CREATE TABLE tbl (pk ascii, b boolean, v blob, PRIMARY KEY (pk)) WITH > COMPACT STORAGE}} > with a cluster where node1 is 2.1 and node2 is 3.0 (during upgrade): > * node2 coordinates a delete {{DELETE FROM tbl WHERE pk = 'something'}} which > node1 does not get > * node1 coordinates a quorum read {{SELECT * FROM tbl WHERE id = > 'something'}} which causes a read repair > * this makes node1 flush an sstable like this: > {code} > [ > {"key": "something", > "metadata": {"deletionInfo": > {"markedForDeleteAt":1571388944364000,"localDeletionTime":1571388944}}, > "cells": [["b","b",1571388944364000,"t",1571388944], > ["v","v",1571388944364000,"t",1571388944]]} > ] > {code} > (It has range tombstones which are covered by the partition deletion) > Then, when we upgrade this node to 3.0 and try to read or run > upgradesstables, we get this: > {code} > ERROR [node1_CompactionExecutor:1] node1 2019-10-18 10:44:11,325 > DebuggableThreadPoolExecutor.java:242 - Error in ThreadPoolExecutor > java.lang.UnsupportedOperationException: null > at > org.apache.cassandra.db.LegacyLayout.extractStaticColumns(LegacyLayout.java:779) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.io.sstable.SSTableSimpleIterator$OldFormatIterator.readStaticRow(SSTableSimpleIterator.java:120) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.io.sstable.SSTableIdentityIterator.<init>(SSTableIdentityIterator.java:57) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.io.sstable.format.big.BigTableScanner$KeyScanningIterator$1.initializeIterator(BigTableScanner.java:362) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.db.rows.LazilyInitializedUnfilteredRowIterator.maybeInit(LazilyInitializedUnfilteredRowIterator.java:48) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.db.rows.LazilyInitializedUnfilteredRowIterator.isReverseOrder(LazilyInitializedUnfilteredRowIterator.java:65) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.db.partitions.UnfilteredPartitionIterators$1.reduce(UnfilteredPartitionIterators.java:103) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.db.partitions.UnfilteredPartitionIterators$1.reduce(UnfilteredPartitionIterators.java:94) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.utils.MergeIterator$OneToOne.computeNext(MergeIterator.java:442) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.utils.AbstractIterator.hasNext(AbstractIterator.java:47) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.db.partitions.UnfilteredPartitionIterators$2.hasNext(UnfilteredPartitionIterators.java:144) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.db.transform.BasePartitions.hasNext(BasePartitions.java:92) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.db.compaction.CompactionIterator.hasNext(CompactionIterator.java:227) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.db.compaction.CompactionTask.runMayThrow(CompactionTask.java:190) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.db.compaction.CompactionTask.executeInternal(CompactionTask.java:89) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.db.compaction.AbstractCompactionTask.execute(AbstractCompactionTask.java:61) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.db.compaction.CompactionManager$8.runMayThrow(CompactionManager.java:675) > ~[dtest-3.0.19.jar:na] > at > org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) > ~[dtest-3.0.19.jar:na] > at > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) > ~[na:1.8.0_121] > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > ~[na:1.8.0_121] > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > ~[na:1.8.0_121] > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > [na:1.8.0_121] > at > org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:83) > [dtest-3.0.19.jar:na] > at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_121] > {code} -- This message was sent by Atlassian Jira (v8.3.4#803005) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org