Search in sources :

Example 1 with PageCache

use of org.apache.activemq.artemis.core.paging.cursor.PageCache in project activemq-artemis by apache.

the class PageSubscriptionImpl method getPageInfo.

private PageCursorInfo getPageInfo(final long pageNr) {
    synchronized (consumedPages) {
        PageCursorInfo pageInfo = consumedPages.get(pageNr);
        if (pageInfo == null) {
            PageCache cache = cursorProvider.getPageCache(pageNr);
            if (cache == null) {
                return null;
            }
            pageInfo = new PageCursorInfo(pageNr, cache.getNumberOfMessages(), cache);
            consumedPages.put(pageNr, pageInfo);
        }
        return pageInfo;
    }
}
Also used : PageCache(org.apache.activemq.artemis.core.paging.cursor.PageCache)

Example 2 with PageCache

use of org.apache.activemq.artemis.core.paging.cursor.PageCache in project activemq-artemis by apache.

the class PageCursorProviderImpl method getPageCache.

@Override
public PageCache getPageCache(final long pageId) {
    try {
        PageCache cache;
        synchronized (softCache) {
            if (pageId > pagingStore.getCurrentWritingPage()) {
                return null;
            }
            cache = softCache.get(pageId);
            if (cache == null) {
                if (!pagingStore.checkPageFileExists((int) pageId)) {
                    return null;
                }
                cache = createPageCache(pageId);
                // anyone reading from this cache will have to wait reading to finish first
                // we also want only one thread reading this cache
                logger.tracef("adding pageCache pageNr=%d into cursor = %s", pageId, this.pagingStore.getAddress());
                readPage((int) pageId, cache);
                softCache.put(pageId, cache);
            }
        }
        return cache;
    } catch (Exception e) {
        throw new RuntimeException(e.getMessage(), e);
    }
}
Also used : PageCache(org.apache.activemq.artemis.core.paging.cursor.PageCache)

Example 3 with PageCache

use of org.apache.activemq.artemis.core.paging.cursor.PageCache in project activemq-artemis by apache.

the class PageCursorStressTest method testReadNextPage.

@Test
public void testReadNextPage() throws Exception {
    final int NUM_MESSAGES = 1;
    int numberOfPages = addMessages(NUM_MESSAGES, 1024);
    System.out.println("NumberOfPages = " + numberOfPages);
    PageCursorProvider cursorProvider = lookupCursorProvider();
    PageCache cache = cursorProvider.getPageCache(2);
    assertNull(cache);
}
Also used : PageCursorProvider(org.apache.activemq.artemis.core.paging.cursor.PageCursorProvider) PageCache(org.apache.activemq.artemis.core.paging.cursor.PageCache) Test(org.junit.Test)

Example 4 with PageCache

use of org.apache.activemq.artemis.core.paging.cursor.PageCache in project activemq-artemis by apache.

the class PageSubscriptionImpl method internalGetNext.

private PagedReference internalGetNext(final PagePosition pos) {
    PagePosition retPos = pos.nextMessage();
    PageCache cache = cursorProvider.getPageCache(pos.getPageNr());
    if (cache != null && !cache.isLive() && retPos.getMessageNr() >= cache.getNumberOfMessages()) {
        // The next message is beyond what's available at the current page, so we need to move to the next page
        cache = null;
    }
    // it will scan for the next available page
    while ((cache == null && retPos.getPageNr() <= pageStore.getCurrentWritingPage()) || (cache != null && retPos.getPageNr() <= pageStore.getCurrentWritingPage() && cache.getNumberOfMessages() == 0)) {
        retPos = moveNextPage(retPos);
        cache = cursorProvider.getPageCache(retPos.getPageNr());
    }
    if (cache == null) {
        // it will be null in the case of the current writing page
        return null;
    } else {
        PagedMessage serverMessage = cache.getMessage(retPos.getMessageNr());
        if (serverMessage != null) {
            return cursorProvider.newReference(retPos, serverMessage, this);
        } else {
            return null;
        }
    }
}
Also used : PagedMessage(org.apache.activemq.artemis.core.paging.PagedMessage) PagePosition(org.apache.activemq.artemis.core.paging.cursor.PagePosition) PageCache(org.apache.activemq.artemis.core.paging.cursor.PageCache)

Example 5 with PageCache

use of org.apache.activemq.artemis.core.paging.cursor.PageCache in project activemq-artemis by apache.

the class PageSubscriptionImpl method installTXCallback.

/**
 * @param tx
 * @param position
 */
private void installTXCallback(final Transaction tx, final PagePosition position) {
    if (position.getRecordID() >= 0) {
        // It needs to persist, otherwise the cursor will return to the fist page position
        tx.setContainsPersistent();
    }
    PageCursorInfo info = getPageInfo(position);
    PageCache cache = info.getCache();
    long size = 0;
    if (cache != null) {
        size = getPersistentSize(cache.getMessage(position.getMessageNr()));
        position.setPersistentSize(size);
    }
    logger.tracef("InstallTXCallback looking up pagePosition %s, result=%s", position, info);
    info.remove(position);
    PageCursorTX cursorTX = (PageCursorTX) tx.getProperty(TransactionPropertyIndexes.PAGE_CURSOR_POSITIONS);
    if (cursorTX == null) {
        cursorTX = new PageCursorTX();
        tx.putProperty(TransactionPropertyIndexes.PAGE_CURSOR_POSITIONS, cursorTX);
        tx.addOperation(cursorTX);
    }
    cursorTX.addPositionConfirmation(this, position);
}
Also used : PageCache(org.apache.activemq.artemis.core.paging.cursor.PageCache)

Aggregations

PageCache (org.apache.activemq.artemis.core.paging.cursor.PageCache)7 PagedMessage (org.apache.activemq.artemis.core.paging.PagedMessage)2 Test (org.junit.Test)2 NonExistentPage (org.apache.activemq.artemis.core.paging.cursor.NonExistentPage)1 PageCursorProvider (org.apache.activemq.artemis.core.paging.cursor.PageCursorProvider)1 PagePosition (org.apache.activemq.artemis.core.paging.cursor.PagePosition)1 PageCursorProviderImpl (org.apache.activemq.artemis.core.paging.cursor.impl.PageCursorProviderImpl)1 Page (org.apache.activemq.artemis.core.paging.impl.Page)1