Examples of PageNumber


Examples of org.chaidb.db.index.btree.bufmgr.PageNumber

        /* to prevent OOM */
        if (keySize > MAX_KEY_SIZE || keySize < MIN_KEY_SIZE) {
            throw new ChaiDBException(ErrorCode.BTREE_INVALID_BTREEPAGE, "keysize is out of bound:" + keySize);
        }

        pageNumber = new PageNumber(ByteTool.bytesToInt(rawPage, nodeOffset + BTreeSpec.NODE_OFF_PAGENUMBER, this.page.btreeSpec.isMsbFirst()));
        pageNumber.setTreeId(page.btreeSpec.btree.getBtreeId());

        flags = rawPage[nodeOffset + BTreeSpec.NODE_OFF_FLAGS];
        if (flags < 0 || flags > 3) {
            throw new ChaiDBException(ErrorCode.BTREE_INVALID_BTREEPAGE, "flags is out of bound:" + flags);
View Full Code Here

Examples of org.chaidb.db.index.btree.bufmgr.PageNumber

        node.nodeOffset = offset;
        node.keySize = key.length;
        if (node.keySize > MAX_KEY_SIZE || node.keySize < MIN_KEY_SIZE) {
            throw new ChaiDBException(ErrorCode.BTREE_INVALID_BTREEPAGE, "keysize is out of bound:" + node.keySize);
        }
        node.pageNumber = new PageNumber(dataPageNum);
        node.flags = 0;
        return node;
    }
View Full Code Here

Examples of org.chaidb.db.index.btree.bufmgr.PageNumber

        if (!isOverflowKey()) {
            System.arraycopy(page.getPage(), nodeOffset + BTreeSpec.NODE_HEADER_SIZE, key, 0, keySize);
        } else {
            // handle overflow key
            PageNumber overflowPageNumber = new PageNumber(ByteTool.bytesToInt(page.getPage(), nodeOffset + BTreeSpec.NODE_HEADER_SIZE, page.btreeSpec.isMsbFirst()));
            BTreePage overflowPage = new BTreePage(pageNumber.getTreeId(), overflowPageNumber, page.btreeSpec, page.buffer); //pageNumber must have valid treeid
            int keyLeft = keySize;
            int keyStartPos = 0;
            int dataLength = page.btreeSpec.getPageSize() - overflowPage.upperBound;
            int keyLength = (keyLeft < dataLength) ? keyLeft : dataLength;
            Vector v = new Vector();
            while (keyLeft > 0 && keyLength > 0) {
                try {
                    System.arraycopy(overflowPage.getPage(), overflowPage.upperBound, key, keyStartPos, keyLength);
                } catch (Exception e) {
                    logger.error("nodeoffset=0x" + Integer.toHexString(nodeOffset) + " keysize=0x" + Integer.toHexString(keySize) + " node pg=" + page.pageNumber.toHexString() + " overflowpg=0x" + Integer.toHexString(overflowPage.pageNumber.getPageNumber()) + " of file " + PageBufferManager.getInstance().getBTreeName(overflowPage.pageNumber.getTreeId()));
                    logger.error(e);

                    Debug.pageHistory(page.pageNumber);
                    for (int i = 0; i < v.size(); i++) {
                        PageNumber op = (PageNumber) v.get(i);
                        Debug.pageHistory(op);
                    }


                    String details = e.toString() + ". nodeoffset=0x" + Integer.toHexString(nodeOffset) + " keysize=0x" + Integer.toHexString(keySize) + " pg=0x" + Integer.toHexString(overflowPage.pageNumber.getPageNumber()) + " of file " + PageBufferManager.getInstance().getBTreeName(overflowPage.pageNumber.getTreeId()) + ".";
                    throw new ChaiDBException(ErrorCode.BTREE_BUFFER_OVERFLOW, details);
                }
                // unfix / release the overflow page
                page.buffer.releasePage(pageNumber.getTreeId(), overflowPage.pageNumber, false);
                keyStartPos += keyLength;
                keyLeft -= keyLength;
                if (keyLeft > 0 && overflowPage.nextPage.getPageNumber() > 0) {
                    overflowPage = new BTreePage(pageNumber.getTreeId(), overflowPage.nextPage, page.btreeSpec, page.buffer);
                    dataLength = page.btreeSpec.getPageSize() - overflowPage.upperBound;
                    keyLength = (keyLeft < dataLength) ? keyLeft : dataLength;
                } else if (keyLeft > 0 && overflowPage.nextPage.getPageNumber() <= 0) {
                    logger.error("[" + Thread.currentThread().getName() + "] time=" + System.currentTimeMillis() + " node offset=0x" + Integer.toHexString(getNodeOffset()) + "  keyLeft=0x" + Integer.toHexString(keyLeft) + " keySize=0x" + Integer.toHexString(keySize) + " node pageNumber=0x" + Integer.toHexString(page.pageNumber.getPageNumber()) + " overflowpage=0x" + Integer.toHexString(overflowPage.pageNumber.getPageNumber()) + " of " + page.buffer.getBTreeName(overflowPage.pageNumber.getTreeId()));
                    for (int i = 0; i < v.size(); i++) {
                        PageNumber op = (PageNumber) v.get(i);
                        Debug.dumpPage(op, page.buffer.getPage(page.pageNumber.getTreeId(), page.pageNumber));
                    }
                    //page in mem!
                    Debug.dumpPage(page.pageNumber, page.buffer.getPage(page.pageNumber.getTreeId(), page.pageNumber));
                    //page we have got!
View Full Code Here

Examples of org.chaidb.db.index.btree.bufmgr.PageNumber

            int keyLeft = key.length;
            int requireSpace;
            int left;
            int keyLength = 0;
            DataPage last = null;
            PageNumber firstOverflowPageNo = null;
            for (int i = 0; i < overflows; i++) {
                left = keyLeft;
                if (left <= 0) break;
                requireSpace = (left > freeSpace) ? freeSpace : left;
                keyLength = (keyLeft >= freeSpace) ? freeSpace : keyLeft;
                DataPage overflowPage = DataPage.newPage(page.btreeSpec, page.buffer, true, kContext, 0);

                /********* add by leon *******
                 * Here a little trick is played to reduce the log record number.
                 * First we turn off the needLog switch to avoiding log individually.
                 * After done, we can log in batch.
                 */
                overflowPage.setLogInfo(txnId, false);
                if (needLog) {
                    int pgno = overflowPage.getPageNumber().getPageNumber();
                    byte[] oldV = ByteTool.copyByteArray(overflowPage.getPage(), 0, BTreeSpec.PAGE_HEADER_SIZE);

                    byte[] newV = new byte[oldV.length];
                    System.arraycopy(oldV, 0, newV, 0, oldV.length);
                    System.arraycopy(ByteTool.intToBytes(4), 0, newV, BTreeSpec.OFF_FLAGS, 4);
                    System.arraycopy(ByteTool.shortToBytes((short) (overflowPage.upperBound - requireSpace)), 0, newV, BTreeSpec.OFF_UPPERBOUND, 2);
                    System.arraycopy(ByteTool.intToBytes(i == 0 ? page.pageNumber.getPageNumber() : last.pageNumber.getPageNumber()), 0, newV, BTreeSpec.OFF_PREVPAGE, 4);
                    if (ByteTool.compare(newV, 0, oldV, 0, oldV.length) != 0) {
                        BTreeReplLogRecord lr = new BTreeReplLogRecord(overflowPage.getPageNumber().getTreeId(), pgno, txnId, 0, oldV, newV, overflowPage.btreeSpec.btree.getType());
                        lr.log();
                    }
                }
                overflowPage.setOverflow();
                overflowPage.setUpperBound((short) (overflowPage.upperBound - requireSpace));
                if (i == 0) {
                    firstOverflowPageNo = overflowPage.pageNumber;
                    overflowPage.setPrevPage(page.pageNumber);
                } else {
                    overflowPage.setPrevPage(last.pageNumber);
                }
                overflowPage.setLogInfo(txnId, needLog);

                //set the previous page's next page
                if (i > 0) last.setNextPage(overflowPage.pageNumber);

                //add the new node
                if (keyLength > 0) {
                    /******************* Add by leon, Sep 30 2001 *************/
                    if (needLog) {
                        int newPageNo = overflowPage.pageNumber.getPageNumber();
                        BTreeAddRemoveLogRecord logRec = new BTreeAddRemoveLogRecord(page.getPageNumber().getTreeId(), newPageNo, txnId, BTreeAddRemoveLogRecord.ADD_FLAG, overflowPage.upperBound, ByteTool.copyByteArray(key, keyStartPos, keyLength), page.btreeSpec.btree.getType());
                        logRec.log();
                    }
                    /*************************************************************/
                    System.arraycopy(key, keyStartPos, overflowPage.page, overflowPage.upperBound, keyLength);
                    keyStartPos += keyLength;
                    keyLeft -= keyLength;
                }
                //release the previoius overflow page. Dont' release nonOverflowpage
                if (i > 0) page.buffer.releasePage(last.pageNumber.getTreeId(), last.pageNumber, true);
                last = overflowPage;
            }
            //release the last overflow page
            page.buffer.releasePage(last.pageNumber.getTreeId(), last.pageNumber, true);
            //Since newing a page will set its next,previous page to be BTreeSpec.INVALID_PGNO,
            //the last one has already been BTreeSpec.INVALID_PGNO and
            //the overflow page chain has a end!

            // add the new node to the current page
            /***************** Add by leon,2001-9-27 14:56 ********************/
            if (needLog) {
                int pgno = page.pageNumber.getPageNumber();
                byte[] newNode = ByteTool.copyByteArray(getHeader(), 0, BTreeSpec.NODE_HEADER_SIZE);
                newNode = ByteTool.append(newNode, ByteTool.intToBytes(firstOverflowPageNo.getPageNumber()));
                byte[] oldNode = ByteTool.copyByteArray(page.getPage(), nodeOffset, BTreeSpec.NODE_HEADER_SIZE + 4);
                byte[] emptyNode = new byte[BTreeSpec.NODE_HEADER_SIZE + keySize];
                if (ByteTool.compare(oldNode, 0, emptyNode, 0, BTreeSpec.NODE_HEADER_SIZE + keySize) == 0) {
                    BTreeAddRemoveLogRecord lr = new BTreeAddRemoveLogRecord(page.getPageNumber().getTreeId(), pgno, txnId, BTreeAddRemoveLogRecord.ADD_FLAG, nodeOffset, newNode, page.btreeSpec.btree.getType());
                    lr.log();
                } else if (oldNode != newNode) {
                    BTreeReplLogRecord lr = new BTreeReplLogRecord(page.getPageNumber().getTreeId(), pgno, txnId, nodeOffset, oldNode, newNode, page.btreeSpec.btree.getType());

                    lr.log();
                }
            }
            /******************************************************************/
            System.arraycopy(this.getHeader(), 0, page.getPage(), nodeOffset, BTreeSpec.NODE_HEADER_SIZE);
            // last pageNumber is the one we need here!!
            System.arraycopy(ByteTool.intToBytes(firstOverflowPageNo.getPageNumber()), 0, page.getPage(), nodeOffset + BTreeSpec.NODE_HEADER_SIZE, 4);

        }

    }
View Full Code Here

Examples of org.chaidb.db.index.btree.bufmgr.PageNumber

            if (page.page == null)
                throw new ChaiDBException(ErrorCode.BTREE_INVALID_DATAPAGE, "Page is null: " + page.pageNumber.toHexString() + " of " + page.getPageNumber().getTreeId());

            // 1. remove old key and free the overflow pages if true
            if (isOverflowKey()) {
                PageNumber overflowPageNumber = new PageNumber(ByteTool.bytesToInt(page.page, nodeOffset + BTreeSpec.NODE_HEADER_SIZE, page.btreeSpec.isMsbFirst()));
                overflowPageNumber.setTreeId(pageNumber.getTreeId());

                BTreePage overflowPage = new BTreePage(pageNumber.getTreeId(), overflowPageNumber, page.btreeSpec, page.buffer); //pageNumber must have current treeid
                // put into freeList
                /******************* Add by Leon, Sep 29 *****************/
                if (needLog) {
View Full Code Here

Examples of org.chaidb.db.index.btree.bufmgr.PageNumber

        kContext.checkLock(getBTreeName());
        if (key == null) return null;
        byte[] bytes = null;
        for (int i = 0; i < 3; i++) {
            try {
                PageNumber root = getTopRoot();
                bytes = lookup(key, root, kContext);
            } catch (ChaiDBException e) {
                if (i == 2) {
                    throw e;
                } else {
View Full Code Here

Examples of org.chaidb.db.index.btree.bufmgr.PageNumber

        kContext.checkLock(getBTreeName());
        ArrayList values = new ArrayList();
        for (int i = 0; i < 3; i++) {
            try {
                // if (islockTree) lm.getLock(MR1WLock.READ);
                PageNumber root = getTopRoot();
                rangeLookup(minKey, maxKey, includeMinKey, includeMaxKey, root, values, kContext);
            } catch (ChaiDBException e) {
                if (i == 2) {
                    throw e;
                } else {
View Full Code Here

Examples of org.chaidb.db.index.btree.bufmgr.PageNumber

            if (dataPageMixed) return;

            //for id2node, datapages are not freed yet.

            Enumeration pagenumbers = dataPages.keys();
            PageNumber ppn = null;
            while (pagenumbers.hasMoreElements()) {
                ppn = (PageNumber) pagenumbers.nextElement();
                DataPage dPage = new DataPage(id, ppn, btreeSpec, getBuffer());

                if (Debug.DEBUG_TRAVERAL) {
                    logger.fatal("saved data page is " + ppn.toHexString() + " ");
                }
                freeAPage(kContext, dPage);
            }
            if (Debug.DEBUG_TRAVERAL) {
                logger.fatal("end loopup");
View Full Code Here

Examples of org.chaidb.db.index.btree.bufmgr.PageNumber

        if (!page.isLeaf() && page.nextPage.getPageInFile() > BTreeSpec.INVALID_PAGENO) pageList.add(page.nextPage);


        for (int i = 0; i < page.getCurrNodeNumbers(); i++) {
            BTreeNode node = page.getNode(i);
            PageNumber p = node.getPageNumber();
            if (!page.isLeaf()) //add btree pages
                pageList.add(p);
            else {
                if (!dataPageMixed && !dataPages.containsKey(p)) {
                    PageNumber tmpPage = new PageNumber(p);
                    dataPages.put(tmpPage, tmpPage); //add data pages
                    if (Debug.DEBUG_TRAVERAL) {
                        logger.fatal("parent page is " + page.pageNumber.toHexString() + " ");
                        logger.fatal("data page is " + tmpPage.toHexString() + " ");
                    }

                }

                freeDataNode(p, node.getDataNodeOffset(), dataPageMixed, kContext);


            }

            if (node.isOverflowKey()) {
                p = new PageNumber(ByteTool.bytesToInt(page.getPage(), node.getNodeOffset() + BTreeSpec.NODE_HEADER_SIZE, btreeSpec.isMsbFirst()));
                p.setTreeId(id);

                freeOverFlowPages(p, kContext);
            }
View Full Code Here

Examples of org.chaidb.db.index.btree.bufmgr.PageNumber

            }

        } else {
            DataNode node = new DataNode(dPage, offset);
            if (node.isOverflow()) {
                PageNumber p = new PageNumber(ByteTool.bytesToInt(dPage.getPage(), node.getNodeOffset() + BTreeSpec.DATA_NODE_HEADER_SIZE, btreeSpec.isMsbFirst()));
                p.setTreeId(id);

                freeOverFlowPages(p, kContext);
            }
        }
View Full Code Here
TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.