Search in sources :

Example 21 with Event

use of com.alibaba.otter.canal.store.model.Event in project canal by alibaba.

the class MemoryEventStoreMemBatchTest method testRollback.

@Test
public void testRollback() {
    int bufferSize = 16;
    MemoryEventStoreWithBuffer eventStore = new MemoryEventStoreWithBuffer();
    eventStore.setBufferSize(bufferSize);
    eventStore.setBatchMode(BatchMode.MEMSIZE);
    eventStore.start();
    for (int i = 0; i < bufferSize / 2; i++) {
        boolean result = eventStore.tryPut(buildEvent("1", 1L, 1L + i));
        sleep(100L);
        Assert.assertTrue(result);
    }
    sleep(50L);
    Position first = eventStore.getFirstPosition();
    Position lastest = eventStore.getLatestPosition();
    Assert.assertEquals(first, CanalEventUtils.createPosition(buildEvent("1", 1L, 1L)));
    Assert.assertEquals(lastest, CanalEventUtils.createPosition(buildEvent("1", 1L, 1L + bufferSize / 2 - 1)));
    System.out.println("start get");
    Events<Event> entrys1 = eventStore.tryGet(first, bufferSize);
    System.out.println("first get size : " + entrys1.getEvents().size());
    eventStore.rollback();
    entrys1 = eventStore.tryGet(first, bufferSize);
    System.out.println("after rollback get size : " + entrys1.getEvents().size());
    Assert.assertTrue(entrys1.getEvents().size() == bufferSize / 2);
    // 继续造数据
    for (int i = bufferSize / 2; i < bufferSize; i++) {
        boolean result = eventStore.tryPut(buildEvent("1", 1L, 1L + i));
        sleep(100L);
        Assert.assertTrue(result);
    }
    Events<Event> entrys2 = eventStore.tryGet(entrys1.getPositionRange().getEnd(), bufferSize);
    System.out.println("second get size : " + entrys2.getEvents().size());
    eventStore.rollback();
    entrys2 = eventStore.tryGet(entrys1.getPositionRange().getEnd(), bufferSize);
    System.out.println("after rollback get size : " + entrys2.getEvents().size());
    Assert.assertTrue(entrys2.getEvents().size() == bufferSize);
    first = eventStore.getFirstPosition();
    lastest = eventStore.getLatestPosition();
    List<Event> entrys = new ArrayList<Event>(entrys2.getEvents());
    Assert.assertTrue(entrys.size() == bufferSize);
    Assert.assertEquals(first, entrys2.getPositionRange().getStart());
    Assert.assertEquals(lastest, entrys2.getPositionRange().getEnd());
    Assert.assertEquals(first, CanalEventUtils.createPosition(entrys.get(0)));
    Assert.assertEquals(lastest, CanalEventUtils.createPosition(entrys.get(bufferSize - 1)));
    eventStore.stop();
}
Also used : MemoryEventStoreWithBuffer(com.alibaba.otter.canal.store.memory.MemoryEventStoreWithBuffer) Position(com.alibaba.otter.canal.protocol.position.Position) ArrayList(java.util.ArrayList) Event(com.alibaba.otter.canal.store.model.Event) Test(org.junit.Test)

Example 22 with Event

use of com.alibaba.otter.canal.store.model.Event in project canal by alibaba.

the class MemoryEventStorePutAndGetTest method testFullPutBatchGet.

@Test
public void testFullPutBatchGet() {
    int bufferSize = 16;
    MemoryEventStoreWithBuffer eventStore = new MemoryEventStoreWithBuffer();
    eventStore.setBufferSize(bufferSize);
    eventStore.start();
    for (int i = 0; i < bufferSize; i++) {
        boolean result = eventStore.tryPut(buildEvent("1", 1L, 1L + i));
        sleep(100L);
        Assert.assertTrue(result);
    }
    Position first = eventStore.getFirstPosition();
    Position lastest = eventStore.getLatestPosition();
    Assert.assertEquals(first, CanalEventUtils.createPosition(buildEvent("1", 1L, 1L)));
    Assert.assertEquals(lastest, CanalEventUtils.createPosition(buildEvent("1", 1L, 1L + bufferSize - 1)));
    System.out.println("start get");
    Events<Event> entrys1 = eventStore.tryGet(first, bufferSize);
    System.out.println("first get size : " + entrys1.getEvents().size());
    Assert.assertTrue(entrys1.getEvents().size() == bufferSize);
    Assert.assertEquals(first, entrys1.getPositionRange().getStart());
    Assert.assertEquals(lastest, entrys1.getPositionRange().getEnd());
    Assert.assertEquals(first, CanalEventUtils.createPosition(entrys1.getEvents().get(0)));
    Assert.assertEquals(lastest, CanalEventUtils.createPosition(entrys1.getEvents().get(bufferSize - 1)));
    eventStore.stop();
}
Also used : MemoryEventStoreWithBuffer(com.alibaba.otter.canal.store.memory.MemoryEventStoreWithBuffer) Position(com.alibaba.otter.canal.protocol.position.Position) Event(com.alibaba.otter.canal.store.model.Event) Test(org.junit.Test)

Example 23 with Event

use of com.alibaba.otter.canal.store.model.Event in project canal by alibaba.

the class MemoryEventStoreWithBuffer method getLatestPosition.

public LogPosition getLatestPosition() throws CanalStoreException {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        long latestSequence = putSequence.get();
        if (latestSequence > INIT_SQEUENCE && latestSequence != ackSequence.get()) {
            // 最后一次写入的数据,最后一条未消费的数据
            Event event = entries[(int) putSequence.get() & indexMask];
            return CanalEventUtils.createPosition(event, true);
        } else if (latestSequence > INIT_SQEUENCE && latestSequence == ackSequence.get()) {
            // ack已经追上了put操作
            // 最后一次写入的数据,included
            Event event = entries[(int) putSequence.get() & indexMask];
            // false
            return CanalEventUtils.createPosition(event, false);
        } else {
            // 没有任何数据
            return null;
        }
    } finally {
        lock.unlock();
    }
}
Also used : ReentrantLock(java.util.concurrent.locks.ReentrantLock) Event(com.alibaba.otter.canal.store.model.Event)

Example 24 with Event

use of com.alibaba.otter.canal.store.model.Event in project canal by alibaba.

the class MemoryEventStoreWithBuffer method getFirstPosition.

public LogPosition getFirstPosition() throws CanalStoreException {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        long firstSeqeuence = ackSequence.get();
        if (firstSeqeuence == INIT_SQEUENCE && firstSeqeuence < putSequence.get()) {
            // 没有ack过数据
            // 最后一次ack为-1,需要移动到下一条,included
            Event event = entries[getIndex(firstSeqeuence + 1)];
            // = false
            return CanalEventUtils.createPosition(event, false);
        } else if (firstSeqeuence > INIT_SQEUENCE && firstSeqeuence < putSequence.get()) {
            // ack未追上put操作
            // 最后一次ack的位置数据
            Event event = entries[getIndex(firstSeqeuence + 1)];
            // + 1
            return CanalEventUtils.createPosition(event, true);
        } else if (firstSeqeuence > INIT_SQEUENCE && firstSeqeuence == putSequence.get()) {
            // 已经追上,store中没有数据
            // 最后一次ack的位置数据,和last为同一条,included
            Event event = entries[getIndex(firstSeqeuence)];
            // = false
            return CanalEventUtils.createPosition(event, false);
        } else {
            // 没有任何数据
            return null;
        }
    } finally {
        lock.unlock();
    }
}
Also used : ReentrantLock(java.util.concurrent.locks.ReentrantLock) Event(com.alibaba.otter.canal.store.model.Event)

Example 25 with Event

use of com.alibaba.otter.canal.store.model.Event in project canal by alibaba.

the class MemoryEventStoreRollbackAndAckTest method testAck.

@Test
public void testAck() {
    int bufferSize = 16;
    MemoryEventStoreWithBuffer eventStore = new MemoryEventStoreWithBuffer();
    eventStore.setBufferSize(bufferSize);
    eventStore.start();
    for (int i = 0; i < bufferSize / 2; i++) {
        boolean result = eventStore.tryPut(buildEvent("1", 1L, 1L + i));
        sleep(100L);
        Assert.assertTrue(result);
    }
    sleep(50L);
    Position first = eventStore.getFirstPosition();
    Position lastest = eventStore.getLatestPosition();
    Assert.assertEquals(first, CanalEventUtils.createPosition(buildEvent("1", 1L, 1L)));
    Assert.assertEquals(lastest, CanalEventUtils.createPosition(buildEvent("1", 1L, 1L + bufferSize / 2 - 1)));
    System.out.println("start get");
    Events<Event> entrys1 = eventStore.tryGet(first, bufferSize);
    System.out.println("first get size : " + entrys1.getEvents().size());
    eventStore.cleanUntil(entrys1.getPositionRange().getEnd());
    sleep(50L);
    // 继续造数据
    for (int i = bufferSize / 2; i < bufferSize; i++) {
        boolean result = eventStore.tryPut(buildEvent("1", 1L, 1L + i));
        sleep(100L);
        Assert.assertTrue(result);
    }
    Events<Event> entrys2 = eventStore.tryGet(entrys1.getPositionRange().getEnd(), bufferSize);
    System.out.println("second get size : " + entrys2.getEvents().size());
    eventStore.rollback();
    entrys2 = eventStore.tryGet(entrys1.getPositionRange().getEnd(), bufferSize);
    System.out.println("after rollback get size : " + entrys2.getEvents().size());
    first = eventStore.getFirstPosition();
    lastest = eventStore.getLatestPosition();
    List<Event> entrys = new ArrayList<Event>(entrys2.getEvents());
    Assert.assertEquals(first, entrys2.getPositionRange().getStart());
    Assert.assertEquals(lastest, entrys2.getPositionRange().getEnd());
    Assert.assertEquals(first, CanalEventUtils.createPosition(entrys.get(0)));
    Assert.assertEquals(lastest, CanalEventUtils.createPosition(entrys.get(entrys.size() - 1)));
    // 全部ack掉
    eventStore.cleanUntil(entrys2.getPositionRange().getEnd());
    // 最后就拿不到数据
    Events<Event> entrys3 = eventStore.tryGet(entrys1.getPositionRange().getEnd(), bufferSize);
    System.out.println("third get size : " + entrys3.getEvents().size());
    Assert.assertEquals(0, entrys3.getEvents().size());
    eventStore.stop();
}
Also used : MemoryEventStoreWithBuffer(com.alibaba.otter.canal.store.memory.MemoryEventStoreWithBuffer) Position(com.alibaba.otter.canal.protocol.position.Position) ArrayList(java.util.ArrayList) Event(com.alibaba.otter.canal.store.model.Event) Test(org.junit.Test)

Aggregations

Event (com.alibaba.otter.canal.store.model.Event)26 Position (com.alibaba.otter.canal.protocol.position.Position)12 MemoryEventStoreWithBuffer (com.alibaba.otter.canal.store.memory.MemoryEventStoreWithBuffer)10 Test (org.junit.Test)10 Entry (com.alibaba.otter.canal.protocol.CanalEntry.Entry)5 ArrayList (java.util.ArrayList)5 CanalEntry (com.alibaba.otter.canal.protocol.CanalEntry)4 Date (java.util.Date)4 LogIdentity (com.alibaba.otter.canal.protocol.position.LogIdentity)3 LogPosition (com.alibaba.otter.canal.protocol.position.LogPosition)3 CanalStoreException (com.alibaba.otter.canal.store.CanalStoreException)3 SimpleDateFormat (java.text.SimpleDateFormat)3 ReentrantLock (java.util.concurrent.locks.ReentrantLock)3 CanalInstance (com.alibaba.otter.canal.instance.core.CanalInstance)2 Header (com.alibaba.otter.canal.protocol.CanalEntry.Header)2 Message (com.alibaba.otter.canal.protocol.Message)2 ExecutorService (java.util.concurrent.ExecutorService)2 RowChange (com.alibaba.otter.canal.protocol.CanalEntry.RowChange)1 RowData (com.alibaba.otter.canal.protocol.CanalEntry.RowData)1 PositionRange (com.alibaba.otter.canal.protocol.position.PositionRange)1