/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.cassandra.io.sstable; import java.io.File; import java.io.IOException; import java.util.UUID; import org.apache.commons.lang3.StringUtils; import org.junit.Assert; import org.junit.Test; import org.apache.cassandra.db.Directories; import org.apache.cassandra.io.sstable.format.SSTableFormat; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.Pair; import static org.junit.Assert.*; public class DescriptorTest { private final String ksname = "ks"; private final String cfname = "cf"; private final String cfId = ByteBufferUtil.bytesToHex(ByteBufferUtil.bytes(UUID.randomUUID())); private final File tempDataDir; public DescriptorTest() throws IOException { // create CF directories, one without CFID and one with it tempDataDir = File.createTempFile("DescriptorTest", null).getParentFile(); } @Test public void testFromFilename() throws Exception { File cfIdDir = new File(tempDataDir.getAbsolutePath() + File.separator + ksname + File.separator + cfname + '-' + cfId); testFromFilenameFor(cfIdDir); } @Test public void testFromFilenameInBackup() throws Exception { File backupDir = new File(StringUtils.join(new String[]{tempDataDir.getAbsolutePath(), ksname, cfname + '-' + cfId, Directories.BACKUPS_SUBDIR}, File.separator)); testFromFilenameFor(backupDir); } @Test public void testFromFilenameInSnapshot() throws Exception { File snapshotDir = new File(StringUtils.join(new String[]{tempDataDir.getAbsolutePath(), ksname, cfname + '-' + cfId, Directories.SNAPSHOT_SUBDIR, "snapshot_name"}, File.separator)); testFromFilenameFor(snapshotDir); } @Test public void testFromFilenameInLegacyDirectory() throws Exception { File cfDir = new File(tempDataDir.getAbsolutePath() + File.separator + ksname + File.separator + cfname); testFromFilenameFor(cfDir); } private void testFromFilenameFor(File dir) { // normal checkFromFilename(new Descriptor(dir, ksname, cfname, 1), false); // skip component (for streaming lock file) checkFromFilename(new Descriptor(dir, ksname, cfname, 2), true); // secondary index String idxName = "myidx"; File idxDir = new File(dir.getAbsolutePath() + File.separator + Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName); checkFromFilename(new Descriptor(idxDir, ksname, cfname + Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName, 4), false); // legacy version checkFromFilename(new Descriptor("ja", dir, ksname, cfname, 1, SSTableFormat.Type.LEGACY), false); // legacy secondary index checkFromFilename(new Descriptor("ja", dir, ksname, cfname + Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName, 3, SSTableFormat.Type.LEGACY), false); } private void checkFromFilename(Descriptor original, boolean skipComponent) { File file = new File(skipComponent ? original.baseFilename() : original.filenameFor(Component.DATA)); Pair<Descriptor, String> pair = Descriptor.fromFilename(file.getParentFile(), file.getName(), skipComponent); Descriptor desc = pair.left; assertEquals(original.directory, desc.directory); assertEquals(original.ksname, desc.ksname); assertEquals(original.cfname, desc.cfname); assertEquals(original.version, desc.version); assertEquals(original.generation, desc.generation); if (skipComponent) { assertNull(pair.right); } else { assertEquals(Component.DATA.name(), pair.right); } } @Test public void testEquality() { // Descriptor should be equal when parent directory points to the same directory File dir = new File("."); Descriptor desc1 = new Descriptor(dir, "ks", "cf", 1); Descriptor desc2 = new Descriptor(dir.getAbsoluteFile(), "ks", "cf", 1); assertEquals(desc1, desc2); assertEquals(desc1.hashCode(), desc2.hashCode()); } @Test public void validateNames() { // TODO tmp file name probably is not handled correctly after CASSANDRA-7066 String[] names = { // old formats "system-schema_keyspaces-jb-1-Data.db", //"system-schema_keyspaces-tmp-jb-1-Data.db", "system-schema_keyspaces-ka-1-big-Data.db", //"system-schema_keyspaces-tmp-ka-1-big-Data.db", // 2ndary index "keyspace1-standard1.idx1-ka-1-big-Data.db", // new formats "la-1-big-Data.db", //"tmp-la-1-big-Data.db", // 2ndary index ".idx1" + File.separator + "la-1-big-Data.db", }; for (String name : names) { assertNotNull(Descriptor.fromFilename(name)); } } @Test public void badNames() { String names[] = { "system-schema_keyspaces-k234a-1-CompressionInfo.db", "system-schema_keyspaces-ka-aa-Summary.db", "system-schema_keyspaces-XXX-ka-1-Data.db", "system-schema_keyspaces-k", "system-schema_keyspace-ka-1-AAA-Data.db", "system-schema-keyspace-ka-1-AAA-Data.db" }; for (String name : names) { try { Descriptor d = Descriptor.fromFilename(name); Assert.fail(name); } catch (Throwable e) { //good } } } }