Skip to content

Commit

Permalink
GG-21678 Add page lock tracker and failure handler for all BPlustTree…
Browse files Browse the repository at this point in the history
… tests

Signed-off-by: Dmitriy Govorukhin <dmitriy.govorukhin@gmail.com>
  • Loading branch information
akalash authored and dgovorukhin committed Aug 2, 2019
1 parent 046595e commit a19d3e8
Showing 1 changed file with 50 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import java.util.function.Predicate;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.configuration.DataRegionConfiguration;
import org.apache.ignite.failure.FailureContext;
import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.mem.unsafe.UnsafeMemoryProvider;
import org.apache.ignite.internal.pagemem.FullPageId;
Expand All @@ -55,6 +56,7 @@
import org.apache.ignite.internal.pagemem.impl.PageMemoryNoStoreImpl;
import org.apache.ignite.internal.processors.cache.persistence.DataRegionMetricsImpl;
import org.apache.ignite.internal.processors.cache.persistence.DataStructure;
import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.PageLockTrackerManager;
import org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree;
import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusIO;
import org.apache.ignite.internal.processors.cache.persistence.tree.io.BPlusInnerIO;
Expand All @@ -63,6 +65,7 @@
import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageIO;
import org.apache.ignite.internal.processors.cache.persistence.tree.reuse.ReuseList;
import org.apache.ignite.internal.processors.cache.persistence.tree.util.PageLockListener;
import org.apache.ignite.internal.processors.failure.FailureProcessor;
import org.apache.ignite.internal.util.GridConcurrentHashSet;
import org.apache.ignite.internal.util.GridRandom;
import org.apache.ignite.internal.util.GridStripedLock;
Expand All @@ -73,11 +76,14 @@
import org.apache.ignite.internal.util.typedef.internal.SB;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.testframework.GridTestUtils;
import org.apache.ignite.testframework.junits.GridTestKernalContext;
import org.apache.ignite.testframework.junits.WithSystemProperty;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import org.jetbrains.annotations.Nullable;
import org.jsr166.ConcurrentLinkedHashMap;
import org.junit.Test;

import static org.apache.ignite.IgniteSystemProperties.IGNITE_PAGE_LOCK_TRACKER_CHECK_INTERVAL;
import static org.apache.ignite.internal.pagemem.PageIdUtils.effectivePageId;
import static org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.rnd;
import static org.apache.ignite.internal.processors.database.BPlusTreeSelfTest.TestTree.threadId;
Expand All @@ -87,6 +93,7 @@

/**
*/
@WithSystemProperty(key = IGNITE_PAGE_LOCK_TRACKER_CHECK_INTERVAL, value = "20000")
public class BPlusTreeSelfTest extends GridCommonAbstractTest {
/** */
private static final short LONG_INNER_IO = 30000;
Expand Down Expand Up @@ -136,6 +143,9 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest {
/** Future. */
private volatile GridCompoundFuture<?, ?> asyncRunFut;

/** Tracking of locks holding. */
private PageLockTrackerManager lockTrackerManager;

/**
* Check that we do not keep any locks at the moment.
*/
Expand All @@ -156,6 +166,10 @@ protected void assertNoLocks() {
pageMem = createPageMemory();

reuseList = createReuseList(CACHE_ID, pageMem, 0, true);

lockTrackerManager = new PageLockTrackerManager(log, "testTreeManager");

lockTrackerManager.start();
}

/**
Expand Down Expand Up @@ -207,6 +221,9 @@ protected ReuseList createReuseList(int cacheId, PageMemory pageMem, long rootId
if (pageMem != null)
pageMem.stop(true);

if (lockTrackerManager != null)
lockTrackerManager.stop();

MAX_PER_PAGE = 0;
PUT_INC = 1;
RMV_INC = -1;
Expand Down Expand Up @@ -2701,7 +2718,7 @@ public static void checkPageId(long pageId, long pageAddr) {
*/
protected TestTree createTestTree(boolean canGetRow) throws IgniteCheckedException {
TestTree tree = new TestTree(
reuseList, canGetRow, CACHE_ID, pageMem, allocateMetaPage().pageId(), new TestPageLockListener());
reuseList, canGetRow, CACHE_ID, pageMem, allocateMetaPage().pageId(), lockTrackerManager);

assertEquals(0, tree.size());
assertEquals(0, tree.rootLevel());
Expand Down Expand Up @@ -2738,7 +2755,7 @@ public TestTree(
int cacheId,
PageMemory pageMem,
long metaPageId,
TestPageLockListener lsnr
PageLockTrackerManager lockTrackerManager
) throws IgniteCheckedException {
super(
"test",
Expand All @@ -2750,8 +2767,14 @@ public TestTree(
reuseList,
new IOVersions<>(new LongInnerIO(canGetRow)),
new IOVersions<>(new LongLeafIO()),
null,
lsnr
new FailureProcessor(new GridTestKernalContext(log)) {
@Override public boolean process(FailureContext failureCtx) {
lockTrackerManager.dumpLocksToLog();

return true;
}
},
new TestPageLockListener(lockTrackerManager.createPageLockTracker("testTree"))
);

PageIO.registerTest(latestInnerIO(), latestLeafIO());
Expand Down Expand Up @@ -3035,19 +3058,32 @@ private static class TestPageLockListener implements PageLockListener {
/** */
static ConcurrentMap<Object, Map<Long, Long>> writeLocks = new ConcurrentHashMap<>();

/** */
private final PageLockListener delegate;

/**
* @param delegate Real implementation of page lock listener.
*/
private TestPageLockListener(
PageLockListener delegate) {

this.delegate = delegate;
}

/** {@inheritDoc} */
@Override public void onBeforeReadLock(int cacheId, long pageId, long page) {
delegate.onBeforeReadLock(cacheId, pageId, page);

if (PRINT_LOCKS)
X.println(" onBeforeReadLock: " + U.hexLong(pageId));
//
// U.dumpStack();

assertNull(beforeReadLock.put(threadId(), pageId));
}

/** {@inheritDoc} */
@Override public void onReadLock(int cacheId, long pageId, long page, long pageAddr) {
delegate.onReadLock(cacheId, pageId, page, pageAddr);

if (PRINT_LOCKS)
X.println(" onReadLock: " + U.hexLong(pageId));

Expand All @@ -3064,6 +3100,8 @@ private static class TestPageLockListener implements PageLockListener {

/** {@inheritDoc} */
@Override public void onReadUnlock(int cacheId, long pageId, long page, long pageAddr) {
delegate.onReadUnlock(cacheId, pageId, page, pageAddr);

if (PRINT_LOCKS)
X.println(" onReadUnlock: " + U.hexLong(pageId));

Expand All @@ -3076,6 +3114,8 @@ private static class TestPageLockListener implements PageLockListener {

/** {@inheritDoc} */
@Override public void onBeforeWriteLock(int cacheId, long pageId, long page) {
delegate.onBeforeWriteLock(cacheId, pageId, page);

if (PRINT_LOCKS)
X.println(" onBeforeWriteLock: " + U.hexLong(pageId));

Expand All @@ -3084,10 +3124,10 @@ private static class TestPageLockListener implements PageLockListener {

/** {@inheritDoc} */
@Override public void onWriteLock(int cacheId, long pageId, long page, long pageAddr) {
delegate.onWriteLock(cacheId, pageId, page, pageAddr);

if (PRINT_LOCKS)
X.println(" onWriteLock: " + U.hexLong(pageId));
//
// U.dumpStack();

if (pageAddr != 0L) {
checkPageId(pageId, pageAddr);
Expand All @@ -3105,6 +3145,8 @@ private static class TestPageLockListener implements PageLockListener {

/** {@inheritDoc} */
@Override public void onWriteUnlock(int cacheId, long pageId, long page, long pageAddr) {
delegate.onWriteUnlock(cacheId, pageId, page, pageAddr);

if (PRINT_LOCKS)
X.println(" onWriteUnlock: " + U.hexLong(pageId));

Expand Down

0 comments on commit a19d3e8

Please sign in to comment.