use of org.apache.ignite.cdc.AbstractCdcTest.ChangeEventType.UPDATE in project ignite by apache.
the class CdcSelfTest method testReReadWhenStateWasNotStored.
/**
*/
@Test
public void testReReadWhenStateWasNotStored() throws Exception {
IgniteEx ign = startGrid(getConfiguration("ignite-0"));
ign.cluster().state(ACTIVE);
IgniteCache<Integer, User> cache = ign.getOrCreateCache(DEFAULT_CACHE_NAME);
addData(cache, 0, KEYS_CNT);
for (int i = 0; i < 3; i++) {
UserCdcConsumer cnsmr = new UserCdcConsumer() {
@Override
protected boolean commit() {
return false;
}
};
CdcMain cdc = createCdc(cnsmr, getConfiguration(ign.name()));
IgniteInternalFuture<?> fut = runAsync(cdc);
waitForSize(KEYS_CNT, DEFAULT_CACHE_NAME, UPDATE, cnsmr);
checkMetrics(cdc, KEYS_CNT);
fut.cancel();
assertTrue(cnsmr.stopped());
}
AtomicBoolean consumeHalf = new AtomicBoolean(true);
AtomicBoolean halfCommitted = new AtomicBoolean(false);
int half = KEYS_CNT / 2;
UserCdcConsumer cnsmr = new UserCdcConsumer() {
@Override
public boolean onEvents(Iterator<CdcEvent> evts) {
if (consumeHalf.get() && F.size(data(UPDATE, cacheId(DEFAULT_CACHE_NAME))) == half) {
// This means that state committed as a result of the previous call.
halfCommitted.set(true);
return false;
}
while (evts.hasNext()) {
CdcEvent evt = evts.next();
if (!evt.primary())
continue;
data.computeIfAbsent(F.t(evt.value() == null ? DELETE : UPDATE, evt.cacheId()), k -> new ArrayList<>()).add((Integer) evt.key());
if (consumeHalf.get())
return F.size(data(UPDATE, cacheId(DEFAULT_CACHE_NAME))) == half;
}
return true;
}
};
CdcMain cdc = createCdc(cnsmr, getConfiguration(ign.name()));
IgniteInternalFuture<?> fut = runAsync(cdc);
waitForSize(half, DEFAULT_CACHE_NAME, UPDATE, cnsmr);
checkMetrics(cdc, half);
waitForCondition(halfCommitted::get, getTestTimeout());
fut.cancel();
assertTrue(cnsmr.stopped());
removeData(cache, 0, KEYS_CNT);
consumeHalf.set(false);
cdc = createCdc(cnsmr, getConfiguration(ign.name()));
fut = runAsync(cdc);
waitForSize(KEYS_CNT, DEFAULT_CACHE_NAME, UPDATE, cnsmr);
waitForSize(KEYS_CNT, DEFAULT_CACHE_NAME, DELETE, cnsmr);
checkMetrics(cdc, KEYS_CNT * 2 - half);
fut.cancel();
assertTrue(cnsmr.stopped());
}
Aggregations