Search in sources :

Example 1 with Reader

use of com.twitter.distributedlog.Entry.Reader in project distributedlog by twitter.

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, NullStatsLogger.INSTANCE);
    assertEquals("zero bytes", 0, writer.getNumBytes());
    assertEquals("zero records", 0, writer.getNumRecords());
    List<Future<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);
        Promise<DLSN> writePromise = new Promise<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 Promise<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);
        Promise<DLSN> writePromise = new Promise<DLSN>();
        writer.writeRecord(record, writePromise);
        writePromiseList.add(writePromise);
        assertEquals((i + 6) + " records", (i + 6), writer.getNumRecords());
    }
    Buffer buffer = writer.getBuffer();
    // Test transmit complete
    writer.completeTransmit(1L, 1L);
    List<DLSN> writeResults = Await.result(Future.collect(writePromiseList));
    for (int i = 0; i < 10; i++) {
        Assert.assertEquals(new DLSN(1L, 1L, i), writeResults.get(i));
    }
    // Test reading from buffer
    Entry recordSet = Entry.newBuilder().setData(buffer.getData(), 0, buffer.size()).setLogSegmentInfo(1L, 1L).setEntryId(0L).build();
    Reader reader = recordSet.reader();
    LogRecordWithDLSN record = reader.nextRecord();
    int numReads = 0;
    long expectedTxid = 0L;
    while (null != record) {
        Assert.assertEquals(expectedTxid, record.getTransactionId());
        Assert.assertEquals(expectedTxid, record.getSequenceId());
        Assert.assertEquals(new DLSN(1L, 0L, expectedTxid), record.getDlsn());
        ++numReads;
        ++expectedTxid;
        record = reader.nextRecord();
    }
    Assert.assertEquals(10, numReads);
}
Also used : ByteBuffer(java.nio.ByteBuffer) Buffer(com.twitter.distributedlog.io.Buffer) Reader(com.twitter.distributedlog.Entry.Reader) LogRecordTooLongException(com.twitter.distributedlog.exceptions.LogRecordTooLongException) Promise(com.twitter.util.Promise) Future(com.twitter.util.Future) Writer(com.twitter.distributedlog.Entry.Writer) Test(org.junit.Test)

Example 2 with Reader

use of com.twitter.distributedlog.Entry.Reader in project distributedlog by twitter.

the class TestEntry method verifyReadResult.

void verifyReadResult(Buffer data, long lssn, long entryId, long startSequenceId, boolean deserializeRecordSet, DLSN skipTo, int firstNumRecords, int secondNumRecords, int lastNumRecords, DLSN expectedDLSN, long expectedTxId) throws Exception {
    Entry recordSet = Entry.newBuilder().setData(data.getData(), 0, data.size()).setLogSegmentInfo(lssn, startSequenceId).setEntryId(entryId).deserializeRecordSet(deserializeRecordSet).skipTo(skipTo).build();
    Reader reader = recordSet.reader();
    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.getPayload());
        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(com.twitter.distributedlog.Entry.Reader)

Example 3 with Reader

use of com.twitter.distributedlog.Entry.Reader in project distributedlog by twitter.

the class TestEntry method testEmptyRecordSet.

@Test(timeout = 20000)
public void testEmptyRecordSet() throws Exception {
    Writer writer = Entry.newEntry("test-empty-record-set", 1024, true, CompressionCodec.Type.NONE, NullStatsLogger.INSTANCE);
    assertEquals("zero bytes", 0, writer.getNumBytes());
    assertEquals("zero records", 0, writer.getNumRecords());
    Buffer buffer = writer.getBuffer();
    Entry recordSet = Entry.newBuilder().setData(buffer.getData(), 0, buffer.size()).setLogSegmentInfo(1L, 0L).setEntryId(0L).build();
    Reader reader = recordSet.reader();
    Assert.assertNull("Empty record set should return null", reader.nextRecord());
}
Also used : ByteBuffer(java.nio.ByteBuffer) Buffer(com.twitter.distributedlog.io.Buffer) Reader(com.twitter.distributedlog.Entry.Reader) Writer(com.twitter.distributedlog.Entry.Writer) Test(org.junit.Test)

Aggregations

Reader (com.twitter.distributedlog.Entry.Reader)3 Writer (com.twitter.distributedlog.Entry.Writer)2 Buffer (com.twitter.distributedlog.io.Buffer)2 ByteBuffer (java.nio.ByteBuffer)2 Test (org.junit.Test)2 LogRecordTooLongException (com.twitter.distributedlog.exceptions.LogRecordTooLongException)1 Future (com.twitter.util.Future)1 Promise (com.twitter.util.Promise)1