@Override public Collection<Integer> getCurrentIds() throws Exception { lock.writeLock().lock(); try { List<Integer> ids = new ArrayList<>(); if (fileFactory != null) { for (String fileName : fileFactory.listFiles("page")) { ids.add(getPageIdFromFileName(fileName)); } } return ids; } finally { lock.writeLock().unlock(); } }
private void cleanupIncompleteFiles() throws Exception { if (largeMessagesFactory != null) { List<String> tmpFiles = largeMessagesFactory.listFiles("tmp"); for (String tmpFile : tmpFiles) { SequentialFile file = largeMessagesFactory.createSequentialFile(tmpFile); file.delete(); } } }
/** * @throws Exception */ private void cleanupTmpFiles(final String extension) throws Exception { List<String> leftFiles = fileFactory.listFiles(getFileExtension() + extension); if (leftFiles.size() > 0) { ActiveMQJournalLogger.LOGGER.tempFilesLeftOpen(); for (String fileToDelete : leftFiles) { ActiveMQJournalLogger.LOGGER.deletingOrphanedFile(fileToDelete); SequentialFile file = fileFactory.createSequentialFile(fileToDelete); file.delete(); } } }
/** * @throws Exception */ private void cleanupTmpFiles(final String extension) throws Exception { List<String> leftFiles = fileFactory.listFiles(getFileExtension() + extension); if (leftFiles.size() > 0) { ActiveMQJournalLogger.LOGGER.tempFilesLeftOpen(); for (String fileToDelete : leftFiles) { ActiveMQJournalLogger.LOGGER.deletingOrphanedFile(fileToDelete); SequentialFile file = fileFactory.createSequentialFile(fileToDelete); file.delete(); } } }
/** * Sets a list of large message files into the replicationManager for synchronization. * <p> * Collects a list of existing large messages and their current size, passing re. * <p> * So we know how much of a given message to sync with the backup. Further data appends to the * messages will be replicated normally. * * @throws Exception */ private Map<Long, Pair<String, Long>> recoverPendingLargeMessages() throws Exception { Map<Long, Pair<String, Long>> largeMessages = new HashMap<>(); // only send durable messages... // listFiles append a "." to anything... List<String> filenames = largeMessagesFactory.listFiles("msg"); for (String filename : filenames) { long id = getLargeMessageIdFromFilename(filename); if (!largeMessagesToDelete.containsKey(id)) { SequentialFile seqFile = largeMessagesFactory.createSequentialFile(filename); long size = seqFile.size(); largeMessages.put(id, new Pair<>(filename, size)); } } return largeMessages; }
@Test public void testRename() throws Exception { SequentialFile sf = factory.createSequentialFile("test1.amq"); sf.open(); List<String> fileNames = factory.listFiles("amq"); Assert.assertEquals(1, fileNames.size()); Assert.assertTrue(fileNames.contains("test1.amq")); sf.renameTo("test1.cmp"); fileNames = factory.listFiles("cmp"); Assert.assertEquals(1, fileNames.size()); Assert.assertTrue(fileNames.contains("test1.cmp")); sf.delete(); fileNames = factory.listFiles("amq"); Assert.assertEquals(0, fileNames.size()); fileNames = factory.listFiles("cmp"); Assert.assertEquals(0, fileNames.size()); }
@Test public void listFilesOnNonExistentFolder() throws Exception { SequentialFileFactory fileFactory = createFactory("./target/dontexist"); List<String> list = fileFactory.listFiles("tmp"); Assert.assertNotNull(list); Assert.assertEquals(0, list.size()); }
@Test public void testDelete() throws Exception { SequentialFile sf = factory.createSequentialFile("delete-me.amq"); sf.open(); SequentialFile sf2 = factory.createSequentialFile("delete-me2.amq"); sf2.open(); List<String> fileNames = factory.listFiles("amq"); Assert.assertEquals(2, fileNames.size()); Assert.assertTrue(fileNames.contains("delete-me.amq")); Assert.assertTrue(fileNames.contains("delete-me2.amq")); sf.delete(); fileNames = factory.listFiles("amq"); Assert.assertEquals(1, fileNames.size()); Assert.assertTrue(fileNames.contains("delete-me2.amq")); sf2.close(); }
@Test public void testReduceFreeFiles() throws Exception { final int JOURNAL_SIZE = 2000; setupAndLoadJournal(JOURNAL_SIZE, 100, 10); Assert.assertEquals(10, factory.listFiles("tt").size()); setupAndLoadJournal(JOURNAL_SIZE, 100, 2); Assert.assertEquals(10, factory.listFiles("tt").size()); for (int i = 0; i < 10; i++) { journalImpl.appendAddRecord(i, (byte) 0, new SimpleEncoding(1, (byte) 0), false); journalImpl.forceMoveNextFile(); } setupAndLoadJournal(JOURNAL_SIZE, 100, 2); Assert.assertEquals(10, records.size()); Assert.assertEquals(12, factory.listFiles("tt").size()); for (int i = 0; i < 10; i++) { journalImpl.appendDeleteRecord(i, false); } journalImpl.forceMoveNextFile(); journalImpl.checkReclaimStatus(); setupAndLoadJournal(JOURNAL_SIZE, 100, 2); Assert.assertEquals(0, records.size()); Assert.assertEquals(2, factory.listFiles("tt").size()); }
@Test public void testEmptyReopen() throws Exception { setup(2, 10 * 1024, true); createJournal(); startJournal(); load(); List<String> files1 = fileFactory.listFiles(fileExtension); Assert.assertEquals(2, files1.size()); stopJournal(); setup(2, 10 * 1024, true); createJournal(); startJournal(); load(); List<String> files2 = fileFactory.listFiles(fileExtension); Assert.assertEquals(2, files2.size()); for (String file : files1) { Assert.assertTrue(files2.contains(file)); } stopJournal(); }
@Test public void testReduceFreeFiles() throws Exception { setup(10, 10 * 1024, true); createJournal(); startJournal(); load(); List<String> files1 = fileFactory.listFiles(fileExtension); Assert.assertEquals(10, files1.size()); stopJournal(); setup(5, 10 * 1024, true); createJournal(); startJournal(); load(); List<String> files2 = fileFactory.listFiles(fileExtension); Assert.assertEquals(10, files2.size()); for (String file : files1) { Assert.assertTrue(files2.contains(file)); } stopJournal(); }
@Test public void testCreateFilesOnLoad() throws Exception { setup(10, 10 * 1024, true); createJournal(); startJournal(); load(); List<String> files1 = fileFactory.listFiles(fileExtension); Assert.assertEquals(10, files1.size()); stopJournal(); // Now restart with different number of minFiles - should create 10 more setup(20, 10 * 1024, true); createJournal(); startJournal(); load(); List<String> files2 = fileFactory.listFiles(fileExtension); Assert.assertEquals(20, files2.size()); for (String file : files1) { Assert.assertTrue(files2.contains(file)); } stopJournal(); }
@Override @After public void tearDown() throws Exception { //stop journal first to let it manage its files stopComponent(journal); List<String> files = fileFactory.listFiles(fileExtension); for (String file : files) { SequentialFile seqFile = fileFactory.createSequentialFile(file); Assert.assertEquals(fileSize, seqFile.size()); } super.tearDown(); }
@Test public void testReclaimAfterRollabck() throws Exception { final int JOURNAL_SIZE = 2000; final int COUNT = 10; setupAndLoadJournal(JOURNAL_SIZE, 1); for (int i = 0; i < COUNT; i++) { journalImpl.appendAddRecordTransactional(1L, i, (byte) 0, new SimpleEncoding(1, (byte) 0)); journalImpl.forceMoveNextFile(); } journalImpl.appendRollbackRecord(1L, false); journalImpl.forceMoveNextFile(); // wait for the previous call to forceMoveNextFile() to complete assertTrue(Wait.waitFor(() -> factory.listFiles("tt").size() == COUNT + 3, 2000, 50)); journalImpl.checkReclaimStatus(); Assert.assertEquals(0, journalImpl.getDataFilesCount()); setupAndLoadJournal(JOURNAL_SIZE, 1); Assert.assertEquals(0, journalImpl.getDataFilesCount()); Assert.assertEquals(2, factory.listFiles("tt").size()); }
/** * Validate if everything we add is recovered */ protected void testAdd(final SequentialFileFactory factory, final int numberOfElements) throws Exception { SequentialFile file = factory.createSequentialFile("00010.page"); Page impl = new Page(new SimpleString("something"), new NullStorageManager(), factory, file, 10); Assert.assertEquals(10, impl.getPageId()); impl.open(); Assert.assertEquals(1, factory.listFiles("page").size()); SimpleString simpleDestination = new SimpleString("Test"); addPageElements(simpleDestination, impl, numberOfElements); impl.sync(); impl.close(); file = factory.createSequentialFile("00010.page"); file.open(); impl = new Page(new SimpleString("something"), new NullStorageManager(), factory, file, 10); List<PagedMessage> msgs = impl.read(new NullStorageManager()); Assert.assertEquals(numberOfElements, msgs.size()); Assert.assertEquals(numberOfElements, impl.getNumberOfMessages()); for (int i = 0; i < msgs.size(); i++) { Assert.assertEquals(simpleDestination, msgs.get(i).getMessage().getAddressSimpleString()); } impl.delete(null); Assert.assertEquals(0, factory.listFiles(".page").size()); }
@Test public void testReclaimAddUpdateDeleteDifferentFiles2() throws Exception { // Make sure there is one record per file setup(2, calculateRecordSize(JournalImpl.SIZE_HEADER, getAlignment()) + calculateRecordSize(JournalImpl.SIZE_ADD_RECORD + 1 + recordLength, getAlignment()), true); createJournal(); startJournal(); load(); add(1); update(1); add(2); List<String> files1 = fileFactory.listFiles(fileExtension); Assert.assertEquals(4, files1.size()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(2, journal.getDataFilesCount()); Assert.assertEquals(0, journal.getFreeFilesCount()); Assert.assertEquals(2, journal.getIDMapSize()); checkAndReclaimFiles(); List<String> files2 = fileFactory.listFiles(fileExtension); Assert.assertEquals(4, files2.size()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(2, journal.getDataFilesCount()); Assert.assertEquals(0, journal.getFreeFilesCount()); Assert.assertEquals(2, journal.getIDMapSize()); stopJournal(); }
@Test public void testAddRollbackTXIDMap1() throws Exception { setup(10, 10 * 1024, true); createJournal(); startJournal(); load(); List<String> files1 = fileFactory.listFiles(fileExtension); Assert.assertEquals(10, files1.size()); Assert.assertEquals(0, journal.getDataFilesCount()); Assert.assertEquals(8, journal.getFreeFilesCount()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(0, journal.getIDMapSize()); addTx(1, 1); Assert.assertEquals(0, journal.getDataFilesCount()); Assert.assertEquals(8, journal.getFreeFilesCount()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(0, journal.getIDMapSize()); rollback(1); Assert.assertEquals(0, journal.getDataFilesCount()); Assert.assertEquals(8, journal.getFreeFilesCount()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(0, journal.getIDMapSize()); }
@Test public void testAddCommitTXIDMap1() throws Exception { setup(10, 10 * 1024, true); createJournal(); startJournal(); load(); List<String> files1 = fileFactory.listFiles(fileExtension); Assert.assertEquals(10, files1.size()); Assert.assertEquals(0, journal.getDataFilesCount()); Assert.assertEquals(8, journal.getFreeFilesCount()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(0, journal.getIDMapSize()); addTx(1, 1); Assert.assertEquals(0, journal.getDataFilesCount()); Assert.assertEquals(8, journal.getFreeFilesCount()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(0, journal.getIDMapSize()); commit(1); Assert.assertEquals(0, journal.getDataFilesCount()); Assert.assertEquals(8, journal.getFreeFilesCount()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(1, journal.getIDMapSize()); }
@Test public void testAddDeleteIDMap() throws Exception { setup(10, 10 * 1024, true); createJournal(); startJournal(); load(); List<String> files1 = fileFactory.listFiles(fileExtension); Assert.assertEquals(10, files1.size()); Assert.assertEquals(0, journal.getDataFilesCount()); Assert.assertEquals(8, journal.getFreeFilesCount()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(0, journal.getIDMapSize()); add(1); Assert.assertEquals(0, journal.getDataFilesCount()); Assert.assertEquals(8, journal.getFreeFilesCount()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(1, journal.getIDMapSize()); delete(1); Assert.assertEquals(0, journal.getDataFilesCount()); Assert.assertEquals(8, journal.getFreeFilesCount()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(0, journal.getIDMapSize()); }
@Test public void testAddDeleteRollbackTXIDMap1() throws Exception { setup(10, 10 * 1024, true); createJournal(); startJournal(); load(); List<String> files1 = fileFactory.listFiles(fileExtension); Assert.assertEquals(10, files1.size()); Assert.assertEquals(0, journal.getDataFilesCount()); Assert.assertEquals(8, journal.getFreeFilesCount()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(0, journal.getIDMapSize()); addTx(1, 1); Assert.assertEquals(0, journal.getDataFilesCount()); Assert.assertEquals(8, journal.getFreeFilesCount()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(0, journal.getIDMapSize()); deleteTx(1, 1); Assert.assertEquals(0, journal.getDataFilesCount()); Assert.assertEquals(8, journal.getFreeFilesCount()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(0, journal.getIDMapSize()); rollback(1); Assert.assertEquals(0, journal.getDataFilesCount()); Assert.assertEquals(8, journal.getFreeFilesCount()); Assert.assertEquals(1, journal.getOpenedFilesCount()); Assert.assertEquals(0, journal.getIDMapSize()); }