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

Reply via email to