@Test public void testUnparsableFirstRecord() throws IOException { testCorruptRecord( (t, s) -> t.logFiles() .forEach( f -> { List<String> lines = FileUtils.readLines(f); lines.add(0, "add:[a,b,c][12345678]"); FileUtils.replace(f, lines.toArray(new String[lines.size()])); }), false); }
@Test public void testRemoveUnfinishedLeftovers_multipleFolders_missingFinalRecords_second() throws Throwable { testRemoveUnfinishedLeftovers_multipleFolders_errorConditions( txn -> { List<File> logFiles = txn.logFiles(); Assert.assertEquals(2, logFiles.size()); // insert only one commit record FileUtils.append(logFiles.get(1), LogRecord.makeCommit(System.currentTimeMillis()).raw); }, true); }
@Test public void testRemoveUnfinishedLeftovers_multipleFolders_tooManyFinalRecords() throws Throwable { testRemoveUnfinishedLeftovers_multipleFolders_errorConditions( txn -> { List<File> logFiles = txn.logFiles(); Assert.assertEquals(2, logFiles.size()); // insert mismatched records FileUtils.append(logFiles.get(0), LogRecord.makeCommit(System.currentTimeMillis()).raw); FileUtils.append(logFiles.get(1), LogRecord.makeCommit(System.currentTimeMillis()).raw); FileUtils.append(logFiles.get(1), LogRecord.makeCommit(System.currentTimeMillis()).raw); }, false); }
@Test public void testRemoveUnfinishedLeftovers_multipleFolders_partialFinalRecords_second() throws Throwable { testRemoveUnfinishedLeftovers_multipleFolders_errorConditions( txn -> { List<File> logFiles = txn.logFiles(); Assert.assertEquals(2, logFiles.size()); // insert a full record and a partial one String finalRecord = LogRecord.makeCommit(System.currentTimeMillis()).raw; int toChop = finalRecord.length() / 2; FileUtils.append(logFiles.get(0), finalRecord); FileUtils.append( logFiles.get(1), finalRecord.substring(0, finalRecord.length() - toChop)); }, true); }
@Test public void testRemoveUnfinishedLeftovers_multipleFolders_partialNonFinalRecord_second() throws Throwable { testRemoveUnfinishedLeftovers_multipleFolders_errorConditions( txn -> { List<File> logFiles = txn.logFiles(); Assert.assertEquals(2, logFiles.size()); // insert a partial sstable record and a full commit record String sstableRecord = LogRecord.make(LogRecord.Type.ADD, Collections.emptyList(), 0, "abc").raw; int toChop = sstableRecord.length() / 2; FileUtils.append(logFiles.get(0), sstableRecord); FileUtils.append( logFiles.get(1), sstableRecord.substring(0, sstableRecord.length() - toChop)); String finalRecord = LogRecord.makeCommit(System.currentTimeMillis()).raw; FileUtils.append(logFiles.get(0), finalRecord); FileUtils.append(logFiles.get(1), finalRecord); }, false); }
@Test public void testGetTemporaryFiles() throws IOException { ColumnFamilyStore cfs = MockSchema.newCFS(KEYSPACE); File dataFolder = new Directories(cfs.metadata).getDirectoryForNewSSTables(); SSTableReader sstable1 = sstable(dataFolder, cfs, 0, 128); Set<File> tmpFiles = getTemporaryFiles(dataFolder); assertNotNull(tmpFiles); assertEquals(0, tmpFiles.size()); try (LogTransaction log = new LogTransaction(OperationType.WRITE)) { Directories directories = new Directories(cfs.metadata); File[] beforeSecondSSTable = dataFolder.listFiles(pathname -> !pathname.isDirectory()); SSTableReader sstable2 = sstable(dataFolder, cfs, 1, 128); log.trackNew(sstable2); Map<Descriptor, Set<Component>> sstables = directories.sstableLister(Directories.OnTxnErr.THROW).list(); assertEquals(2, sstables.size()); // this should contain sstable1, sstable2 and the transaction log file File[] afterSecondSSTable = dataFolder.listFiles(pathname -> !pathname.isDirectory()); int numNewFiles = afterSecondSSTable.length - beforeSecondSSTable.length; assertEquals( numNewFiles - 1, sstable2.getAllFilePaths().size()); // new files except for transaction log file tmpFiles = getTemporaryFiles(dataFolder); assertNotNull(tmpFiles); assertEquals(numNewFiles - 1, tmpFiles.size()); File ssTable2DataFile = new File(sstable2.descriptor.filenameFor(Component.DATA)); File ssTable2IndexFile = new File(sstable2.descriptor.filenameFor(Component.PRIMARY_INDEX)); assertTrue(tmpFiles.contains(ssTable2DataFile)); assertTrue(tmpFiles.contains(ssTable2IndexFile)); List<File> files = directories.sstableLister(Directories.OnTxnErr.THROW).listFiles(); List<File> filesNoTmp = directories.sstableLister(Directories.OnTxnErr.THROW).skipTemporary(true).listFiles(); assertNotNull(files); assertNotNull(filesNoTmp); assertTrue(files.contains(ssTable2DataFile)); assertTrue(files.contains(ssTable2IndexFile)); assertFalse(filesNoTmp.contains(ssTable2DataFile)); assertFalse(filesNoTmp.contains(ssTable2IndexFile)); log.finish(); // Now it should be empty since the transaction has finished tmpFiles = getTemporaryFiles(dataFolder); assertNotNull(tmpFiles); assertEquals(0, tmpFiles.size()); filesNoTmp = directories.sstableLister(Directories.OnTxnErr.THROW).skipTemporary(true).listFiles(); assertNotNull(filesNoTmp); assertTrue(filesNoTmp.contains(ssTable2DataFile)); assertTrue(filesNoTmp.contains(ssTable2IndexFile)); sstable1.selfRef().release(); sstable2.selfRef().release(); } }