From e936b2cc1ba7f525c636de5f9fb1780ca70f1762 Mon Sep 17 00:00:00 2001 From: Jordan West Date: Mon, 9 Jan 2023 12:04:50 -0800 Subject: [PATCH] fix serialization error in getsstables --show-levels Patch by Jordan West; Reviewed by Brandon Williams, Cheng Wang for CASSANDRA-18140; --- CHANGES.txt | 1 + .../cassandra/db/ColumnFamilyStore.java | 19 +++++++++++++------ .../cassandra/db/ColumnFamilyStoreMBean.java | 2 +- .../org/apache/cassandra/tools/NodeProbe.java | 3 +-- .../cassandra/tools/nodetool/GetSSTables.java | 4 ++-- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 6ffdfb89aae1..682316e39731 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 4.2 + * Fix serialization error in new getsstables --show-levels option (CASSANDRA-18140) * Use checked casts when reading vints as ints (CASSANDRA-18099) * Add Mutation Serialization Caching (CASSANDRA-17998) * Only reload compaction strategies if disk boundaries change (CASSANDRA-17874) diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java index b00a77ab408c..d656c373804d 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java @@ -64,12 +64,10 @@ import com.google.common.base.Predicates; import com.google.common.base.Strings; import com.google.common.base.Throwables; -import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import com.google.common.util.concurrent.RateLimiter; import org.slf4j.Logger; @@ -1946,14 +1944,23 @@ public List getSSTablesForKey(String key, boolean hexFormat) return withSSTablesForKey(key, hexFormat, SSTableReader::getFilename); } - public Map> getSSTablesForKeyWithLevel(String key, boolean hexFormat) + public Map> getSSTablesForKeyWithLevel(String key, boolean hexFormat) { List> ssts = withSSTablesForKey(key, hexFormat, sstr -> Pair.create(sstr.getSSTableLevel(), sstr.getFilename())); - Multimap result = HashMultimap.create(); + HashMap> result = new HashMap<>(); for (Pair sst : ssts) - result.put(sst.left, sst.right); + { + Set perLevel = result.get(sst.left); + if (perLevel == null) + { + perLevel = new HashSet<>(); + result.put(sst.left, perLevel); + } - return result.asMap(); + perLevel.add(sst.right); + } + + return result; } public List withSSTablesForKey(String key, boolean hexFormat, Function mapper) diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java b/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java index 629f431547df..1a90875c4f50 100644 --- a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java +++ b/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java @@ -168,7 +168,7 @@ public interface ColumnFamilyStoreMBean * @param hexFormat * @return list of filenames and levels containing the key */ - public Map> getSSTablesForKeyWithLevel(String key, boolean hexFormat); + public Map> getSSTablesForKeyWithLevel(String key, boolean hexFormat); /** * Load new sstables from the given directory diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java index 687ab0a0ab51..9217ff36c6ae 100644 --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@ -30,7 +30,6 @@ import java.rmi.server.RMISocketFactory; import java.util.AbstractMap; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -1045,7 +1044,7 @@ public List getSSTables(String keyspace, String cf, String key, boolean return cfsProxy.getSSTablesForKey(key, hexFormat); } - public Map> getSSTablesWithLevel(String keyspace, String cf, String key, boolean hexFormat) + public Map> getSSTablesWithLevel(String keyspace, String cf, String key, boolean hexFormat) { ColumnFamilyStoreMBean cfsProxy = getCfsProxy(keyspace, cf); return cfsProxy.getSSTablesForKeyWithLevel(key, hexFormat); diff --git a/src/java/org/apache/cassandra/tools/nodetool/GetSSTables.java b/src/java/org/apache/cassandra/tools/nodetool/GetSSTables.java index e321e31f2009..657e0ec61990 100644 --- a/src/java/org/apache/cassandra/tools/nodetool/GetSSTables.java +++ b/src/java/org/apache/cassandra/tools/nodetool/GetSSTables.java @@ -22,9 +22,9 @@ import io.airlift.airline.Command; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Set; import io.airlift.airline.Option; import org.apache.cassandra.tools.NodeProbe; @@ -54,7 +54,7 @@ public void execute(NodeProbe probe) if (showLevels && probe.isLeveledCompaction(ks, cf)) { - Map> sstables = probe.getSSTablesWithLevel(ks, cf, key, hexFormat); + Map> sstables = probe.getSSTablesWithLevel(ks, cf, key, hexFormat); for (Integer level : sstables.keySet()) for (String sstable : sstables.get(level)) probe.output().out.println(level + ": " + sstable);