This is an automated email from the ASF dual-hosted git repository. paulo pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit 6501f576e7c663d285a4db207e6b3dc7f887e8f4 Merge: eef76dbbed c9968a8e95 Author: Paulo Motta <pa...@apache.org> AuthorDate: Mon Jan 16 21:49:17 2023 -0500 Merge branch 'cassandra-4.1' into trunk CHANGES.txt | 1 + .../apache/cassandra/io/sstable/Descriptor.java | 68 ++++++--- .../apache/cassandra/io/sstable/SSTableLoader.java | 23 ---- .../cassandra/distributed/test/SnapshotsTest.java | 32 ++++- test/unit/org/apache/cassandra/db/ImportTest.java | 42 ++++++ .../cassandra/io/sstable/DescriptorTest.java | 152 +++++++++++++++++++++ .../cassandra/io/sstable/SSTableLoaderTest.java | 47 ++++++- 7 files changed, 317 insertions(+), 48 deletions(-) diff --cc CHANGES.txt index a3eb241153,017e5748b9..f7dfb6f9ae --- a/CHANGES.txt +++ b/CHANGES.txt @@@ -133,13 -75,6 +133,14 @@@ Merged from 4.1 * Revert removal of withBufferSizeInMB(int size) in CQLSSTableWriter.Builder class and deprecate it in favor of withBufferSizeInMiB(int size) (CASSANDRA-17675) * Remove expired snapshots of dropped tables after restart (CASSANDRA-17619) Merged from 4.0: ++ * Fix sstable loading of keyspaces named snapshots or backups (CASSANDRA-14013) + * Restore internode custom tracing on 4.0's new messaging system (CASSANDRA-17981) + * Harden parsing of boolean values in CQL in PropertyDefinitions (CASSANDRA-17878) + * Fix possible race condition on repair snapshots (CASSANDRA-17955) + * Fix ASM bytecode version inconsistency (CASSANDRA-17873) + * Remove empty cq4 files in log directory to not fail the startup of BinLog (CASSANDRA-17933) + * Fix multiple BufferPool bugs (CASSANDRA-16681) + * Fix StorageService.getNativeaddress handling of IPv6 addresses (CASSANDRA-17945) * Mitigate direct buffer memory OOM on replacements (CASSANDRA-17895) * Fix repair failure on assertion if two peers have overlapping mismatching ranges (CASSANDRA-17900) * Better handle null state in Gossip schema migration to avoid NPE (CASSANDRA-17864) diff --cc src/java/org/apache/cassandra/io/sstable/Descriptor.java index 589e46b015,75d51854f6..23668f966a --- a/src/java/org/apache/cassandra/io/sstable/Descriptor.java +++ b/src/java/org/apache/cassandra/io/sstable/Descriptor.java @@@ -18,12 -18,12 +18,16 @@@ package org.apache.cassandra.io.sstable; import java.util.*; ++import java.util.regex.Matcher; import java.util.regex.Pattern; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Objects; import com.google.common.base.Splitter; ++import org.slf4j.Logger; ++import org.slf4j.LoggerFactory; ++ import org.apache.cassandra.db.Directories; import org.apache.cassandra.io.sstable.format.SSTableFormat; import org.apache.cassandra.io.sstable.format.Version; @@@ -44,6 -44,6 +48,24 @@@ import static org.apache.cassandra.util */ public class Descriptor { ++ private static final Logger logger = LoggerFactory.getLogger(Descriptor.class); ++ ++ // Current SSTable directory format is {keyspace}/{tableName}-{tableId}[/backups|/snapshots/{tag}][/.{indexName}]/{component}.db ++ // * {var} are mandatory components ++ // * [var] are optional components ++ static final Pattern SSTABLE_DIR_PATTERN = Pattern.compile(".*/(?<keyspace>\\w+)/" + ++ "(?<tableName>\\w+)-(?<tableId>[0-9a-f]{32})/" + ++ "(backups/|snapshots/(?<tag>[\\w-]+)/)?" + ++ "(\\.(?<indexName>[\\w-]+)/)?" + ++ "(?<component>[\\w-]+)\\.(?<ext>[\\w]+)$"); ++ ++ // Pre 2.1 SSTable directory format is {keyspace}/{tableName}-{tableId}[/backups|/snapshots/{tag}][/.{indexName}]/{component}.db ++ static final Pattern LEGACY_SSTABLE_DIR_PATTERN = Pattern.compile(".*/(?<keyspace>\\w+)/" + ++ "(?<tableName>\\w+)/" + ++ "(backups/|snapshots/(?<tag>[\\w-]+)/)?" + ++ "(\\.(?<indexName>[\\w-]+)/)?" + ++ "(?<component>[\\w-]+)\\.(?<ext>[\\w]+)$"); ++ private final static String LEGACY_TMP_REGEX_STR = "^((.*)\\-(.*)\\-)?tmp(link)?\\-((?:l|k).)\\-(\\d)*\\-(.*)$"; private final static Pattern LEGACY_TMP_REGEX = Pattern.compile(LEGACY_TMP_REGEX_STR); @@@ -191,7 -191,7 +213,7 @@@ */ public static Descriptor fromFilename(String filename) { -- return fromFilename(new File(filename)); ++ return fromFilenameWithComponent(new File(filename), false).left; } /** @@@ -228,64 -227,12 +250,76 @@@ * versions. */ public static Pair<Descriptor, Component> fromFilenameWithComponent(File file) ++ { ++ return fromFilenameWithComponent(file, true); ++ } ++ ++ public static Pair<Descriptor, Component> fromFilenameWithComponent(File file, boolean validateDirs) { // We need to extract the keyspace and table names from the parent directories, so make sure we deal with the // absolute path. if (!file.isAbsolute()) file = file.toAbsolute(); + SSTableInfo info = validateAndExtractInfo(file); + String name = file.name(); + - File directory = parentOf(name, file); - File tableDir = directory; ++ String keyspaceName = ""; ++ String tableName = ""; ++ ++ Matcher sstableDirMatcher = SSTABLE_DIR_PATTERN.matcher(file.toString()); + - // Check if it's a 2ndary index directory (not that it doesn't exclude it to be also a backup or snapshot) - String indexName = ""; - if (tableDir.name().startsWith(Directories.SECONDARY_INDEX_NAME_SEPARATOR)) ++ // Use pre-2.1 SSTable format if current one does not match it ++ if (!sstableDirMatcher.find(0)) + { - indexName = tableDir.name(); - tableDir = parentOf(name, tableDir); ++ sstableDirMatcher = LEGACY_SSTABLE_DIR_PATTERN.matcher(file.toString()); + } + - // Then it can be a backup or a snapshot - if (tableDir.name().equals(Directories.BACKUPS_SUBDIR)) - tableDir = tableDir.parent(); - else if (parentOf(name, tableDir).name().equals(Directories.SNAPSHOT_SUBDIR)) - tableDir = parentOf(name, parentOf(name, tableDir)); - - String table = tableDir.name().split("-")[0] + indexName; - String keyspace = parentOf(name, tableDir).name(); ++ if (sstableDirMatcher.find(0)) ++ { ++ keyspaceName = sstableDirMatcher.group("keyspace"); ++ tableName = sstableDirMatcher.group("tableName"); ++ String indexName = sstableDirMatcher.group("indexName"); ++ if (indexName != null) ++ { ++ tableName = String.format("%s.%s", tableName, indexName); ++ } ++ } ++ else if (validateDirs) ++ { ++ logger.debug("Could not extract keyspace/table info from sstable directory {}", file.toString()); ++ throw invalidSSTable(name, String.format("cannot extract keyspace and table name from %s; make sure the sstable is in the proper sub-directories", file)); ++ } + - return Pair.create(new Descriptor(info.version, directory, keyspace, table, info.id, info.format), info.component); ++ return Pair.create(new Descriptor(info.version, parentOf(name, file), keyspaceName, tableName, info.id, info.format), info.component); + } + + /** + * Parse a sstable filename, extracting both the {@code Descriptor} and {@code Component} part. + * + * @param file the {@code File} object for the filename to parse. + * @param keyspace The keyspace name of the file. If <code>null</code>, then the keyspace name will be extracted + * from the directory path. + * @param table The table name of the file. If <code>null</code>, then the table name will be extracted from the + * directory path. + * @return a pair of the descriptor and component corresponding to the provided {@code file}. + * @throws IllegalArgumentException if the provided {@code file} does point to a valid sstable filename. This could + * mean either that the filename doesn't look like a sstable file, or that it is for an old and unsupported + * versions. + */ + public static Pair<Descriptor, Component> fromFilenameWithComponent(File file, String keyspace, String table) + { + if (null == keyspace || null == table) + { + return fromFilenameWithComponent(file); + } + + SSTableInfo info = validateAndExtractInfo(file); + return Pair.create(new Descriptor(info.version, parentOf(file.name(), file), keyspace, table, info.id, info.format), info.component); + } + + private static SSTableInfo validateAndExtractInfo(File file) + { String name = file.name(); List<String> tokens = filenameSplitter.splitToList(name); int size = tokens.size(); diff --cc test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java index 83a6efc95c,405f3da4f3..7ffb63f335 --- a/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java @@@ -154,5 -154,155 +154,157 @@@ public class DescriptorTes } } + @Test + public void testKeyspaceTableParsing() + { + // from Cassandra dirs + + String[] filePaths = new String[]{ - "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/snapshots/snapshot/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/backups/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/snapshots/snapshot/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/nb-1-big-TOC.txt", ++ "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/snapshots/snapshot/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/backups/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/snapshots/snapshot/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", + }; + + testKeyspaceTableParsing(filePaths, "ks1", "tab1"); + + // indexes + + String[] filePathsIndexes = new String[]{ - "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/.index/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/snapshots/snapshot/.index/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/backups/.index/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/snapshots/snapshot/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/backups/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/.index/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/snapshots/snapshot/.index/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/backups/.index/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/snapshots/snapshot/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/backups/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", + }; + + testKeyspaceTableParsing(filePathsIndexes, "ks1", "tab1.index"); + + // what if even a snapshot of a keyspace and table called snapshots is called snapshots? + + String[] filePathsWithSnapshotKeyspaceAndTable = new String[]{ - "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/snapshots/snapshots/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/backups/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/snapshots/snapshots/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/snapshots/snapshots/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/backups/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/snapshots/snapshots/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", + }; + + testKeyspaceTableParsing(filePathsWithSnapshotKeyspaceAndTable, "snapshots", "snapshots"); + + String[] filePathsWithSnapshotKeyspaceAndTableWithIndices = new String[]{ - "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/.index/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/snapshots/snapshots/.index/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/backups/.index/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/snapshots/snapshots/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/backups/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/.index/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/snapshots/snapshots/.index/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/backups/.index/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/snapshots/snapshots/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/backups/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", + }; + + testKeyspaceTableParsing(filePathsWithSnapshotKeyspaceAndTableWithIndices, "snapshots", "snapshots.index"); + + // what if keyspace and table is called backups? + + String[] filePathsWithBackupsKeyspaceAndTable = new String[]{ - "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/snapshots/snapshots/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/backups/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/snapshots/snapshots/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/snapshots/snapshots/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/backups/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/snapshots/snapshots/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", + }; + + testKeyspaceTableParsing(filePathsWithBackupsKeyspaceAndTable, "backups", "backups"); + + // what if legacy keyspace and table is called backups? + + String[] legacyFilePathsWithBackupsKeyspaceAndTable = new String[]{ + "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups/nb-1-big-TOC.txt", + //"/path/to/cassandra/data/dir2/dir5/dir6/backups/backups/snapshots/snapshots/na-1-big-Index.db", #not supported (CASSANDRA-14013) + "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups/backups/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups/nb-22-big-Index.db", - //"/path/to/cassandra/data/dir2/dir5/dir6/backups/backups/snapshots/snapshots/nb-22-big-Index.db", #not supported (CASSANDRA-14013) - "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups/backups/nb-22-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ //"/path/to/cassandra/data/dir2/dir5/dir6/backups/backups/snapshots/snapshots/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", #not supported (CASSANDRA-14013) ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", + }; + testKeyspaceTableParsing(legacyFilePathsWithBackupsKeyspaceAndTable, "backups", "backups"); + + // what if even a snapshot of a keyspace and table called backups is called snapshots? + + String[] filePathsWithBackupsKeyspaceAndTableWithIndices = new String[]{ - "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/.index/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/snapshots/snapshots/.index/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/backups/.index/na-1-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/snapshots/snapshots/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/backups/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/.index/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/snapshots/snapshots/.index/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/backups/.index/na-1-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/snapshots/snapshots/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/backups/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", + }; + + testKeyspaceTableParsing(filePathsWithBackupsKeyspaceAndTableWithIndices, "backups", "backups.index"); + + String[] outsideOfCassandra = new String[]{ - "/tmp/some/path/tests/keyspace/table-3424234234234/na-1-big-Index.db", - "/tmp/some/path/tests/keyspace/table-3424234234234/snapshots/snapshots/na-1-big-Index.db", - "/tmp/some/path/tests/keyspace/table-3424234234234/backups/na-1-big-Index.db", - "/tmp/tests/keyspace/table-3424234234234/na-1-big-Index.db", - "/keyspace/table-3424234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/tmp/some/path/tests/keyspace/table-3424234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/tmp/some/path/tests/keyspace/table-3424234234234/snapshots/snapshots/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/tmp/some/path/tests/keyspace/table-3424234234234/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/tmp/tests/keyspace/table-3424234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/keyspace/table-3424234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db" ++ "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/na-1-big-Index.db", ++ "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/snapshots/snapshots/na-1-big-Index.db", ++ "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/backups/na-1-big-Index.db", ++ "/tmp/tests/keyspace/table-34234234234234234234234234234234/na-1-big-Index.db", ++ "/keyspace/table-34234234234234234234234234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/snapshots/snapshots/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/tmp/tests/keyspace/table-34234234234234234234234234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/keyspace/table-34234234234234234234234234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db" + }; + + testKeyspaceTableParsing(outsideOfCassandra, "keyspace", "table"); + + String[] outsideOfCassandraUppercaseKeyspaceAndTable = new String[]{ - "/tmp/some/path/tests/Keyspace/Table-23424324234234/na-1-big-Index.db", - "/tmp/some/path/tests/Keyspace/Table-23424324234234/snapshots/snapshots/na-1-big-Index.db", - "/tmp/some/path/tests/Keyspace/Table-23424324234234/backups/na-1-big-Index.db", - "/tmp/tests/Keyspace/Table-23424324234234/na-1-big-Index.db", - "/Keyspace/Table-23424324234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/tmp/some/path/tests/Keyspace/Table-23424324234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/tmp/some/path/tests/Keyspace/Table-23424324234234/snapshots/snapshots/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/tmp/some/path/tests/Keyspace/Table-23424324234234/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/tmp/tests/Keyspace/Table-23424324234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/Keyspace/Table-23424324234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db" ++ "/tmp/some/path/tests/Keyspace/Table-34234234234234234234234234234234/na-1-big-Index.db", ++ "/tmp/some/path/tests/Keyspace/Table-34234234234234234234234234234234/snapshots/snapshots/na-1-big-Index.db", ++ "/tmp/some/path/tests/Keyspace/Table-34234234234234234234234234234234/backups/na-1-big-Index.db", ++ "/tmp/tests/Keyspace/Table-34234234234234234234234234234234/na-1-big-Index.db", ++ "/Keyspace/Table-34234234234234234234234234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/tmp/some/path/tests/Keyspace/Table-34234234234234234234234234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/tmp/some/path/tests/Keyspace/Table-34234234234234234234234234234234/snapshots/snapshots/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/tmp/some/path/tests/Keyspace/Table-34234234234234234234234234234234/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/tmp/tests/Keyspace/Table-34234234234234234234234234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/Keyspace/Table-34234234234234234234234234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db" + }; + + testKeyspaceTableParsing(outsideOfCassandraUppercaseKeyspaceAndTable, "Keyspace", "Table"); + + String[] outsideOfCassandraIndexes = new String[]{ - "/tmp/some/path/tests/keyspace/table-32423423423423/.index/na-1-big-Index.db", - "/tmp/some/path/tests/keyspace/table-32423423423423/snapshots/snapshots/.index/na-1-big-Index.db", - "/tmp/some/path/tests/keyspace/table-32423423423423/backups/.index/na-1-big-Index.db", - "/tmp/some/path/tests/keyspace/table-32423423423423/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/tmp/some/path/tests/keyspace/table-32423423423423/snapshots/snapshots/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", - "/tmp/some/path/tests/keyspace/table-32423423423423/backups/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db" ++ "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/.index/na-1-big-Index.db", ++ "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/snapshots/snapshots/.index/na-1-big-Index.db", ++ "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/backups/.index/na-1-big-Index.db", ++ "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/snapshots/snapshots/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db", ++ "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/backups/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db" + }; + + testKeyspaceTableParsing(outsideOfCassandraIndexes, "keyspace", "table.index"); + + String[] counterFiles = new String[] { + "/path/to/cassandra/data/dir2/dir6_other/Keyspace1/counter1-246467e01ea111ebbeafc3f73b4a4f2e/na-3-big-CRC.db", + "/path/to/cassandra/data/dir2/dir6_other/Keyspace1/counter1-246467e01ea111ebbeafc3f73b4a4f2e/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db" + }; + + testKeyspaceTableParsing(counterFiles, "Keyspace1", "counter1"); + } + + private void testKeyspaceTableParsing(String[] filePaths, String expectedKeyspace, String expectedTable) + { + for (String filePath : filePaths) + { + Descriptor descriptor = Descriptor.fromFilename(filePath); + Assert.assertNotNull(descriptor); - Assert.assertEquals(expectedKeyspace, descriptor.ksname); - Assert.assertEquals(expectedTable, descriptor.cfname); ++ Assert.assertEquals(String.format("Expected keyspace not found for %s", filePath), expectedKeyspace, descriptor.ksname); ++ Assert.assertEquals(String.format("Expected table not found for %s", filePath), expectedTable, descriptor.cfname); + } + } } diff --cc test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java index 0af6d24a0a,c2403ddb20..d2108886ab --- a/test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java +++ b/test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java @@@ -34,6 -33,6 +34,7 @@@ import org.junit.Test import org.apache.cassandra.SchemaLoader; import org.apache.cassandra.Util; import org.apache.cassandra.locator.Replica; ++import org.apache.cassandra.schema.TableId; import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.schema.TableMetadataRef; import org.apache.cassandra.schema.Schema; @@@ -278,8 -256,19 +281,31 @@@ public class SSTableLoaderTes @Test public void testLoadingBackupsTable() throws Exception { - File dataDir = dataDir(CF_BACKUPS); - TableMetadata metadata = Schema.instance.getTableMetadata(KEYSPACE1, CF_BACKUPS); - testLoadingTable(CF_BACKUPS); ++ testLoadingTable(CF_BACKUPS, false); + } + + @Test + public void testLoadingSnapshotsTable() throws Exception + { - testLoadingTable(CF_SNAPSHOTS); ++ testLoadingTable(CF_SNAPSHOTS, false); + } + - private void testLoadingTable(String tableName) throws Exception ++ @Test ++ public void testLoadingLegacyBackupsTable() throws Exception + { - File dataDir = dataDir(tableName); ++ testLoadingTable(CF_BACKUPS, true); ++ } ++ ++ @Test ++ public void testLoadingLegacySnapshotsTable() throws Exception ++ { ++ testLoadingTable(CF_SNAPSHOTS, true); ++ } ++ ++ private void testLoadingTable(String tableName, boolean isLegacyTable) throws Exception ++ { ++ File dataDir = dataDir(tableName, isLegacyTable); + TableMetadata metadata = Schema.instance.getTableMetadata(KEYSPACE1, tableName); try (CQLSSTableWriter writer = CQLSSTableWriter.builder() .inDirectory(dataDir) @@@ -315,7 -302,7 +341,14 @@@ private File dataDir(String cf) { -- File dataDir = new File(tmpdir.absolutePath() + File.pathSeparator() + SSTableLoaderTest.KEYSPACE1 + File.pathSeparator() + cf); ++ return dataDir(cf, false); ++ } ++ ++ private File dataDir(String cf, boolean isLegacyTable) ++ { ++ // Add -{tableUuid} suffix to table dir if not a legacy table ++ File dataDir = new File(tmpdir.absolutePath() + File.pathSeparator() + SSTableLoaderTest.KEYSPACE1 + File.pathSeparator() + cf ++ + (isLegacyTable ? "" : String.format("-%s",TableId.generate().toHexString()))); assert dataDir.tryCreateDirectories(); //make sure we have no tables... assertEquals(Objects.requireNonNull(dataDir.tryList()).length, 0); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org