@Override public SequentialFile createFileForLargeMessage(final long messageID, LargeMessageExtension extension) { return largeMessagesFactory.createSequentialFile(messageID + extension.getExtension()); }
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(); } } }
private void sendLargeMessageFiles(final Map<Long, Pair<String, Long>> pendingLargeMessages) throws Exception { Iterator<Map.Entry<Long, Pair<String, Long>>> iter = pendingLargeMessages.entrySet().iterator(); while (started && iter.hasNext()) { Map.Entry<Long, Pair<String, Long>> entry = iter.next(); String fileName = entry.getValue().getA(); final long id = entry.getKey(); long size = entry.getValue().getB(); SequentialFile seqFile = largeMessagesFactory.createSequentialFile(fileName); if (!seqFile.exists()) continue; if (replicator != null) { replicator.syncLargeMessageFile(seqFile, size, id); } else { throw ActiveMQMessageBundle.BUNDLE.replicatorIsNull(); } } }
@Override public boolean checkPageFileExists(final int pageNumber) { String fileName = createFileName(pageNumber); try { checkFileFactory(); } catch (Exception ignored) { } SequentialFile file = fileFactory.createSequentialFile(fileName); return file.exists(); }
/** * @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; }
/** * this method is used internally only however tools may use it to maintenance. * It won't be part of the interface as the tools should be specific to the implementation */ public List<JournalFile> orderFiles() throws Exception { List<String> fileNames = fileFactory.listFiles(filesRepository.getFileExtension()); List<JournalFile> orderedFiles = new ArrayList<>(fileNames.size()); for (String fileName : fileNames) { SequentialFile file = fileFactory.createSequentialFile(fileName); if (file.size() >= SIZE_HEADER) { file.open(); try { JournalFileImpl jrnFile = readFileHeader(file); orderedFiles.add(jrnFile); } finally { file.close(); } } else { ActiveMQJournalLogger.LOGGER.ignoringShortFile(fileName); file.delete(); } } // Now order them by ordering id - we can't use the file name for ordering // since we can re-use dataFiles Collections.sort(orderedFiles, JOURNAL_FILE_COMPARATOR); return orderedFiles; }
@Override protected SequentialFile writeControlFile(final SequentialFileFactory fileFactory, final List<JournalFile> files, final List<JournalFile> newFiles, final List<Pair<String, String>> renames) throws Exception { if (crash) { SequentialFile controlFile = fileFactory.createSequentialFile(AbstractJournalUpdateTask.FILE_COMPACT_CONTROL); controlFile.open(); controlFile.close(); System.err.println("crashing after creation of control file"); System.exit(OK); } return JournalCompactor.writeControlFile(fileFactory, files, newFiles, renames); }
@Override public void sendPages(ReplicationManager replicator, Collection<Integer> pageIds) throws Exception { for (Integer id : pageIds) { SequentialFile sFile = fileFactory.createSequentialFile(createFileName(id)); if (!sFile.exists()) { continue; } ActiveMQServerLogger.LOGGER.replicaSyncFile(sFile, sFile.size()); replicator.syncPages(sFile, id, getAddress()); } }
@Override public Page createPage(final int pageNumber) throws Exception { String fileName = createFileName(pageNumber); checkFileFactory(); SequentialFile file = fileFactory.createSequentialFile(fileName); Page page = new Page(storeName, storageManager, fileFactory, file, pageNumber); // To create the file file.open(); file.position(0); file.close(); return page; }
@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(); }
@Override public synchronized SequentialFileFactory newFileFactory(final SimpleString address) throws Exception { String tableName = "" + storageManager.generateID(); SequentialFileFactory factory = newFileFactory(tableName, true); factory.start(); SequentialFile file = factory.createSequentialFile(PagingStoreFactoryDatabase.ADDRESS_FILE); file.open(); ActiveMQBuffer buffer = ActiveMQBuffers.fixedBuffer(SimpleString.sizeofNullableString(address)); buffer.writeSimpleString(address); file.write(buffer, true); file.close(); return factory; }
@Test public void testBuffer() throws Exception { SequentialFile file = factory.createSequentialFile("filtetmp.log"); file.open(); ByteBuffer buff = factory.newBuffer(10); Assert.assertEquals(factory.getAlignment(), buff.limit()); file.close(); factory.releaseBuffer(buff); }
@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 testFill() throws Exception { SequentialFile sf = factory.createSequentialFile("fill.amq"); sf.open(); try { checkFill(factory, sf, 2048); checkFill(factory, sf, 512); checkFill(factory, sf, 512 * 4); } finally { sf.close(); } }
@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(); }
/** * 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 testOpenClose() throws Exception { SequentialFile sf = factory.createSequentialFile("openclose.amq"); sf.open(); sf.fill(512); String s1 = "cheesecake"; byte[] bytes1 = s1.getBytes(StandardCharsets.UTF_8); long initialPos = sf.position(); sf.write(wrapBuffer(bytes1), true); long bytesWritten = sf.position() - initialPos; Assert.assertEquals(calculateRecordSize(bytes1.length, factory.getAlignment()), bytesWritten); sf.close(); try { sf.write(wrapBuffer(bytes1), true); Assert.fail("Should throw exception"); } catch (Exception e) { } sf.open(); sf.write(wrapBuffer(bytes1), true); sf.close(); }
@Test public void testMaxInt() throws Exception { setup(10, 10 * 1024, true); createJournal(); startJournal(); load(); stopJournal(); fileFactory.start(); List<String> files = fileFactory.listFiles(fileExtension); long fileID = Integer.MAX_VALUE; for (String fileStr : files) { SequentialFile file = fileFactory.createSequentialFile(fileStr); file.open(); JournalImpl.initFileHeader(fileFactory, file, journal.getUserVersion(), fileID++); file.close(); } fileFactory.stop(); startJournal(); load(); for (long i = 0; i < 100; i++) { add(i); stopJournal(); startJournal(); loadAndCheck(); } stopJournal(); }