use of io.aeron.archive.Archive in project Aeron by real-logic.
the class ArchiveCreator method main.
/**
* Main method for launching the process.
*
* @param args passed to the process.
*/
@SuppressWarnings("try")
public static void main(final String[] args) {
final String archiveDirName = Archive.Configuration.archiveDirName();
final File archiveDir = ARCHIVE_DIR_DEFAULT.equals(archiveDirName) ? new File("archive") : new File(archiveDirName);
final MediaDriver.Context driverContext = new MediaDriver.Context().publicationTermBufferLength(TERM_LENGTH).termBufferSparseFile(true).threadingMode(ThreadingMode.SHARED).errorHandler(Throwable::printStackTrace).spiesSimulateConnection(true).dirDeleteOnStart(true);
final Archive.Context archiveContext = new Archive.Context().catalogCapacity(CATALOG_CAPACITY).segmentFileLength(SEGMENT_LENGTH).deleteArchiveOnStart(true).archiveDir(archiveDir).fileSyncLevel(0).threadingMode(ArchiveThreadingMode.SHARED);
System.out.println("Creating basic archive at " + archiveContext.archiveDir());
try (ArchivingMediaDriver ignore = ArchivingMediaDriver.launch(driverContext, archiveContext);
Aeron aeron = Aeron.connect();
AeronArchive aeronArchive = AeronArchive.connect(new AeronArchive.Context().aeron(aeron))) {
createRecording(aeron, aeronArchive, 0, (SEGMENT_LENGTH * 5L) + 1);
createRecording(aeron, aeronArchive, (long) TERM_LENGTH + (FrameDescriptor.FRAME_ALIGNMENT * 2), (SEGMENT_LENGTH * 3L) + 1);
} catch (final Exception ex) {
ex.printStackTrace();
}
}
use of io.aeron.archive.Archive in project Aeron by real-logic.
the class RecordingDescriptorCollectorTest method shouldAllowUserToRetainDescriptorsToPreventReuse.
@Test
void shouldAllowUserToRetainDescriptorsToPreventReuse(@TempDir final Path tempDir) {
try (MediaDriver mediaDriver = MediaDriver.launch(new MediaDriver.Context().dirDeleteOnStart(true));
Archive ignore = Archive.launch(new Archive.Context().aeronDirectoryName(mediaDriver.aeronDirectoryName()).archiveDir(tempDir.resolve("archive").toFile()).deleteArchiveOnStart(true));
Aeron aeron = Aeron.connect(new Aeron.Context().aeronDirectoryName(mediaDriver.aeronDirectoryName()));
AeronArchive aeronArchive = AeronArchive.connect(new AeronArchive.Context().aeron(aeron).ownsAeronClient(false))) {
createRecordings(aeronArchive, 3);
final RecordingDescriptorCollector collector = new RecordingDescriptorCollector(1);
long fromRecordingId = 0;
int count = aeronArchive.listRecordings(fromRecordingId, collector.poolSize(), collector.reset());
assertEquals(1, count);
final RecordingDescriptor desc0 = collector.descriptors().get(0);
fromRecordingId += count;
count = aeronArchive.listRecordings(fromRecordingId, collector.poolSize(), collector.reset());
assertEquals(1, count);
final RecordingDescriptor desc1 = collector.descriptors().get(0);
assertEquals(desc0.recordingId(), desc1.recordingId());
desc1.retain();
fromRecordingId += count;
count = aeronArchive.listRecordings(fromRecordingId, collector.poolSize(), collector.reset());
assertEquals(1, count);
final RecordingDescriptor desc2 = collector.descriptors().get(0);
assertNotEquals(desc1.recordingId(), desc2.recordingId());
}
}
use of io.aeron.archive.Archive in project aeron by real-logic.
the class StartFromTruncatedRecordingLogTest method truncateRecordingLogAndDeleteMarkFiles.
private void truncateRecordingLogAndDeleteMarkFiles(final int index) throws IOException {
final String baseDirName = baseDirName(index);
final File consensusModuleDataDir = new File(baseDirName, "consensus-module");
final File archiveDataDir = new File(baseDirName, "archive");
final File tmpRecordingFile = new File(baseDirName, RECORDING_LOG_FILE_NAME);
deleteFile(tmpRecordingFile);
deleteFile(new File(archiveDataDir, ArchiveMarkFile.FILENAME));
deleteFile(new File(consensusModuleDataDir, ClusterMarkFile.FILENAME));
try (RecordingLog recordingLog = new RecordingLog(consensusModuleDataDir, false)) {
final RecordingLog.Entry lastTermEntry = recordingLog.findLastTerm();
if (null == lastTermEntry) {
throw new IllegalStateException("no term found in recording log");
}
try (RecordingLog newRecordingLog = new RecordingLog(new File(baseDirName), true)) {
newRecordingLog.appendTerm(lastTermEntry.recordingId, lastTermEntry.leadershipTermId, lastTermEntry.termBaseLogPosition, lastTermEntry.timestamp);
newRecordingLog.commitLogPosition(lastTermEntry.leadershipTermId, lastTermEntry.logPosition);
appendServiceSnapshot(recordingLog, newRecordingLog, 0);
appendServiceSnapshot(recordingLog, newRecordingLog, ConsensusModule.Configuration.SERVICE_ID);
}
}
Files.copy(new File(baseDirName).toPath().resolve(RECORDING_LOG_FILE_NAME), consensusModuleDataDir.toPath().resolve(RECORDING_LOG_FILE_NAME), StandardCopyOption.REPLACE_EXISTING);
try (RecordingLog copiedRecordingLog = new RecordingLog(consensusModuleDataDir, false)) {
final LongHashSet recordingIds = new LongHashSet();
copiedRecordingLog.entries().stream().mapToLong((e) -> e.recordingId).forEach(recordingIds::add);
final Predicate<Path> filterPredicate = (p) -> p.getFileName().toString().endsWith(".rec");
try (Stream<Path> segments = Files.list(archiveDataDir.toPath()).filter(filterPredicate)) {
segments.filter((p) -> {
final String fileName = p.getFileName().toString();
final long recordingId = Long.parseLong(fileName.split("-")[0]);
return !recordingIds.contains(recordingId);
}).map(Path::toFile).forEach(StartFromTruncatedRecordingLogTest::deleteFile);
}
assertTrue(copiedRecordingLog.entries().size() <= 3);
}
}
use of io.aeron.archive.Archive in project aeron by real-logic.
the class ClusterLoggingAgentTest method testClusterEventsLogging.
private void testClusterEventsLogging(final String enabledEvents, final EnumSet<ClusterEventCode> expectedEvents) {
before(enabledEvents, expectedEvents);
final Context mediaDriverCtx = new Context().errorHandler(Tests::onError).dirDeleteOnStart(true).threadingMode(ThreadingMode.SHARED);
final AeronArchive.Context aeronArchiveContext = new AeronArchive.Context().controlRequestChannel("aeron:ipc?term-length=64k").controlRequestStreamId(AeronArchive.Configuration.localControlStreamId()).controlResponseChannel("aeron:ipc?term-length=64k").controlResponseStreamId(AeronArchive.Configuration.localControlStreamId() + 1).controlResponseStreamId(101);
final Archive.Context archiveCtx = new Archive.Context().errorHandler(Tests::onError).archiveDir(new File(testDir, "archive")).deleteArchiveOnStart(true).recordingEventsEnabled(false).threadingMode(ArchiveThreadingMode.SHARED);
final ConsensusModule.Context consensusModuleCtx = new ConsensusModule.Context().errorHandler(ClusterTests.errorHandler(0)).clusterDir(new File(testDir, "consensus-module")).archiveContext(aeronArchiveContext.clone()).clusterMemberId(0).clusterMembers("0,localhost:20110,localhost:20220,localhost:20330,localhost:20440,localhost:8010").logChannel("aeron:udp?term-length=256k|control-mode=manual|control=localhost:20550").ingressChannel("aeron:udp?term-length=64k").replicationChannel("aeron:udp?endpoint=localhost:0");
final ClusteredService clusteredService = mock(ClusteredService.class);
final ClusteredServiceContainer.Context clusteredServiceCtx = new ClusteredServiceContainer.Context().errorHandler(ClusterTests.errorHandler(0)).archiveContext(aeronArchiveContext.clone()).clusterDir(new File(testDir, "service")).clusteredService(clusteredService);
clusteredMediaDriver = ClusteredMediaDriver.launch(mediaDriverCtx, archiveCtx, consensusModuleCtx);
container = ClusteredServiceContainer.launch(clusteredServiceCtx);
Tests.await(WAIT_LIST::isEmpty);
final Counter state = clusteredMediaDriver.consensusModule().context().electionStateCounter();
final Supplier<String> message = () -> ElectionState.get(state).toString();
while (ElectionState.CLOSED != ElectionState.get(state)) {
Tests.sleep(1, message);
}
}
use of io.aeron.archive.Archive in project aeron by real-logic.
the class ClusteredArchive method launch.
/**
* Launch a new {@link ClusteredArchive} with provided contexts.
*
* @param aeronDirectoryName for connecting to the {@link MediaDriver}.
* @param archiveCtx for configuring the {@link Archive}.
* @param consensusModuleCtx for the configuration of the {@link ConsensusModule}.
* @return a new {@link ClusteredArchive} with the provided contexts.
*/
public static ClusteredArchive launch(final String aeronDirectoryName, final Archive.Context archiveCtx, final ConsensusModule.Context consensusModuleCtx) {
Archive archive = null;
ConsensusModule consensusModule = null;
try {
archive = Archive.launch(archiveCtx.aeronDirectoryName(aeronDirectoryName));
consensusModule = ConsensusModule.launch(consensusModuleCtx.aeronDirectoryName(aeronDirectoryName));
return new ClusteredArchive(archive, consensusModule);
} catch (final Exception ex) {
CloseHelper.quietCloseAll(consensusModule, archive);
throw ex;
}
}
Aggregations