ignite-db-x Made H2RowStore abstract to be reused from core module.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/fc2d77d4 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/fc2d77d4 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/fc2d77d4 Branch: refs/heads/ignite-db-x-10884 Commit: fc2d77d4a027e81f56a12733b11525a414249ecf Parents: 2f7a22c Author: sboikov <[email protected]> Authored: Tue Apr 19 15:27:39 2016 +0300 Committer: sboikov <[email protected]> Committed: Tue Apr 19 15:27:39 2016 +0300 ---------------------------------------------------------------------- .../processors/cache/database/RowStore.java | 100 ++----------------- .../query/h2/database/H2RowStore.java | 89 ++++++++++++----- 2 files changed, 69 insertions(+), 120 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/fc2d77d4/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/RowStore.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/RowStore.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/RowStore.java index 50bf490..2ea2ee4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/RowStore.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/RowStore.java @@ -19,18 +19,15 @@ package org.apache.ignite.internal.processors.cache.database; import java.nio.ByteBuffer; import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.IgniteException; import org.apache.ignite.internal.pagemem.FullPageId; import org.apache.ignite.internal.pagemem.Page; import org.apache.ignite.internal.pagemem.PageIdAllocator; import org.apache.ignite.internal.pagemem.PageMemory; -import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.CacheObjectContext; import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.database.freelist.FreeList; import org.apache.ignite.internal.processors.cache.database.tree.io.DataPageIO; import org.apache.ignite.internal.processors.cache.database.tree.util.PageHandler; -import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import static org.apache.ignite.internal.pagemem.PageIdUtils.dwordsOffset; import static org.apache.ignite.internal.pagemem.PageIdUtils.linkFromDwordOffset; @@ -42,24 +39,21 @@ import static org.apache.ignite.internal.processors.cache.database.tree.util.Pag */ public class RowStore<T extends CacheDataRow> { /** */ - private final FreeList freeList; + protected final FreeList freeList; /** */ - private final PageMemory pageMem; + protected final PageMemory pageMem; /** */ - private final GridCacheContext<?,?> cctx; + protected final GridCacheContext<?,?> cctx; /** */ - private final CacheObjectContext coctx; + protected final CacheObjectContext coctx; /** */ private volatile long lastDataPageId; /** */ - private final RowFactory<T> rowFactory; - - /** */ private final PageHandler<CacheDataRow> writeRow = new PageHandler<CacheDataRow>() { @Override public int run(Page page, ByteBuffer buf, CacheDataRow row, int ignore) throws IgniteCheckedException { int entrySize = DataPageIO.getEntrySize(coctx, row.key(), row.value()); @@ -94,13 +88,11 @@ public class RowStore<T extends CacheDataRow> { /** * @param cctx Cache context. */ - public RowStore(GridCacheContext<?,?> cctx, RowFactory<T> rowFactory, FreeList freeList) { - assert rowFactory != null; + public RowStore(GridCacheContext<?,?> cctx, FreeList freeList) { assert cctx != null; this.cctx = cctx; this.freeList = freeList; - this.rowFactory = rowFactory; coctx = cctx.cacheObjectContext(); pageMem = cctx.shared().database().pageMemory(); @@ -111,7 +103,7 @@ public class RowStore<T extends CacheDataRow> { * @return Page. * @throws IgniteCheckedException If failed. */ - private Page page(long pageId) throws IgniteCheckedException { + protected final Page page(long pageId) throws IgniteCheckedException { return pageMem.page(new FullPageId(pageId, cctx.cacheId())); } @@ -139,63 +131,6 @@ public class RowStore<T extends CacheDataRow> { } /** - * !!! This method must be invoked in read or write lock of referring index page. It is needed to - * !!! make sure that row at this link will be invisible, when the link will be removed from - * !!! from all the index pages, so that row can be safely erased from the data page. - * - * @param link Link. - * @return Row. - * @throws IgniteCheckedException If failed. - */ - public T getRow(long link) throws IgniteCheckedException { - try (Page page = page(pageId(link))) { - ByteBuffer buf = page.getForRead(); - - try { - T existing = rowFactory.cachedRow(link); - - if (existing != null) - return existing; - - DataPageIO io = DataPageIO.VERSIONS.forPage(buf); - - int dataOff = io.getDataOffset(buf, dwordsOffset(link)); - - buf.position(dataOff); - - // Skip entry size. - buf.getShort(); - - CacheObject key = coctx.processor().toCacheObject(coctx, buf); - CacheObject val = coctx.processor().toCacheObject(coctx, buf); - - int topVer = buf.getInt(); - int nodeOrderDrId = buf.getInt(); - long globalTime = buf.getLong(); - long order = buf.getLong(); - - GridCacheVersion ver = new GridCacheVersion(topVer, nodeOrderDrId, globalTime, order); - - T row; - - try { - row = rowFactory.createRow(key, val, ver, link, 0); - } - catch (IgniteCheckedException e) { - throw new IgniteException(e); - } - - assert row.version() != null : row; - - return row; - } - finally { - page.releaseRead(); - } - } - } - - /** * @param expLastDataPageId Expected last data page ID. * @return Next data page ID. */ @@ -247,27 +182,4 @@ public class RowStore<T extends CacheDataRow> { nextDataPage(pageId, row.partition()); } } - - /** - * - */ - protected interface RowFactory<T> { - /** - * @param link Link. - * @return Row. - */ - T cachedRow(long link); - - /** - * @param key Key. - * @param val Value. - * @param ver Version. - * @param link Link. - * @param expirationTime Expiration time. - * @return Row. - * @throws IgniteCheckedException If failed. - */ - T createRow(CacheObject key, CacheObject val, GridCacheVersion ver, long link, long expirationTime) - throws IgniteCheckedException; - } } http://git-wip-us.apache.org/repos/asf/ignite/blob/fc2d77d4/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowStore.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowStore.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowStore.java index 2495237..cd0cc4b 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowStore.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowStore.java @@ -17,62 +17,99 @@ package org.apache.ignite.internal.processors.query.h2.database; +import java.nio.ByteBuffer; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.pagemem.Page; import org.apache.ignite.internal.pagemem.PageIdUtils; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.database.RowStore; -import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.processors.cache.database.freelist.FreeList; +import org.apache.ignite.internal.processors.cache.database.tree.io.DataPageIO; +import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row; import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowDescriptor; +import static org.apache.ignite.internal.pagemem.PageIdUtils.dwordsOffset; +import static org.apache.ignite.internal.pagemem.PageIdUtils.pageId; + /** * Data store for H2 rows. */ public class H2RowStore extends RowStore<GridH2Row> { + /** */ + private final GridH2RowDescriptor rowDesc; + /** * @param rowDesc Row descriptor. * @param cctx Cache context. * @param freeList Free list. */ public H2RowStore(GridH2RowDescriptor rowDesc, GridCacheContext<?,?> cctx, FreeList freeList) { - super(cctx, new H2RowFactory(rowDesc), freeList); + super(cctx, freeList); + + this.rowDesc = rowDesc; } + /** + * !!! This method must be invoked in read or write lock of referring index page. It is needed to + * !!! make sure that row at this link will be invisible, when the link will be removed from + * !!! from all the index pages, so that row can be safely erased from the data page. * + * @param link Link. + * @return Row. + * @throws IgniteCheckedException If failed. */ - static class H2RowFactory implements RowFactory<GridH2Row> { - /** */ - private final GridH2RowDescriptor rowDesc; + public GridH2Row getRow(long link) throws IgniteCheckedException { + try (Page page = page(pageId(link))) { + ByteBuffer buf = page.getForRead(); - /** - * @param rowDesc Row descriptor. - */ - public H2RowFactory(GridH2RowDescriptor rowDesc) { - assert rowDesc != null; + try { + GridH2Row existing = rowDesc.cachedRow(link); - this.rowDesc = rowDesc; - } + if (existing != null) + return existing; - /** {@inheritDoc} */ - @Override public GridH2Row cachedRow(long link) { - return rowDesc.cachedRow(link); - } + DataPageIO io = DataPageIO.VERSIONS.forPage(buf); + + int dataOff = io.getDataOffset(buf, dwordsOffset(link)); + + buf.position(dataOff); + + // Skip entry size. + buf.getShort(); + + CacheObject key = coctx.processor().toCacheObject(coctx, buf); + CacheObject val = coctx.processor().toCacheObject(coctx, buf); + + int topVer = buf.getInt(); + int nodeOrderDrId = buf.getInt(); + long globalTime = buf.getLong(); + long order = buf.getLong(); + + GridCacheVersion ver = new GridCacheVersion(topVer, nodeOrderDrId, globalTime, order); + + GridH2Row row; + + try { + row = rowDesc.createRow(key, PageIdUtils.partId(link), val, ver, 0); - /** {@inheritDoc} */ - @Override public GridH2Row createRow(CacheObject key, - CacheObject val, - GridCacheVersion ver, - long link, - long expirationTime) throws IgniteCheckedException { - GridH2Row row = rowDesc.createRow(key, PageIdUtils.partId(link), val, ver, 0); + row.link = link; + } + catch (IgniteCheckedException e) { + throw new IgniteException(e); + } - row.link = link; + assert row.ver != null; - rowDesc.cache(row); + rowDesc.cache(row); - return row; + return row; + } + finally { + page.releaseRead(); + } } } }
