use of org.apache.ignite.testframework.LogListener in project ignite by apache.
the class CacheExchangeMergeTest method testNoConcurrentModificationExceptionAfterMergeExchanges.
/**
* Test checks that there will be no {@link ConcurrentModificationException}
* when merging exchanges and iterating over {@link ExchangeDiscoveryEvents#events} at the same time.
*
* @throws Exception If failed.
*/
@Test
public void testNoConcurrentModificationExceptionAfterMergeExchanges() throws Exception {
testSpi = true;
LogListener logLsnr = matches("Merge exchange future on finish [").build();
listeningLog.registerAllListeners(logLsnr);
AtomicBoolean stop = new AtomicBoolean();
Collection<Exception> exceptions = new ConcurrentLinkedQueue<>();
try {
startGrid(0);
for (int i = 1; i < 9; i++) {
IgniteConfiguration cfg = getConfiguration(getTestIgniteInstanceName(i));
TestRecordingCommunicationSpi spi = ((TestRecordingCommunicationSpi) cfg.getCommunicationSpi());
spi.blockMessages((node, msg) -> delay(msg));
runAsync(() -> startGrid(cfg), "create-node-" + cfg.getIgniteInstanceName());
spi.waitForBlocked();
}
List<Ignite> allNodes = IgnitionEx.allGridsx();
CountDownLatch latch = new CountDownLatch(allNodes.size());
for (Ignite gridEx : allNodes) {
runAsync(() -> {
Collection<DiscoveryEvent> evts = ((IgniteEx) gridEx).context().cache().context().exchange().lastTopologyFuture().events().events();
latch.countDown();
int i = 0;
while (!stop.get()) {
try {
for (DiscoveryEvent evt : evts) {
if (nonNull(evt))
i++;
}
} catch (ConcurrentModificationException e) {
exceptions.add(e);
log.error("i = " + i, e);
break;
}
}
}, "get-ex-" + gridEx.configuration().getIgniteInstanceName());
}
for (Ignite node : allNodes) TestRecordingCommunicationSpi.spi(node).stopBlock();
latch.await();
awaitPartitionMapExchange();
} finally {
stop.set(true);
}
assertTrue(logLsnr.check());
assertTrue(exceptions.isEmpty());
}
use of org.apache.ignite.testframework.LogListener in project ignite by apache.
the class GridCacheRebalancingUnmarshallingFailedSelfTest method runTest.
/**
* @throws Exception e.
*/
private void runTest() throws Exception {
customLog = new ListeningTestLogger(log);
LogListener unmarshalErrorLogListener = LogListener.matches(UNMARSHALING_ERROR_PATTERN).atLeast(1).build();
customLog.registerListener(unmarshalErrorLogListener);
assert marshaller != null;
readCnt.set(Integer.MAX_VALUE);
startGrid(0);
for (int i = 0; i < 100; i++) grid(0).cache(CACHE).put(new TestKey(String.valueOf(i)), i);
readCnt.set(1);
startGrid(1);
readCnt.set(Integer.MAX_VALUE);
for (int i = 0; i < 50; i++) assert grid(1).cache(CACHE).get(new TestKey(String.valueOf(i))) != null;
stopGrid(0);
for (int i = 50; i < 100; i++) assertNull(grid(1).cache(CACHE).get(new TestKey(String.valueOf(i))));
assertTrue("Unmarshal log error message is not valid.", unmarshalErrorLogListener.check());
}
use of org.apache.ignite.testframework.LogListener in project ignite by apache.
the class CorruptedTreeFailureHandlingTest method testCorruptedPage.
/**
* Check that if a corrupted page exists, an {@link CorruptedTreeException}
* will be thrown and a diagnostic file will be generated.
*
* @throws Exception If failed.
*/
@Test
public void testCorruptedPage() throws Exception {
IgniteEx srv = startGrid(0);
File diagnosticDir = new File(srv.context().config().getWorkDirectory(), "diagnostic");
FileUtils.deleteDirectory(diagnosticDir);
srv.cluster().state(ClusterState.ACTIVE);
IgniteCache<Integer, Integer> cache = srv.getOrCreateCache(DEFAULT_CACHE_NAME);
for (int i = 0; i < 10; i++) cache.put(i, i);
int pageSize = srv.configuration().getDataStorageConfiguration().getPageSize();
int grpId = srv.context().cache().cacheGroups().stream().filter(context -> context.cacheOrGroupName().equals(DEFAULT_CACHE_NAME)).findAny().orElseThrow(() -> new RuntimeException("Cache group not found")).groupId();
stopGrid(0, false);
// Node is stopped, we're ready to corrupt partition data.
long link = linkRef.get();
long pageId = PageIdUtils.pageId(link);
int itemId = PageIdUtils.itemId(link);
ByteBuffer pageBuf = ByteBuffer.allocateDirect(pageSize);
OpenOption[] options = { StandardOpenOption.READ, StandardOpenOption.WRITE };
try (RandomAccessFileIO fileIO = new RandomAccessFileIO(fileRef.get(), options)) {
DataPageIO dataPageIO = DataPageIO.VERSIONS.latest();
long pageOff = pageSize + PageIdUtils.pageIndex(pageId) * pageSize;
// Read index page.
fileIO.position(pageOff);
fileIO.readFully(pageBuf);
long pageAddr = GridUnsafe.bufferAddress(pageBuf);
// Remove existing item from index page.
dataPageIO.removeRow(pageAddr, itemId, pageSize);
// Recalculate CRC.
PageIO.setCrc(pageAddr, 0);
pageBuf.rewind();
PageIO.setCrc(pageAddr, FastCrc.calcCrc(pageBuf, pageSize));
// Write it back.
pageBuf.rewind();
fileIO.position(pageOff);
fileIO.writeFully(pageBuf);
}
LogListener logLsnr = LogListener.matches("CorruptedTreeException has occurred. " + "To diagnose it, make a backup of the following directories: ").build();
srv = startGrid(0, cfg -> {
cfg.setGridLogger(new ListeningTestLogger(cfg.getGridLogger(), logLsnr));
});
// Add modified page to WAL so it won't be restored to previous (valid) state.
pageBuf.rewind();
ByteBuffer cpBuf = ByteBuffer.allocate(pageBuf.capacity());
cpBuf.put(pageBuf);
PageSnapshot pageSnapshot = new PageSnapshot(new FullPageId(pageId, grpId), cpBuf.array(), pageSize);
srv.context().cache().context().wal().log(pageSnapshot);
// Access cache.
cache = srv.cache(DEFAULT_CACHE_NAME);
try {
for (int i = 0; i < CACHE_ENTRIES; i++) cache.get(i);
fail("Cache operations are expected to fail");
} catch (Throwable e) {
assertTrue(X.hasCause(e, CorruptedTreeException.class));
}
assertTrue(GridTestUtils.waitForCondition(() -> G.allGrids().isEmpty(), 10_000L));
assertTrue(diagnosticDir.exists());
assertTrue(diagnosticDir.isDirectory());
Pattern corruptedPagesFileNamePtrn = corruptedPagesFileNamePattern();
File[] txtFiles = diagnosticDir.listFiles((dir, name) -> corruptedPagesFileNamePtrn.matcher(name).matches());
assertFalse(F.isEmpty(txtFiles));
assertEquals(1, txtFiles.length);
assertTrue(logLsnr.check());
}
use of org.apache.ignite.testframework.LogListener in project ignite by apache.
the class EagerTtlTest method testNotEagerExpireOnPut.
/**
* Checks that an assertion error does not happen during expiration in transactions.
*
* @throws Exception If failed.
*/
@Test
public void testNotEagerExpireOnPut() throws Exception {
eagerTtl = false;
IgniteEx ignite = startGrid(0);
ignite.cluster().state(ClusterState.ACTIVE);
LogListener assertListener = LogListener.matches(ANY_ASSERTION_ERR).build();
listeningLog.registerListener(assertListener);
IgniteCache<Integer, Integer> cache = ignite.cache(DEFAULT_CACHE_NAME);
for (int i = 0; i < ENTRIES; i++) cache.put(i, i);
for (TransactionIsolation isolation : TransactionIsolation.values()) {
U.sleep(EXPIRATION_TIME);
for (int i = 0; i < ENTRIES; i++) {
try (Transaction tx = ignite.transactions().txStart(TransactionConcurrency.OPTIMISTIC, isolation)) {
if (i % 2 == 0)
cache.putAll(Collections.singletonMap(i, isolation.ordinal() + 1));
else
cache.getAndPut(i, isolation.ordinal() + 1);
tx.commit();
}
}
}
assertFalse(GridTestUtils.waitForCondition(assertListener::check, 2_000));
}
use of org.apache.ignite.testframework.LogListener in project ignite by apache.
the class ListeningTestLoggerTest method testUnregister.
/**
* Checks that re-register works fine.
*/
@Test
public void testUnregister() {
String msg = "catch me";
LogListener lsnr1 = LogListener.matches(msg).times(1).build();
LogListener lsnr2 = LogListener.matches(msg).times(2).build();
log.registerListener(lsnr1);
log.registerListener(lsnr2);
log.info(msg);
log.unregisterListener(lsnr1);
log.info(msg);
assertTrue(lsnr1.check());
assertTrue(lsnr2.check());
// Repeat these steps to ensure that the state is cleared during registration.
log.registerListener(lsnr1);
log.registerListener(lsnr2);
log.info(msg);
log.unregisterListener(lsnr1);
log.info(msg);
assertTrue(lsnr1.check());
assertTrue(lsnr2.check());
}
Aggregations