[teiid-commits] teiid SVN: r4611 - in branches/7.7.x/engine/src: test/java/org/teiid/common/buffer/impl and 1 other directory.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Thu Nov 7 10:55:23 EST 2013
Author: jolee
Date: 2013-11-07 10:55:23 -0500 (Thu, 07 Nov 2013)
New Revision: 4611
Modified:
branches/7.7.x/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java
branches/7.7.x/engine/src/test/java/org/teiid/common/buffer/impl/TestBufferFrontedFileStoreCache.java
Log:
TEIID-2714: Buffer defrag not working, adding an option to make the buffer files more compact and
defaulting to a somewhat more conservative default
Modified: branches/7.7.x/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java
===================================================================
--- branches/7.7.x/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java 2013-11-06 21:18:40 UTC (rev 4610)
+++ branches/7.7.x/engine/src/main/java/org/teiid/common/buffer/impl/BufferFrontedFileStoreCache.java 2013-11-07 15:55:23 UTC (rev 4611)
@@ -59,6 +59,7 @@
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidRuntimeException;
import org.teiid.core.util.ExecutorUtils;
+import org.teiid.core.util.PropertiesUtils;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.logging.MessageLevel;
@@ -377,7 +378,9 @@
private AtomicBoolean defragRunning = new AtomicBoolean();
private AtomicInteger freedCounter = new AtomicInteger();
- private int truncateInterval = 10;
+ private boolean compactBufferFiles = PropertiesUtils.getBooleanProperty(System.getProperties(), "org.teiid.compactBufferFiles", false); //$NON-NLS-1$
+
+ private int truncateInterval = 4;
//defrag to release freespace held by storage files
final class DefragTask implements Runnable {
private AtomicInteger runs = new AtomicInteger();
@@ -398,6 +401,7 @@
}
private long truncate(boolean anySpace) {
+ anySpace |= compactBufferFiles;
long freed = 0;
for (int i = 0; i < sizeBasedStores.length; i++) {
BlockStore blockStore = sizeBasedStores[i];
@@ -412,6 +416,7 @@
}
private void defrag(boolean all) {
+ all |= compactBufferFiles;
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Running defrag"); //$NON-NLS-1$
}
@@ -585,6 +590,7 @@
}
} while ((size>>1) < maxStorageObjectSize);
this.sizeBasedStores = stores.toArray(new BlockStore[stores.size()]);
+ this.truncateInterval = compactBufferFiles?1:8;
}
boolean lowBlocks(boolean critical) {
@@ -666,7 +672,7 @@
}
}
} catch (Throwable e) {
- if ((e == BlockOutputStream.exceededMax && newEntry) || e == PhysicalInfo.sizeChanged) {
+ if (e == PhysicalInfo.sizeChanged) {
//entries are mutable after adding, the original should be removed shortly so just ignore
LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Object "+ entry.getId() +" changed size since first persistence, keeping the original."); //$NON-NLS-1$ //$NON-NLS-2$
} else if (e == BlockOutputStream.exceededMax){
@@ -1018,7 +1024,7 @@
LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Freed storage data block", info.block, "of size", blockStore.blockSize); //$NON-NLS-1$ //$NON-NLS-2$
}
if (!defragRunning.get()
- && (freedCounter.getAndIncrement()&Short.MAX_VALUE)==Short.MAX_VALUE //should be several gigabytes of turn over
+ && (freedCounter.getAndIncrement()&0x3fff)==0x3fff //should be several hundred megs of turn over
&& defragRunning.compareAndSet(false, true)) {
this.asynchPool.execute(defragTask);
}
@@ -1196,4 +1202,8 @@
this.asynchPool.shutdownNow();
}
+ public void setCompactBufferFiles(boolean compactBufferFiles) {
+ this.compactBufferFiles = compactBufferFiles;
+ }
+
}
\ No newline at end of file
Modified: branches/7.7.x/engine/src/test/java/org/teiid/common/buffer/impl/TestBufferFrontedFileStoreCache.java
===================================================================
--- branches/7.7.x/engine/src/test/java/org/teiid/common/buffer/impl/TestBufferFrontedFileStoreCache.java 2013-11-06 21:18:40 UTC (rev 4610)
+++ branches/7.7.x/engine/src/test/java/org/teiid/common/buffer/impl/TestBufferFrontedFileStoreCache.java 2013-11-07 15:55:23 UTC (rev 4611)
@@ -349,6 +349,38 @@
assertEquals(131072, cache.getDiskUsage());
}
+ @Test public void testDefragTruncateCompact() throws Exception {
+ cache = createLayeredCache(1<<15, 1<<15, true);
+ cache.setCompactBufferFiles(true);
+ cache.setTruncateInterval(1);
+ cache.setMinDefrag(10000000);
+ Serializer<Integer> s = new SimpleSerializer();
+ WeakReference<? extends Serializer<?>> ref = new WeakReference<Serializer<?>>(s);
+ cache.createCacheGroup(s.getId());
+ Integer cacheObject = Integer.valueOf(5000);
+
+ for (int i = 0; i < 30; i++) {
+ CacheEntry ce = new CacheEntry((long)i);
+ ce.setSerializer(ref);
+ ce.setObject(cacheObject);
+
+ cache.addToCacheGroup(s.getId(), ce.getId());
+ cache.add(ce, s);
+ }
+ assertEquals(950272, cache.getDiskUsage());
+ for (int i = 0; i < 25; i++) {
+ cache.remove(1l, (long)i);
+ }
+ assertEquals(950272, cache.getDiskUsage());
+ cache.setMinDefrag(0);
+ cache.setTruncateInterval(1);
+ cache.defragTask.run();
+ assertEquals(131072, cache.getDiskUsage());
+ cache.defragTask.run();
+ //we've reached a stable size
+ assertEquals(131072, cache.getDiskUsage());
+ }
+
@Test public void testDefragMin() throws Exception {
cache = createLayeredCache(1<<15, 1<<15, true);
cache.setMinDefrag(10000000);
More information about the teiid-commits
mailing list