Repository: cassandra Updated Branches: refs/heads/cassandra-2.1 bc1f53aaf -> 107f5ba9b refs/heads/cassandra-2.1.0 17b26a2ae -> e2219ebd8 refs/heads/trunk 23bc39340 -> 1f58592c3
Fix sstablelevelresetter hang patch by yukim; reviewed by krummas for CASSANDRA-7614 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/e2219ebd Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/e2219ebd Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/e2219ebd Branch: refs/heads/cassandra-2.1 Commit: e2219ebd8f30cd023affc76c3a3b20f3cb37fb9f Parents: 17b26a2 Author: Yuki Morishita <yu...@apache.org> Authored: Fri Jul 25 10:31:50 2014 -0500 Committer: Yuki Morishita <yu...@apache.org> Committed: Fri Jul 25 10:36:45 2014 -0500 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../cassandra/tools/SSTableLevelResetter.java | 62 ++++++++++++++------ 2 files changed, 45 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/e2219ebd/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 772e1f6..7a26fa6 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -6,6 +6,7 @@ * Get java version correctly when JAVA_TOOL_OPTIONS is set (CASSANDRA-7572) * Fix NPE when dropping index from non-existent keyspace, AssertionError when dropping non-existent index with IF EXISTS (CASSANDRA-7590) + * Fix sstablelevelresetter hang (CASSANDRA-7614) Merged from 2.0: * Fix ReversedType(DateType) mapping to native protocol (CASSANDRA-7576) * Always merge ranges owned by a single node (CASSANDRA-6930) http://git-wip-us.apache.org/repos/asf/cassandra/blob/e2219ebd/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java b/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java index 2d95ad2..4c5e101 100644 --- a/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java +++ b/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.Set; import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.ColumnFamilyStore; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.io.sstable.Component; @@ -56,29 +57,54 @@ public class SSTableLevelResetter System.exit(1); } - // load keyspace descriptions. - DatabaseDescriptor.loadSchemas(); - - String keyspaceName = args[1]; - String columnfamily = args[2]; - Keyspace keyspace = Keyspace.openWithoutSSTables(keyspaceName); - ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(columnfamily); - boolean foundSSTable = false; - for (Map.Entry<Descriptor, Set<Component>> sstable : cfs.directories.sstableLister().list().entrySet()) + // TODO several daemon threads will run from here. + // So we have to explicitly call System.exit. + try { - if (sstable.getValue().contains(Component.STATS)) + // load keyspace descriptions. + DatabaseDescriptor.loadSchemas(); + + String keyspaceName = args[1]; + String columnfamily = args[2]; + // validate columnfamily + if (Schema.instance.getCFMetaData(keyspaceName, columnfamily) == null) { - foundSSTable = true; - Descriptor descriptor = sstable.getKey(); - StatsMetadata metadata = (StatsMetadata) descriptor.getMetadataSerializer().deserialize(descriptor, MetadataType.STATS); - out.println("Changing level from " + metadata.sstableLevel + " to 0 on " + descriptor.filenameFor(Component.DATA)); - descriptor.getMetadataSerializer().mutateLevel(descriptor, 0); + System.err.println("ColumnFamily not found: " + keyspaceName + "/" + columnfamily); + System.exit(1); + } + + Keyspace keyspace = Keyspace.openWithoutSSTables(keyspaceName); + ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(columnfamily); + boolean foundSSTable = false; + for (Map.Entry<Descriptor, Set<Component>> sstable : cfs.directories.sstableLister().list().entrySet()) + { + if (sstable.getValue().contains(Component.STATS)) + { + foundSSTable = true; + Descriptor descriptor = sstable.getKey(); + StatsMetadata metadata = (StatsMetadata) descriptor.getMetadataSerializer().deserialize(descriptor, MetadataType.STATS); + if (metadata.sstableLevel > 0) + { + out.println("Changing level from " + metadata.sstableLevel + " to 0 on " + descriptor.filenameFor(Component.DATA)); + descriptor.getMetadataSerializer().mutateLevel(descriptor, 0); + } + else + { + out.println("Skipped " + descriptor.filenameFor(Component.DATA) + " since it is already on level 0"); + } + } } - } - if (!foundSSTable) + if (!foundSSTable) + { + out.println("Found no sstables, did you give the correct keyspace/columnfamily?"); + } + } + catch (Throwable e) { - out.println("Found no sstables, did you give the correct keyspace/columnfamily?"); + e.printStackTrace(); + System.exit(1); } + System.exit(0); } }