From: Wolfgang M. M. <wol...@us...> - 2004-04-05 11:32:12
|
Update of /cvsroot/exist/eXist-1.0/src/org/dbxml/core/filer In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29682/src/org/dbxml/core/filer Modified Files: BTree.java Paged.java Log Message: Avoid recalculation of btree node data size on every update. Instead, use a private field for the size and update it only if required. Index: Paged.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/dbxml/core/filer/Paged.java,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** Paged.java 30 Mar 2004 16:56:32 -0000 1.21 --- Paged.java 5 Apr 2004 11:19:28 -0000 1.22 *************** *** 76,80 **** protected final static byte UNUSED = 0; ! public static int PAGE_SIZE = 4096; private RandomAccessFile raf; --- 76,80 ---- protected final static byte UNUSED = 0; ! protected static int PAGE_SIZE = 4096; private RandomAccessFile raf; *************** *** 86,91 **** private byte[] tempPageData = null; private byte[] tempHeaderData = null; - - private long lastPage = -1; public Paged() { --- 86,89 ---- *************** *** 342,347 **** */ protected final Page getPage(long pageNum) throws IOException { ! final Page p = new Page(pageNum); ! return p; } --- 340,344 ---- */ protected final Page getPage(long pageNum) throws IOException { ! return new Page(pageNum); } Index: BTree.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/dbxml/core/filer/BTree.java,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** BTree.java 29 Mar 2004 14:15:13 -0000 1.21 --- BTree.java 5 Apr 2004 11:19:28 -0000 1.22 *************** *** 68,72 **** import org.exist.storage.cache.LRDCache; import org.exist.util.ByteConversion; - import org.exist.util.VariableByteCoding; import org.exist.util.VariableByteInputStream; import org.exist.util.VariableByteOutputStream; --- 68,71 ---- *************** *** 337,349 **** protected final class BTreeNode implements Cacheable { ! public Page page; private BTreePageHeader ph; private Value[] values = null; private long[] ptrs = null; private BTreeNode parent = null; private int refCount = 0; private int timestamp = 0; ! protected boolean saved = true; public BTreeNode(Page page) { this.page = page; --- 336,353 ---- protected final class BTreeNode implements Cacheable { ! private Page page; private BTreePageHeader ph; + private Value[] values = null; private long[] ptrs = null; + private BTreeNode parent = null; private int refCount = 0; private int timestamp = 0; ! ! private boolean saved = true; + private int currentDataLen = -1; + public BTreeNode(Page page) { this.page = page; *************** *** 415,443 **** } ! private final int _calcDataLen() { ! int length = 0; ! if (ptrs != null) { ! for (int i = 0; i < ptrs.length; i++) { ! length += VariableByteCoding.getSize(ptrs[i]); ! } ! } ! //length = ptrs.length * 8; ! for (int i = 0; i < values.length; i++) ! length = ! length + values[i].getLength() + ((fileHeader.getFixedKeyLen() < 0) ? 2 : 0); ! return length; } ! ! private int calcDataLen() { ! int length = ptrs == null ? 0 : ptrs.length << 3; if(fileHeader.getFixedKeyLen() < 0) ! length += 2 * values.length; for (int i = 0; i < values.length; i++) ! length += values[i].getLength(); ! return length; } private boolean mustSplit() { ! return calcDataLen() > fileHeader.getWorkSize(); } --- 419,461 ---- } ! /** ! * Returns the raw data size (in bytes) required by this node. ! * ! * @return ! */ ! private int getDataLen() { ! return currentDataLen < 0 ? recalculateDataLen() : ! currentDataLen; } ! ! /** ! * Recalculates the raw data size (in bytes) required by this node. ! * ! * @return ! */ ! private int recalculateDataLen() { ! currentDataLen = ptrs == null ? 0 : ptrs.length << 3; if(fileHeader.getFixedKeyLen() < 0) ! currentDataLen += 2 * values.length; for (int i = 0; i < values.length; i++) ! currentDataLen += values[i].getLength(); ! return currentDataLen; ! } ! ! /** ! * Add the raw data size required to store the value to the internal ! * data size of this node. ! * ! * @param value ! */ ! private void adjustDataLen(Value value) { ! currentDataLen += 8; ! if(fileHeader.getFixedKeyLen() < 0) ! currentDataLen += 2; ! currentDataLen += value.getLength(); } private boolean mustSplit() { ! return getDataLen() > fileHeader.getWorkSize(); } *************** *** 635,639 **** setValues(deleteArrayValue(values, idx)); setPointers(deleteArrayLong(ptrs, idx)); ! //cache.add(this); return oldPtr; } --- 653,657 ---- setValues(deleteArrayValue(values, idx)); setPointers(deleteArrayLong(ptrs, idx)); ! recalculateDataLen(); return oldPtr; } *************** *** 667,680 **** idx = - (idx + 1); ! setValues(insertArrayValue(values, value.trim(), ! //new Value(value.getData()), ! idx)); setPointers(insertArrayLong(ptrs, pointer, idx)); ! //cache.add(this); ! boolean split = calcDataLen() > fileHeader.getWorkSize(); ! if (split) split(); - - //write(); } return -1; --- 685,693 ---- idx = - (idx + 1); ! setValues(insertArrayValue(values, value, idx)); ! adjustDataLen(value); setPointers(insertArrayLong(ptrs, pointer, idx)); ! if (getDataLen() > fileHeader.getWorkSize()) split(); } return -1; *************** *** 692,697 **** setValues(insertArrayValue(values, value, idx)); setPointers(insertArrayLong(ptrs, rightPointer, idx + 1)); ! //cache.add(this); ! boolean split = calcDataLen() > fileHeader.getWorkSize(); if (split) --- 705,709 ---- setValues(insertArrayValue(values, value, idx)); setPointers(insertArrayLong(ptrs, rightPointer, idx + 1)); ! boolean split = recalculateDataLen() > fileHeader.getWorkSize(); if (split) *************** *** 749,752 **** --- 761,765 ---- setValues(leftVals); setPointers(leftPtrs); + recalculateDataLen(); //cache.add(this); *************** *** 759,770 **** rNode.setValues(rightVals); rNode.setPointers(rightPtrs); cache.add(rNode); parent.setValues(new Value[] { separator }); parent.setPointers(new long[] { page.getPageNum(), rNode.page.getPageNum()}); cache.add(parent); setRootNode(parent); if(rNode.mustSplit()) { ! LOG.debug(getFile().getName() + " right node requires second split: " + rNode.calcDataLen()); rNode.split(); } --- 772,785 ---- rNode.setValues(rightVals); rNode.setPointers(rightPtrs); + rNode.recalculateDataLen(); cache.add(rNode); parent.setValues(new Value[] { separator }); parent.setPointers(new long[] { page.getPageNum(), rNode.page.getPageNum()}); + parent.recalculateDataLen(); cache.add(parent); setRootNode(parent); if(rNode.mustSplit()) { ! LOG.debug(getFile().getName() + " right node requires second split: " + rNode.getDataLen()); rNode.split(); } *************** *** 773,785 **** rNode.setValues(rightVals); rNode.setPointers(rightPtrs); cache.add(rNode); parent.promoteValue(separator, rNode.page.getPageNum()); if(rNode.mustSplit()) { ! LOG.debug(getFile().getName() + " right node requires second split: " + rNode.calcDataLen()); rNode.split(); } } if(mustSplit()) { ! LOG.debug(getFile().getName() + "left node requires second split: " + calcDataLen()); split(); } --- 788,801 ---- rNode.setValues(rightVals); rNode.setPointers(rightPtrs); + rNode.recalculateDataLen(); cache.add(rNode); parent.promoteValue(separator, rNode.page.getPageNum()); if(rNode.mustSplit()) { ! LOG.debug(getFile().getName() + " right node requires second split: " + rNode.getDataLen()); rNode.split(); } } if(mustSplit()) { ! LOG.debug(getFile().getName() + "left node requires second split: " + getDataLen()); split(); } *************** *** 1046,1050 **** setValues(deleteArrayValue(values, leftIdx)); setPointers(deleteArrayLong(ptrs, leftIdx)); ! //cache.add(this); } break; --- 1062,1066 ---- setValues(deleteArrayValue(values, leftIdx)); setPointers(deleteArrayLong(ptrs, leftIdx)); ! recalculateDataLen(); } break; *************** *** 1056,1060 **** setValues(deleteArrayValue(values, i)); setPointers(deleteArrayLong(ptrs, i)); ! //cache.add(this); } break; --- 1072,1076 ---- setValues(deleteArrayValue(values, i)); setPointers(deleteArrayLong(ptrs, i)); ! recalculateDataLen(); } break; *************** *** 1076,1080 **** setPointers(deleteArrayLong(ptrs, i)); --i; ! //cache.add(this); } } --- 1092,1096 ---- setPointers(deleteArrayLong(ptrs, i)); --i; ! recalculateDataLen(); } } *************** *** 1094,1098 **** setPointers(deleteArrayLong(ptrs, i)); --i; ! //cache.add(this); } } --- 1110,1114 ---- setPointers(deleteArrayLong(ptrs, i)); --i; ! recalculateDataLen(); } } *************** *** 1112,1116 **** setPointers(deleteArrayLong(ptrs, i)); --i; ! //cache.add(this); } break; --- 1128,1132 ---- setPointers(deleteArrayLong(ptrs, i)); --i; ! recalculateDataLen(); } break; *************** *** 1127,1131 **** setPointers(deleteArrayLong(ptrs, i)); --i; ! //cache.add(this); } break; --- 1143,1147 ---- setPointers(deleteArrayLong(ptrs, i)); --i; ! recalculateDataLen(); } break; *************** *** 1142,1146 **** setPointers(deleteArrayLong(ptrs, i)); --i; ! //cache.add(this); } else if (query.getOperator() == IndexQuery.TRUNC_RIGHT) break; --- 1158,1162 ---- setPointers(deleteArrayLong(ptrs, i)); --i; ! recalculateDataLen(); } else if (query.getOperator() == IndexQuery.TRUNC_RIGHT) break; *************** *** 1157,1161 **** setPointers(deleteArrayLong(ptrs, i)); --i; ! //cache.add(this); } --- 1173,1177 ---- setPointers(deleteArrayLong(ptrs, i)); --i; ! recalculateDataLen(); } *************** *** 1177,1181 **** setPointers(deleteArrayLong(ptrs, i)); --i; ! //cache.add(this); } break; --- 1193,1197 ---- setPointers(deleteArrayLong(ptrs, i)); --i; ! recalculateDataLen(); } break; *************** *** 1189,1193 **** setPointers(deleteArrayLong(ptrs, i)); --i; ! //cache.add(this); } break; --- 1205,1209 ---- setPointers(deleteArrayLong(ptrs, i)); --i; ! recalculateDataLen(); } break; |