Author: shawkins
Date: 2011-10-07 12:52:06 -0400 (Fri, 07 Oct 2011)
New Revision: 3544
Modified:
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/SizeUtility.java
trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestSizeUtility.java
Log:
TEIID-1750 optimizing sizeutility and correcting the reference initialization logic
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java 2011-10-07
15:25:46 UTC (rev 3543)
+++
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java 2011-10-07
16:52:06 UTC (rev 3544)
@@ -34,6 +34,7 @@
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
+import java.util.ListIterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
@@ -87,10 +88,13 @@
String[] types;
private LobManager lobManager;
- private BatchManagerImpl(Long newID, String[] types) {
+ private BatchManagerImpl(Long newID, Class<?>[] types) {
this.id = newID;
this.sizeUtility = new SizeUtility(types);
- this.types = types;
+ this.types = new String[types.length];
+ for (int i = 0; i < types.length; i++) {
+ this.types[i] = DataTypeManager.getDataTypeName(types[i]);
+ }
cache.createCacheGroup(newID);
}
@@ -381,7 +385,7 @@
TupleSourceType tupleSourceType) {
final Long newID = this.tsId.getAndIncrement();
int[] lobIndexes = LobManager.getLobIndexes(elements);
- String[] types = TupleBuffer.getTypeNames(elements);
+ Class<?>[] types = getTypeClasses(elements);
BatchManagerImpl batchManager = createBatchManager(newID, types);
LobManager lobManager = null;
FileStore lobStore = null;
@@ -404,7 +408,7 @@
public STree createSTree(final List elements, String groupName, int keyLength) {
Long newID = this.tsId.getAndIncrement();
int[] lobIndexes = LobManager.getLobIndexes(elements);
- String[] types = TupleBuffer.getTypeNames(elements);
+ Class<?>[] types = getTypeClasses(elements);
BatchManagerImpl bm = createBatchManager(newID, types);
LobManager lobManager = null;
if (lobIndexes != null) {
@@ -422,7 +426,16 @@
return new STree(keyManager, bm, new ListNestedSortComparator(compareIndexes),
getProcessorBatchSize(elements), getProcessorBatchSize(elements.subList(0, keyLength)),
keyLength, lobManager);
}
- private BatchManagerImpl createBatchManager(final Long newID, String[] types) {
+ private static Class<?>[] getTypeClasses(final List elements) {
+ Class<?>[] types = new Class[elements.size()];
+ for (ListIterator<? extends Expression> i = elements.listIterator();
i.hasNext();) {
+ Expression expr = i.next();
+ types[i.previousIndex()] = expr.getType();
+ }
+ return types;
+ }
+
+ private BatchManagerImpl createBatchManager(final Long newID, Class<?>[] types) {
BatchManagerImpl bm = new BatchManagerImpl(newID, types);
final AtomicBoolean prefersMemory = bm.prefersMemory;
AutoCleanupUtil.setCleanupReference(bm, new Removable() {
@@ -480,12 +493,14 @@
if (this.maxProcessingKBOrig < 0) {
this.maxProcessingKB = Math.max(Math.min(8 * processorBatchSize, Integer.MAX_VALUE),
(int)(.1 * maxMemory)/maxActivePlans);
}
- int memoryBatches = (this.maxProcessingKB * maxActivePlans + this.getMaxReserveKB()) /
(processorBatchSize * targetBytesPerRow / 1024);
- int logSize = 39 - Integer.numberOfLeadingZeros(memoryBatches);
+ //make a guess at the max number of batches
+ int memoryBatches = maxMemory / (processorBatchSize * targetBytesPerRow / 1024);
+ //memoryBatches represents a full batch, so assume that most will be smaller
+ int logSize = 35 - Integer.numberOfLeadingZeros(memoryBatches);
if (useWeakReferences) {
- weakReferenceCache = new WeakReferenceHashedValueCache<CacheEntry>(Math.min(20,
logSize));
+ weakReferenceCache = new WeakReferenceHashedValueCache<CacheEntry>(Math.min(30,
logSize));
}
- this.maxSoftReferences = 1 << Math.max(28, logSize+2);
+ this.maxSoftReferences = 1 << Math.min(30, logSize);
}
@Override
@@ -538,8 +553,9 @@
}
void persistBatchReferences() {
- if (activeBatchKB.get() == 0 || activeBatchKB.get() <= reserveBatchKB) {
- int memoryCount = activeBatchKB.get() + getMaxReserveKB() - reserveBatchKB;
+ int activeBatch = activeBatchKB.get();
+ if (activeBatch <= reserveBatchKB) {
+ int memoryCount = activeBatch + getMaxReserveKB() - reserveBatchKB;
if (DataTypeManager.isValueCacheEnabled()) {
if (memoryCount < getMaxReserveKB() / 8) {
DataTypeManager.setValueCacheEnabled(false);
@@ -551,11 +567,11 @@
}
int maxToFree = Math.max(maxProcessingKB>>1, reserveBatchKB>>3);
int freed = 0;
- while (true) {
- if (freed > maxToFree || activeBatchKB.get() == 0 || activeBatchKB.get() <
reserveBatchKB * .8) {
+ while (freed <= maxToFree && activeBatchKB.get() > reserveBatchKB * .8)
{
+ CacheEntry ce = memoryEntries.evict();
+ if (ce == null) {
break;
}
- CacheEntry ce = memoryEntries.evict();
freed += ce.getSizeEstimate();
activeBatchKB.addAndGet(-ce.getSizeEstimate());
synchronized (ce) {
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/SizeUtility.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/SizeUtility.java 2011-10-07
15:25:46 UTC (rev 3543)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/SizeUtility.java 2011-10-07
16:52:06 UTC (rev 3544)
@@ -26,8 +26,10 @@
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.teiid.core.types.DataTypeManager;
@@ -43,7 +45,7 @@
public static final int REFERENCE_SIZE = 8;
private static Map<Class<?>, int[]> SIZE_ESTIMATES = new
HashMap<Class<?>, int[]>(128);
-
+ private static Set<Class<?>> VARIABLE_SIZE_TYPES = new
HashSet<Class<?>>();
static {
SIZE_ESTIMATES.put(DataTypeManager.DefaultDataClasses.STRING, new int[] {100, 256});
SIZE_ESTIMATES.put(DataTypeManager.DefaultDataClasses.DATE, new int[] {20, 28});
@@ -61,13 +63,17 @@
SIZE_ESTIMATES.put(DataTypeManager.DefaultDataClasses.BOOLEAN, new int[] {1, 1});
SIZE_ESTIMATES.put(DataTypeManager.DefaultDataClasses.BIG_INTEGER, new int[] {75,
100});
SIZE_ESTIMATES.put(DataTypeManager.DefaultDataClasses.BIG_DECIMAL, new int[] {150,
200});
+ VARIABLE_SIZE_TYPES.add(DataTypeManager.DefaultDataClasses.STRING);
+ VARIABLE_SIZE_TYPES.add(DataTypeManager.DefaultDataClasses.OBJECT);
+ VARIABLE_SIZE_TYPES.add(DataTypeManager.DefaultDataClasses.BIG_INTEGER);
+ VARIABLE_SIZE_TYPES.add(DataTypeManager.DefaultDataClasses.BIG_DECIMAL);
}
private long bigIntegerEstimate;
private long bigDecimalEstimate;
- private String[] types;
+ private Class<?>[] types;
- public SizeUtility(String[] types) {
+ public SizeUtility(Class<?>[] types) {
boolean isValueCacheEnabled = DataTypeManager.isValueCacheEnabled();
bigIntegerEstimate = getSize(isValueCacheEnabled,
DataTypeManager.DefaultDataClasses.BIG_INTEGER);
bigDecimalEstimate = getSize(isValueCacheEnabled,
DataTypeManager.DefaultDataClasses.BIG_DECIMAL);
@@ -83,12 +89,8 @@
// array overhead for all the columns ( 8 object overhead + 4 ref + 4 int)
size += (rowLength * (48 + alignMemory(colLength * REFERENCE_SIZE)));
for (int col = 0; col < colLength; col++) {
- Class<?> type = DataTypeManager.getDataTypeClass(types[col]);
-
- if (type == DataTypeManager.DefaultDataClasses.STRING
- || type == DataTypeManager.DefaultDataClasses.OBJECT
- || type == DataTypeManager.DefaultDataClasses.BIG_INTEGER
- || type == DataTypeManager.DefaultDataClasses.BIG_DECIMAL) {
+ Class<?> type = types[col];
+ if (VARIABLE_SIZE_TYPES.contains(type)) {
int estRow = 0;
for (int row = 0; row < rowLength; row++) {
boolean updateEst = row == estRow;
Modified: trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestSizeUtility.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestSizeUtility.java 2011-10-07
15:25:46 UTC (rev 3543)
+++
trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestSizeUtility.java 2011-10-07
16:52:06 UTC (rev 3544)
@@ -34,6 +34,7 @@
import java.util.List;
import org.junit.Test;
+import org.teiid.core.types.DataTypeManager;
public class TestSizeUtility {
@@ -161,7 +162,12 @@
Arrays.asList(new Object[] { "c", new Integer(1),
Boolean.FALSE, new Double(0.0), "c", new Integer(1) }) //$NON-NLS-1$
//$NON-NLS-2$
};
- String[] types = {"string", "integer", "boolean",
"double", "string", "integer"};
//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$ //$NON-NLS-5$//$NON-NLS-6$
+ Class<?>[] types = {DataTypeManager.DefaultDataClasses.STRING,
+ DataTypeManager.DefaultDataClasses.INTEGER,
+ DataTypeManager.DefaultDataClasses.BOOLEAN,
+ DataTypeManager.DefaultDataClasses.DOUBLE,
+ DataTypeManager.DefaultDataClasses.STRING,
+ DataTypeManager.DefaultDataClasses.INTEGER};
long actualSize = new SizeUtility(types).getBatchSize(false,
Arrays.asList(expected));
assertEquals("Got unexpected size: ", 2667, actualSize); //$NON-NLS-1$