You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ma...@apache.org on 2020/09/25 05:49:27 UTC
[cassandra] branch trunk updated: Remove bad assert when getting
active compactions for an sstable
This is an automated email from the ASF dual-hosted git repository.
marcuse pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push:
new 8b25cd5 Remove bad assert when getting active compactions for an sstable
8b25cd5 is described below
commit 8b25cd58bfa646db9e6c24c51896950da02945db
Author: Marcus Eriksson <ma...@apache.org>
AuthorDate: Mon Sep 7 10:11:53 2020 +0200
Remove bad assert when getting active compactions for an sstable
Patch by marcuse; reviewed by Blake Eggleston and Yifan Cai for CASSANDRA-15457
---
CHANGES.txt | 1 +
.../cassandra/db/compaction/ActiveCompactions.java | 16 +++++++++-------
.../cassandra/db/repair/PendingAntiCompaction.java | 17 +++++++++++------
3 files changed, 21 insertions(+), 13 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index 2e6715f..ec95e20 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
4.0-beta3
+ * Remove bad assert when getting active compactions for an sstable (CASSANDRA-15457)
* Avoid failing compactions with very large partitions (CASSANDRA-15164)
* Prevent NPE in StreamMessage in type lookup (CASSANDRA-16131)
* Avoid invalid state transition exception during incremental repair (CASSANDRA-16067)
diff --git a/src/java/org/apache/cassandra/db/compaction/ActiveCompactions.java b/src/java/org/apache/cassandra/db/compaction/ActiveCompactions.java
index 5bcb06f..7b6b5bf 100644
--- a/src/java/org/apache/cassandra/db/compaction/ActiveCompactions.java
+++ b/src/java/org/apache/cassandra/db/compaction/ActiveCompactions.java
@@ -19,6 +19,7 @@
package org.apache.cassandra.db.compaction;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.IdentityHashMap;
import java.util.List;
@@ -49,22 +50,23 @@ public class ActiveCompactions implements ActiveCompactionsTracker
}
/**
- * Iterates over the active compactions and tries to find the CompactionInfo for the given sstable
+ * Iterates over the active compactions and tries to find CompactionInfos with the given compactionType for the given sstable
*
* Number of entries in compactions should be small (< 10) but avoid calling in any time-sensitive context
*/
- public CompactionInfo getCompactionForSSTable(SSTableReader sstable)
+ public Collection<CompactionInfo> getCompactionsForSSTable(SSTableReader sstable, OperationType compactionType)
{
- CompactionInfo toReturn = null;
+ List<CompactionInfo> toReturn = null;
synchronized (compactions)
{
for (CompactionInfo.Holder holder : compactions)
{
- if (holder.getCompactionInfo().getSSTables().contains(sstable))
+ CompactionInfo compactionInfo = holder.getCompactionInfo();
+ if (compactionInfo.getSSTables().contains(sstable) && compactionInfo.getTaskType() == compactionType)
{
- if (toReturn != null)
- throw new IllegalStateException("SSTable " + sstable + " involved in several compactions");
- toReturn = holder.getCompactionInfo();
+ if (toReturn == null)
+ toReturn = new ArrayList<>();
+ toReturn.add(compactionInfo);
}
}
}
diff --git a/src/java/org/apache/cassandra/db/repair/PendingAntiCompaction.java b/src/java/org/apache/cassandra/db/repair/PendingAntiCompaction.java
index e49e76e..e0ee68d 100644
--- a/src/java/org/apache/cassandra/db/repair/PendingAntiCompaction.java
+++ b/src/java/org/apache/cassandra/db/repair/PendingAntiCompaction.java
@@ -145,14 +145,19 @@ public class PendingAntiCompaction
}
return false;
}
- CompactionInfo ci = CompactionManager.instance.active.getCompactionForSSTable(sstable);
- if (ci != null && ci.getTaskType() == OperationType.ANTICOMPACTION)
+ Collection<CompactionInfo> cis = CompactionManager.instance.active.getCompactionsForSSTable(sstable, OperationType.ANTICOMPACTION);
+ if (cis != null && !cis.isEmpty())
{
// todo: start tracking the parent repair session id that created the anticompaction to be able to give a better error messsage here:
- String message = String.format("Prepare phase for incremental repair session %s has failed because it encountered " +
- "intersecting sstables (%s) belonging to another incremental repair session. This is " +
- "caused by starting multiple conflicting incremental repairs at the same time", prsid, ci.getSSTables());
- throw new SSTableAcquisitionException(message);
+ StringBuilder sb = new StringBuilder();
+ sb.append("Prepare phase for incremental repair session ");
+ sb.append(prsid);
+ sb.append(" has failed because it encountered intersecting sstables belonging to another incremental repair session. ");
+ sb.append("This is caused by starting multiple conflicting incremental repairs at the same time. ");
+ sb.append("Conflicting anticompactions: ");
+ for (CompactionInfo ci : cis)
+ sb.append(ci.getTaskId() == null ? "no compaction id" : ci.getTaskId()).append(':').append(ci.getSSTables()).append(',');
+ throw new SSTableAcquisitionException(sb.toString());
}
return true;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org