Merge branch 'cassandra-3.11' into trunk * cassandra-3.11: Potential AssertionError during ReadRepair of range tombstone and partition deletions
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/652d9f64 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/652d9f64 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/652d9f64 Branch: refs/heads/trunk Commit: 652d9f64f14d8375a8412561271a7abf27722f20 Parents: d2dcd7f ed9b04d Author: Sylvain Lebresne <[email protected]> Authored: Thu Aug 24 11:39:35 2017 +0200 Committer: Sylvain Lebresne <[email protected]> Committed: Thu Aug 24 11:39:35 2017 +0200 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../org/apache/cassandra/db/ReadResponse.java | 22 +++++ .../db/partitions/AbstractBTreePartition.java | 16 ++-- .../db/partitions/PartitionUpdate.java | 9 ++ .../apache/cassandra/service/DataResolver.java | 70 +++++++++++++-- .../cassandra/service/DataResolverTest.java | 91 +++++++++++++++++++- 6 files changed, 193 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/652d9f64/CHANGES.txt ---------------------------------------------------------------------- diff --cc CHANGES.txt index d0ec78d,b22cb5e..e19e9dd --- a/CHANGES.txt +++ b/CHANGES.txt @@@ -129,7 -6,9 +129,8 @@@ * Duplicate the buffer before passing it to analyser in SASI operation (CASSANDRA-13512) * Properly evict pstmts from prepared statements cache (CASSANDRA-13641) Merged from 3.0: + * Potential AssertionError during ReadRepair of range tombstone and partition deletions (CASSANDRA-13719) * Don't let stress write warmup data if n=0 (CASSANDRA-13773) - * Gossip thread slows down when using batch commit log (CASSANDRA-12966) * Randomize batchlog endpoint selection with only 1 or 2 racks (CASSANDRA-12884) * Fix digest calculation for counter cells (CASSANDRA-13750) * Fix ColumnDefinition.cellValueType() for non-frozen collection and change SSTabledump to use type.toJSONString() (CASSANDRA-13573) http://git-wip-us.apache.org/repos/asf/cassandra/blob/652d9f64/src/java/org/apache/cassandra/db/ReadResponse.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/652d9f64/src/java/org/apache/cassandra/db/partitions/AbstractBTreePartition.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/db/partitions/AbstractBTreePartition.java index d8f2856,90db062..d913cb3 --- a/src/java/org/apache/cassandra/db/partitions/AbstractBTreePartition.java +++ b/src/java/org/apache/cassandra/db/partitions/AbstractBTreePartition.java @@@ -94,10 -99,10 +94,10 @@@ public abstract class AbstractBTreePart public DeletionTime partitionLevelDeletion() { - return holder().deletionInfo.getPartitionDeletion(); + return deletionInfo().getPartitionDeletion(); } - public PartitionColumns columns() + public RegularAndStaticColumns columns() { return holder().columns; } @@@ -317,16 -322,21 +317,20 @@@ { StringBuilder sb = new StringBuilder(); - sb.append(String.format("[%s] key=%s columns=%s", - metadata().toString(), - sb.append(String.format("[%s.%s] key=%s partition_deletion=%s columns=%s", - metadata.ksName, - metadata.cfName, - metadata.getKeyValidator().getString(partitionKey().getKey()), ++ sb.append(String.format("[%s] key=%s partition_deletion=%s columns=%s", ++ metadata(), + metadata().partitionKeyType.getString(partitionKey().getKey()), + partitionLevelDeletion(), columns())); if (staticRow() != Rows.EMPTY_STATIC_ROW) - sb.append("\n ").append(staticRow().toString(metadata())); - sb.append("\n ").append(staticRow().toString(metadata, true)); ++ sb.append("\n ").append(staticRow().toString(metadata(), true)); - for (Row row : this) - sb.append("\n ").append(row.toString(metadata())); + try (UnfilteredRowIterator iter = unfilteredIterator()) + { + while (iter.hasNext()) - sb.append("\n ").append(iter.next().toString(metadata, true)); ++ sb.append("\n ").append(iter.next().toString(metadata(), true)); + } return sb.toString(); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/652d9f64/src/java/org/apache/cassandra/db/partitions/PartitionUpdate.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/652d9f64/src/java/org/apache/cassandra/service/DataResolver.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/service/DataResolver.java index d844ece,116dadd..78bbe16 --- a/src/java/org/apache/cassandra/service/DataResolver.java +++ b/src/java/org/apache/cassandra/service/DataResolver.java @@@ -289,6 -302,37 +302,37 @@@ public class DataResolver extends Respo public void onMergedRangeTombstoneMarkers(RangeTombstoneMarker merged, RangeTombstoneMarker[] versions) { + try + { + // The code for merging range tombstones is a tad complex and we had the assertions there triggered + // unexpectedly in a few occasions (CASSANDRA-13237, CASSANDRA-13719). It's hard to get insights + // when that happen without more context that what the assertion errors give us however, hence the + // catch here that basically gather as much as context as reasonable. + internalOnMergedRangeTombstoneMarkers(merged, versions); + } + catch (AssertionError e) + { + // The following can be pretty verbose, but it's really only triggered if a bug happen, so we'd + // rather get more info to debug than not. - CFMetaData table = command.metadata(); - String details = String.format("Error merging RTs on %s.%s: merged=%s, versions=%s, sources={%s}, responses:%n %s", - table.ksName, table.cfName, ++ TableMetadata table = command.metadata(); ++ String details = String.format("Error merging RTs on %s: merged=%s, versions=%s, sources={%s}, responses:%n %s", ++ table, + merged == null ? "null" : merged.toString(table), + '[' + Joiner.on(", ").join(Iterables.transform(Arrays.asList(versions), rt -> rt == null ? "null" : rt.toString(table))) + ']', + Arrays.toString(sources), + makeResponsesDebugString()); + throw new AssertionError(details, e); + } + } + + private String makeResponsesDebugString() + { + return Joiner.on(",\n") + .join(Iterables.transform(getMessages(), m -> m.from + " => " + m.payload.toDebugString(command, partitionKey))); + } + + private void internalOnMergedRangeTombstoneMarkers(RangeTombstoneMarker merged, RangeTombstoneMarker[] versions) + { // The current deletion as of dealing with this marker. DeletionTime currentDeletion = currentDeletion(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/652d9f64/test/unit/org/apache/cassandra/service/DataResolverTest.java ---------------------------------------------------------------------- --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
