/** * used by {@link Demarshallable} * * @param wire a wire */ @UsedViaReflection private SCQIndexing(@NotNull WireIn wire) { this(wire.read(IndexingFields.indexCount).int32(), wire.read(IndexingFields.indexSpacing).int32(), wire.read(IndexingFields.index2Index).int64ForBinding(wire.newLongReference()), wire.read(IndexingFields.lastIndex).int64ForBinding(wire.newLongReference()), wire::newLongArrayReference); }
/** * used by {@link Demarshallable} * * @param wire a wire */ @UsedViaReflection private SCQRoll(@NotNull WireIn wire) { length = wire.read(RollFields.length).int32(); format = wire.read(RollFields.format).text(); epoch = wire.read(RollFields.epoch).int64(); ValueIn rollTimeVIN = wire.read(RollFields.rollTime); if (rollTimeVIN.hasNext()) rollTime = rollTimeVIN.time(); String zoneId = wire.read(RollFields.rollTimeZone).text(); if (zoneId != null) rollTimeZone = ZoneId.of(zoneId); else rollTimeZone = null; }
@SuppressWarnings("unused") @UsedViaReflection SCQMeta(@NotNull WireIn wire) { this.roll = Objects.requireNonNull(wire.read(MetaDataField.roll).typedMarshallable()); this.deltaCheckpointInterval = wire.bytes().readRemaining() > 0 ? wire.read(MetaDataField.deltaCheckpointInterval).int32() : -1; // disabled. this.sourceId = wire.bytes().readRemaining() > 0 ? wire.read(MetaDataField.sourceId).int32() : 0; }
@UsedViaReflection public TimedStoreRecovery(@NotNull WireIn in) { timeStamp = in.read("timeStamp").int64ForBinding(in.newLongReference()); }
private ReadMarshallable read() { return aMarshallable -> { final byte[] myBytes = aMarshallable.read().bytes(); if (myBytes != null) { LOGGER.info("Reading: {}", new String(myBytes, StandardCharsets.UTF_8)); } }; }
/** * used by {@link net.openhft.chronicle.wire.Demarshallable} * * @param wire a wire */ @UsedViaReflection private SingleChronicleQueueStore(@NotNull WireIn wire) { assert wire.startUse(); try { writePosition = loadWritePosition(wire); this.mappedBytes = (MappedBytes) (wire.bytes()); this.mappedFile = mappedBytes.mappedFile(); this.refCount = ReferenceCounter.onReleased(this::onCleanup); this.indexing = Objects.requireNonNull(wire.read(MetaDataField.indexing).typedMarshallable()); assert indexing != null; this.indexing.writePosition = writePosition; this.sequence = new RollCycleEncodeSequence(writePosition, rollIndexCount(), rollIndexSpacing()); this.indexing.sequence = sequence; } finally { assert wire.endUse(); } }
private LongValue loadWritePosition(@NotNull WireIn wire) { final ValueIn read = wire.read(MetaDataField.writePosition); final int code; final long start = wire.bytes().readPosition(); try { wire.consumePadding(); code = wire.bytes().uncheckedReadUnsignedByte(); } finally { wire.bytes().readPosition(start); } if (code == BinaryWireCode.I64_ARRAY) { TwoLongValue result = wire.newTwoLongReference(); // when the write position is and array it also encodes the sequence number in the write position as the second long value read.int128(result); return result; } final LongValue result = wire.newLongReference(); read.int64(result); return result; }
private long doRead(@NotNull ExcerptTailer tailer, int expected) { int[] i = {0}; long t_index = 0; while (true) { try (DocumentContext dc = tailer.readingDocument()) { if (!dc.isPresent()) break; t_index = tailer.index(); dc.wire().read("log").marshallable(m -> { String msg = m.read("msg").text(); assertNotNull(msg); System.out.println("msg:" + msg); i[0]++; }); } } assertEquals(expected, i[0]); return t_index; }
@Test public void testSimpleWire() { try (final ChronicleQueue chronicle = builder(getTmpDir(), this.wireType) .build()) { final ExcerptAppender appender = chronicle.acquireAppender(); appender.writeDocument(wire -> wire.write(() -> "FirstName").text("Steve")); appender.writeDocument(wire -> wire.write(() -> "Surname").text("Jobs")); StringBuilder first = new StringBuilder(); StringBuilder surname = new StringBuilder(); final ExcerptTailer tailer = chronicle.createTailer(); tailer.readDocument(wire -> wire.read(() -> "FirstName").text(first)); tailer.readDocument(wire -> wire.read(() -> "Surname").text(surname)); Assert.assertEquals("Steve Jobs", first + " " + surname); } }
@Test public void createAQueue() { final String basePath = OS.TARGET + "/" + getClass().getSimpleName() + "-" + System.nanoTime(); try (ChronicleQueue queue = SingleChronicleQueueBuilder.single(basePath) .testBlockSize() .rollCycle(RollCycles.TEST_DAILY) .build()) { // Obtain an ExcerptAppender ExcerptAppender appender = queue.acquireAppender(); // write - {msg: TestMessage} appender.writeDocument(w -> w.write(() -> "msg").text("TestMessage")); // System.out.println(queue.dump()); // write - TestMessage appender.writeText("TestMessage"); ExcerptTailer tailer = queue.createTailer(); tailer.readDocument(w -> System.out.println("msg: " + w.read(() -> "msg").text())); assertEquals("TestMessage", tailer.readText()); } }
@Test public void testToEndOnDeletedQueueFiles() throws IOException { if (OS.isWindows()) { System.err.println("#460 Cannot test delete after close on windows"); return; } File dir = getTmpDir(); try (ChronicleQueue q = builder(dir, wireType).build()) { ExcerptAppender append = q.acquireAppender(); append.writeDocument(w -> w.write(() -> "test").text("before text")); ExcerptTailer tailer = q.createTailer(); // move to the end even though it doesn't exist yet. tailer.toEnd(); append.writeDocument(w -> w.write(() -> "test").text("text")); assertTrue(tailer.readDocument(w -> w.read(() -> "test").text("text", Assert::assertEquals))); Files.find(dir.toPath(), 1, (p, basicFileAttributes) -> p.toString().endsWith("cq4"), FileVisitOption.FOLLOW_LINKS) .forEach(path -> assertTrue(path.toFile().delete())); ChronicleQueue q2 = builder(dir, wireType).build(); tailer = q2.createTailer(); tailer.toEnd(); assertEquals(TailerState.UNINITIALISED, tailer.state()); append = q2.acquireAppender(); append.writeDocument(w -> w.write(() -> "test").text("before text")); assertTrue(tailer.readDocument(w -> w.read(() -> "test").text("before text", Assert::assertEquals))); } }
private static long doReadBad(@NotNull ExcerptTailer tailer, int expected, boolean additionalClose) { int[] i = {0}; long t_index = 0; while (true) { try (DocumentContext dc = tailer.readingDocument()) { if (!dc.isPresent()) break; t_index = tailer.index(); dc.wire().read("log").marshallable(m -> { String msg = m.read("msg").text(); assertNotNull(msg); i[0]++; }); if (additionalClose) { dc.close(); } } } assertEquals(expected, i[0]); return t_index; }
@Test public void test() { File dir = getTmpDir(); try (final ChronicleQueue queue = SingleChronicleQueueBuilder.builder(dir, wireType) .testBlockSize() .build()) { final ExcerptTailer tailer = queue.createTailer(); assertFalse(tailer.readDocument(r -> r.read(TestKey.test).int32())); final ExcerptAppender appender = queue.acquireAppender(); appender.writeDocument(w -> w.write(TestKey.test).int32(1)); Jvm.pause(100); assertTrue(tailer.readDocument(r -> r.read(TestKey.test).int32())); } }
@Test public void testNegativeEPOC() { for (int h = -14; h <= 14; h++) { try (final ChronicleQueue chronicle = builder(getTmpDir(), wireType) .epoch(TimeUnit.HOURS.toMillis(h)) .build()) { final ExcerptAppender appender = chronicle.acquireAppender(); appender.writeDocument(wire -> wire.write(() -> "key").text("value=v")); chronicle.createTailer() .readDocument(wire -> { assertEquals("value=v", wire.read("key").text()); }); } } }
@Test public void testHeaderIndexReadAtIndex() { try (final ChronicleQueue queue = builder(getTmpDir(), this.wireType) .build()) { final ExcerptAppender appender = queue.acquireAppender(); final int cycle = appender.cycle(); // create 100 documents for (int i = 0; i < 100; i++) { final int j = i; appender.writeDocument(wire -> wire.write(() -> "key").text("value=" + j)); } final ExcerptTailer tailer = queue.createTailer(); assertTrue(tailer.moveToIndex(queue.rollCycle().toIndex(cycle, 0))); StringBuilder sb = new StringBuilder(); tailer.readDocument(wire -> wire.read(() -> "key").text(sb)); Assert.assertEquals("value=0", sb.toString()); } }
@Test public void shouldHandleCycleRoll() { File dir = getTmpDir(); MutableTimeProvider timeProvider = new MutableTimeProvider(); timeProvider.setTime(System.currentTimeMillis()); try (ChronicleQueue chronicle = minutely(dir, timeProvider) .build(); ChronicleQueue chronicle2 = minutely(dir, timeProvider) .build()) { //ExcerptAppender append = chronicle2.acquireAppender(); //append.writeDocument(w -> w.write(() -> "test").text("before text")); ExcerptTailer tailer = chronicle.createTailer(); //tailer.toEnd(); timeProvider.addTime(10, TimeUnit.MINUTES); ExcerptAppender append = chronicle2.acquireAppender(); append.writeDocument(w -> w.write(() -> "test").text("text")); assertTrue(tailer.readDocument(w -> w.read(() -> "test").text("text", Assert::assertEquals))); } }
@Test public void testToEndBeforeWrite() { try (ChronicleQueue chronicle = builder(getTmpDir(), wireType) .rollCycle(TEST2_DAILY) .build()) { ExcerptAppender appender = chronicle.acquireAppender(); ExcerptTailer tailer = chronicle.createTailer(); int entries = chronicle.rollCycle().defaultIndexSpacing() * 2 + 2; for (int i = 0; i < entries; i++) { tailer.toEnd(); int finalI = i; appender.writeDocument(w -> w.writeEventName("hello").text("world" + finalI)); tailer.readDocument(w -> w.read().text("world" + finalI, Assert::assertEquals)); } } }
@Test public void testToEnd2() { File dir = getTmpDir(); try (ChronicleQueue chronicle = builder(dir, wireType) .build(); ChronicleQueue chronicle2 = builder(dir, wireType) .build()) { ExcerptAppender append = chronicle2.acquireAppender(); append.writeDocument(w -> w.write(() -> "test").text("before text")); ExcerptTailer tailer = chronicle.createTailer(); // move to the end even though it doesn't exist yet. tailer.toEnd(); append.writeDocument(w -> w.write(() -> "test").text("text")); assertTrue(tailer.readDocument(w -> w.read(() -> "test").text("text", Assert::assertEquals))); } }
@Test public void testSomeMessages() { try (ChronicleQueue chronicle = builder(getTmpDir(), wireType) .rollCycle(TEST2_DAILY) .build()) { ExcerptAppender appender = chronicle.acquireAppender(); ExcerptTailer tailer = chronicle.createTailer(); int entries = chronicle.rollCycle().defaultIndexSpacing() * 2 + 2; for (long i = 0; i < entries; i++) { long finalI = i; appender.writeDocument(w -> w.writeEventName("hello").int64(finalI)); long seq = chronicle.rollCycle().toSequenceNumber(appender.lastIndexAppended()); assertEquals(i, seq); // System.out.println(chronicle.dump()); tailer.readDocument(w -> w.read().int64(finalI, (a, b) -> Assert.assertEquals((long) a, b))); } } }
@Test public void testAppendAndReadAtIndex() { try (final ChronicleQueue queue = builder(getTmpDir(), this.wireType) .rollCycle(TEST2_DAILY) .build()) { final ExcerptAppender appender = queue.acquireAppender(); appender.cycle(); for (int i = 0; i < 5; i++) { final int n = i; appender.writeDocument(w -> w.write(TestKey.test).int32(n)); assertEquals(i, queue.rollCycle().toSequenceNumber(appender.lastIndexAppended())); } final ExcerptTailer tailer = queue.createTailer(); for (int i = 0; i < 5; i++) { final long index = queue.rollCycle().toIndex(appender.cycle(), i); assertTrue(tailer.moveToIndex(index)); final int n = i; assertTrue(tailer.readDocument(r -> assertEquals(n, queue.rollCycle().toSequenceNumber(r.read(TestKey.test) .int32())))); long index2 = tailer.index(); long sequenceNumber = queue.rollCycle().toSequenceNumber(index2); assertEquals(n + 1, sequenceNumber); } } }