Search in sources :

Example 1 with Reader

use of org.apache.distributedlog.Entry.Reader in project bookkeeper by apache.

the class TestEntry method testWriteRecords.

@Test(timeout = 20000)
public void testWriteRecords() throws Exception {
    Writer writer = Entry.newEntry("test-write-records", 1024, true, CompressionCodec.Type.NONE);
    assertEquals("zero bytes", HEADER_LENGTH, writer.getNumBytes());
    assertEquals("zero records", 0, writer.getNumRecords());
    List<CompletableFuture<DLSN>> writePromiseList = Lists.newArrayList();
    // write first 5 records
    for (int i = 0; i < 5; i++) {
        LogRecord record = new LogRecord(i, ("record-" + i).getBytes(UTF_8));
        record.setPositionWithinLogSegment(i);
        CompletableFuture<DLSN> writePromise = new CompletableFuture<DLSN>();
        writer.writeRecord(record, writePromise);
        writePromiseList.add(writePromise);
        assertEquals((i + 1) + " records", (i + 1), writer.getNumRecords());
    }
    // write large record
    LogRecord largeRecord = new LogRecord(1L, new byte[MAX_LOGRECORD_SIZE + 1]);
    try {
        writer.writeRecord(largeRecord, new CompletableFuture<DLSN>());
        Assert.fail("Should fail on writing large record");
    } catch (LogRecordTooLongException lrtle) {
    // expected
    }
    assertEquals("5 records", 5, writer.getNumRecords());
    // write another 5 records
    for (int i = 0; i < 5; i++) {
        LogRecord record = new LogRecord(i + 5, ("record-" + (i + 5)).getBytes(UTF_8));
        record.setPositionWithinLogSegment(i + 5);
        CompletableFuture<DLSN> writePromise = new CompletableFuture<DLSN>();
        writer.writeRecord(record, writePromise);
        writePromiseList.add(writePromise);
        assertEquals((i + 6) + " records", (i + 6), writer.getNumRecords());
    }
    ByteBuf buffer = writer.getBuffer();
    buffer.retain();
    // Test transmit complete
    writer.completeTransmit(1L, 1L);
    List<DLSN> writeResults = Utils.ioResult(FutureUtils.collect(writePromiseList));
    for (int i = 0; i < 10; i++) {
        assertEquals(new DLSN(1L, 1L, i), writeResults.get(i));
    }
    // Test reading from buffer
    Reader reader = Entry.newBuilder().setEntry(buffer).setLogSegmentInfo(1L, 1L).setEntryId(0L).setEnvelopeEntry(true).buildReader();
    buffer.release();
    LogRecordWithDLSN record = reader.nextRecord();
    int numReads = 0;
    long expectedTxid = 0L;
    while (null != record) {
        assertEquals(expectedTxid, record.getTransactionId());
        assertEquals(expectedTxid, record.getSequenceId());
        assertEquals(new DLSN(1L, 0L, expectedTxid), record.getDlsn());
        ++numReads;
        ++expectedTxid;
        record = reader.nextRecord();
    }
    assertEquals(10, numReads);
    reader.release();
}
Also used : Reader(org.apache.distributedlog.Entry.Reader) LogRecordTooLongException(org.apache.distributedlog.exceptions.LogRecordTooLongException) ByteBuf(io.netty.buffer.ByteBuf) CompletableFuture(java.util.concurrent.CompletableFuture) Writer(org.apache.distributedlog.Entry.Writer) Test(org.junit.Test)

Example 2 with Reader

use of org.apache.distributedlog.Entry.Reader in project bookkeeper by apache.

the class TestEntry method verifyReadResult.

void verifyReadResult(ByteBuf data, long lssn, long entryId, long startSequenceId, boolean deserializeRecordSet, DLSN skipTo, int firstNumRecords, int secondNumRecords, int lastNumRecords, DLSN expectedDLSN, long expectedTxId) throws Exception {
    Reader reader = Entry.newBuilder().setEntry(data).setLogSegmentInfo(lssn, startSequenceId).setEntryId(entryId).deserializeRecordSet(deserializeRecordSet).buildReader();
    reader.skipTo(skipTo);
    LogRecordWithDLSN record;
    for (int i = 0; i < firstNumRecords; i++) {
        // first
        record = reader.nextRecord();
        assertNotNull(record);
        assertEquals(expectedDLSN, record.getDlsn());
        assertEquals(expectedTxId, record.getTransactionId());
        assertNotNull("record " + record + " payload is null", record.getPayloadBuf());
        assertEquals("record-" + expectedTxId, new String(record.getPayload(), UTF_8));
        expectedDLSN = expectedDLSN.getNextDLSN();
        ++expectedTxId;
    }
    boolean verifyDeserializedRecords = true;
    if (firstNumRecords > 0) {
        verifyDeserializedRecords = deserializeRecordSet;
    }
    if (verifyDeserializedRecords) {
        long txIdOfRecordSet = 5;
        for (int i = 0; i < secondNumRecords; i++) {
            record = reader.nextRecord();
            assertNotNull(record);
            assertEquals(expectedDLSN, record.getDlsn());
            assertEquals(txIdOfRecordSet, record.getTransactionId());
            assertNotNull("record " + record + " payload is null", record.getPayload());
            assertEquals("record-" + expectedTxId, new String(record.getPayload(), UTF_8));
            expectedDLSN = expectedDLSN.getNextDLSN();
            ++expectedTxId;
        }
    } else {
        record = reader.nextRecord();
        assertNotNull(record);
        assertEquals(expectedDLSN, record.getDlsn());
        assertEquals(expectedTxId, record.getTransactionId());
        for (int i = 0; i < secondNumRecords; i++) {
            expectedDLSN = expectedDLSN.getNextDLSN();
            ++expectedTxId;
        }
    }
    for (int i = 0; i < lastNumRecords; i++) {
        record = reader.nextRecord();
        assertNotNull(record);
        assertEquals(expectedDLSN, record.getDlsn());
        assertEquals(expectedTxId, record.getTransactionId());
        assertNotNull("record " + record + " payload is null", record.getPayload());
        assertEquals("record-" + expectedTxId, new String(record.getPayload(), UTF_8));
        expectedDLSN = expectedDLSN.getNextDLSN();
        ++expectedTxId;
    }
}
Also used : Reader(org.apache.distributedlog.Entry.Reader)

Aggregations

Reader (org.apache.distributedlog.Entry.Reader)2 ByteBuf (io.netty.buffer.ByteBuf)1 CompletableFuture (java.util.concurrent.CompletableFuture)1 Writer (org.apache.distributedlog.Entry.Writer)1 LogRecordTooLongException (org.apache.distributedlog.exceptions.LogRecordTooLongException)1 Test (org.junit.Test)1