logo       

Choosing A Webhost:
A web hosting service is a type of Internet hosting service that allows individuals and organizations to provide their own website accessible via the World Wide Web. Web hosts are companies that provide space on a server they own for use by their clients as well as providing Internet connectivity, typically in a data center. Web hosts can also provide data center space and connectivity to the Internet for servers they do not own to be located in their data center, called colocation. more...

svn commit: r437511 - in /jakarta/jcs/trunk/src: java/org/apache/jcs/auxili: msg#00079

jakarta.turbine.jcs.devel

Subject: svn commit: r437511 - in /jakarta/jcs/trunk/src: java/org/apache/jcs/auxiliary/disk/block/ test-conf/ test/org/apache/jcs/auxiliary/disk/block/

Author: asmuts
Date: Sun Aug 27 19:29:54 2006
New Revision: 437511

URL: http://svn.apache.org/viewvc?rev=437511&view=rev
Log:
Added configurable, periodic key persistence to the block disk cache.

Added rough disk file verification to block disk cache.


Modified:

jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDisk.java

jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskCache.java

jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskCacheAttributes.java

jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskKeyStore.java
jakarta/jcs/trunk/src/test-conf/TestBlockDiskCacheHuge.ccf

jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/block/HugeQuantityBlockDiskCacheLoadTest.java

Modified:
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDisk.java
URL:
http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDisk.java?rev=437511&r1=437510&r2=437511&view=diff
==============================================================================
---
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDisk.java
(original)
+++
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDisk.java
Sun Aug 27 19:29:54 2006
@@ -64,8 +64,13 @@
*/
public BlockDisk( File file )
throws FileNotFoundException
- {
+ {
this( file, DEFAULT_BLOCK_SIZE_BYTES );
+ if ( log.isInfoEnabled() )
+ {
+ log.info( "Used default block size [" + DEFAULT_BLOCK_SIZE_BYTES +
"]" );
+ }
+
}

/**

Modified:
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskCache.java
URL:
http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskCache.java?rev=437511&r1=437510&r2=437511&view=diff
==============================================================================
---
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskCache.java
(original)
+++
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskCache.java
Sun Aug 27 19:29:54 2006
@@ -92,10 +92,9 @@

try
{
- if ( cacheAttributes.getBlockSizeBytes() > 0 )
+ if ( this.blockDiskCacheAttributes.getBlockSizeBytes() > 0 )
{
- this.dataFile = new BlockDisk( new File( rootDirectory,
fileName + ".data" ), cacheAttributes
- .getBlockSizeBytes() );
+ this.dataFile = new BlockDisk( new File( rootDirectory,
fileName + ".data" ), this.blockDiskCacheAttributes.getBlockSizeBytes() );
}
else
{
@@ -104,7 +103,9 @@

keyStore = new BlockDiskKeyStore( this.blockDiskCacheAttributes,
this );

- if ( keyStore.size() == 0 )
+ boolean alright = verifyDisk();
+
+ if ( keyStore.size() == 0 || !alright )
{
this.reset();
}
@@ -113,7 +114,7 @@
alive = true;
if ( log.isInfoEnabled() )
{
- log.info( logCacheName + "Indexed Disk Cache is alive." );
+ log.info( logCacheName + "Block Disk Cache is alive." );
}
}
catch ( Exception e )
@@ -126,6 +127,43 @@
}

/**
+ * We need to verify that the file on disk uses the same block size and
that the file is the
+ * proper size.
+ * <p>
+ * @return true if it looks ok
+ */
+ protected boolean verifyDisk()
+ {
+ boolean alright = false;
+ // simply try to read a few. If it works, then the file is probably ok.
+ // TODO add more.
+ try
+ {
+ int maxToTest = 100;
+ int count = 0;
+ Set keySet = this.keyStore.entrySet();
+ Iterator it = keySet.iterator();
+ while ( it.hasNext() && count < maxToTest )
+ {
+ count++;
+ Map.Entry entry = (Map.Entry) it.next();
+ Object data = this.dataFile.read( (int[]) entry.getValue() );
+ if ( data == null )
+ {
+ throw new Exception( "Couldn't find data for key [" +
entry.getKey() + "]" );
+ }
+ }
+ alright = true;
+ }
+ catch ( Exception e )
+ {
+ log.warn( "Problem verifying disk. Message [" + e.getMessage() +
"]" );
+ alright = false;
+ }
+ return alright;
+ }
+
+ /**
* This requires a full iteration through the keys.
* <p>
* (non-Javadoc)
@@ -459,7 +497,6 @@
storageLock.writeLock().acquire();
try
{
-
// Prevents any interaction with the cache while we're shutting
down.
alive = false;

@@ -472,7 +509,7 @@
log.debug( logCacheName + "Closing files, base filename: "
+ fileName );
}
dataFile.close();
- dataFile = null;
+ // dataFile = null;

// TOD make a close
// keyFile.close();
@@ -527,8 +564,15 @@
File dataFileTemp = new File( this.rootDirectory, fileName +
".data" );
dataFileTemp.delete();

- dataFile = new BlockDisk( new File( this.rootDirectory, fileName +
".data" ) );
-
+ if ( this.blockDiskCacheAttributes.getBlockSizeBytes() > 0 )
+ {
+ this.dataFile = new BlockDisk( new File( rootDirectory,
fileName + ".data" ), this.blockDiskCacheAttributes.getBlockSizeBytes() );
+ }
+ else
+ {
+ this.dataFile = new BlockDisk( new File( rootDirectory,
fileName + ".data" ) );
+ }
+
this.keyStore.reset();
}
catch ( Exception e )

Modified:
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskCacheAttributes.java
URL:
http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskCacheAttributes.java?rev=437511&r1=437510&r2=437511&view=diff
==============================================================================
---
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskCacheAttributes.java
(original)
+++
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskCacheAttributes.java
Sun Aug 27 19:29:54 2006
@@ -19,6 +19,12 @@
/** -1 means no limit. */
private int maxKeySize = DEFAULT_MAX_KEY_SIZE;

+ private static final long DEFAULT_KEY_PERSISTENCE_INTERVAL_SECONDS = 5 *
60;
+
+ /** The keys will be persisted at this interval. -1 mean never. */
+ private long keyPersistenceIntervalSeconds =
DEFAULT_KEY_PERSISTENCE_INTERVAL_SECONDS;
+
+
/**
* The size of the blocks. All blocks are the same size.
* <p>
@@ -54,6 +60,22 @@
}

/**
+ * @param keyPersistenceIntervalSeconds The keyPersistenceIntervalSeconds
to set.
+ */
+ public void setKeyPersistenceIntervalSeconds( long
keyPersistenceIntervalSeconds )
+ {
+ this.keyPersistenceIntervalSeconds = keyPersistenceIntervalSeconds;
+ }
+
+ /**
+ * @return Returns the keyPersistenceIntervalSeconds.
+ */
+ public long getKeyPersistenceIntervalSeconds()
+ {
+ return keyPersistenceIntervalSeconds;
+ }
+
+ /**
* Write out the values for debugging purposes.
* <p>
* @return String
@@ -66,6 +88,7 @@
str.append( "\n MaxKeySize [" + this.getMaxKeySize() + "]" );
str.append( "\n MaxPurgatorySize [" + this.getMaxPurgatorySize() + "]"
);
str.append( "\n BlockSizeBytes [" + this.getBlockSizeBytes() + "]" );
+ str.append( "\n KeyPersistenceIntervalSeconds [" +
this.getKeyPersistenceIntervalSeconds() + "]" );
return str.toString();
}
}

Modified:
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskKeyStore.java
URL:
http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskKeyStore.java?rev=437511&r1=437510&r2=437511&view=diff
==============================================================================
---
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskKeyStore.java
(original)
+++
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/disk/block/BlockDiskKeyStore.java
Sun Aug 27 19:29:54 2006
@@ -28,6 +28,9 @@
import org.apache.jcs.auxiliary.disk.LRUMapJCS;
import org.apache.jcs.utils.timing.ElapsedTimer;

+import EDU.oswego.cs.dl.util.concurrent.ClockDaemon;
+import EDU.oswego.cs.dl.util.concurrent.ThreadFactory;
+
/**
* This is responsible for storing the keys.
* <p>
@@ -35,7 +38,7 @@
*/
public class BlockDiskKeyStore
{
- private static final Log log = LogFactory.getLog( BlockDiskCache.class );
+ private static final Log log = LogFactory.getLog( BlockDiskKeyStore.class
);

private BlockDiskCacheAttributes blockDiskCacheAttributes;

@@ -55,6 +58,11 @@
private File rootDirectory;

/**
+ * The background key persister, one for all regions.
+ */
+ private static ClockDaemon persistenceDaemon;
+
+ /**
* Set the configuration options.
* <p>
* @param cacheAttributes
@@ -95,6 +103,26 @@
{
initKeyMap();
}
+
+ // add this region to the persistence thread.
+ // TODO we might need to stagger this a bit.
+ if ( this.blockDiskCacheAttributes.getKeyPersistenceIntervalSeconds()
> 0 )
+ {
+ if ( persistenceDaemon == null )
+ {
+ persistenceDaemon = new ClockDaemon();
+ persistenceDaemon.setThreadFactory( new MyThreadFactory() );
+ }
+ persistenceDaemon
+ .executePeriodically(
this.blockDiskCacheAttributes.getKeyPersistenceIntervalSeconds() * 1000,
+ new Runnable()
+ {
+ public void run()
+ {
+ saveKeys();
+ }
+ }, false );
+ }
}

/**
@@ -369,6 +397,27 @@
log.debug( logCacheName + "Removing key: [" + key + "] from
key store." );
log.debug( logCacheName + "Key store size: [" + this.size() +
"]." );
}
+ }
+ }
+
+ /**
+ * Allows us to set the daemon status on the clockdaemon
+ * @author aaronsm
+ */
+ class MyThreadFactory
+ implements ThreadFactory
+ {
+
+ /*
+ * (non-Javadoc)
+ * @see
EDU.oswego.cs.dl.util.concurrent.ThreadFactory#newThread(java.lang.Runnable)
+ */
+ public Thread newThread( Runnable runner )
+ {
+ Thread t = new Thread( runner );
+ t.setDaemon( true );
+ t.setPriority( Thread.MIN_PRIORITY );
+ return t;
}
}
}

Modified: jakarta/jcs/trunk/src/test-conf/TestBlockDiskCacheHuge.ccf
URL:
http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/test-conf/TestBlockDiskCacheHuge.ccf?rev=437511&r1=437510&r2=437511&view=diff
==============================================================================
--- jakarta/jcs/trunk/src/test-conf/TestBlockDiskCacheHuge.ccf (original)
+++ jakarta/jcs/trunk/src/test-conf/TestBlockDiskCacheHuge.ccf Sun Aug 27
19:29:54 2006
@@ -20,9 +20,9 @@
# Block Disk Cache

jcs.auxiliary.blockDiskCache=org.apache.jcs.auxiliary.disk.block.BlockDiskCacheFactory

jcs.auxiliary.blockDiskCache.attributes=org.apache.jcs.auxiliary.disk.block.BlockDiskCacheAttributes
-jcs.auxiliary.blockDiskCache.attributes.DiskPath=target/test-sandbox/block-disk-cache-conc
+jcs.auxiliary.blockDiskCache.attributes.DiskPath=target/test-sandbox/block-disk-cache-huge
jcs.auxiliary.blockDiskCache.attributes.MaxPurgatorySize=300000
-jcs.auxiliary.blockDiskCache.attributes.MaxKeySize=500000
+jcs.auxiliary.blockDiskCache.attributes.MaxKeySize=1000000
jcs.auxiliary.blockDiskCache.attributes.blockSizeBytes=500
jcs.auxiliary.blockDiskCache.attributes.EventQueueType=SINGLE

#jcs.auxiliary.blockDiskCache.attributes.EventQueuePoolName=disk_cache_event_queue

Modified:
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/block/HugeQuantityBlockDiskCacheLoadTest.java
URL:
http://svn.apache.org/viewvc/jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/block/HugeQuantityBlockDiskCacheLoadTest.java?rev=437511&r1=437510&r2=437511&view=diff
==============================================================================
---
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/block/HugeQuantityBlockDiskCacheLoadTest.java
(original)
+++
jakarta/jcs/trunk/src/test/org/apache/jcs/auxiliary/disk/block/HugeQuantityBlockDiskCacheLoadTest.java
Sun Aug 27 19:29:54 2006
@@ -3,6 +3,8 @@
import junit.framework.TestCase;

import org.apache.jcs.JCS;
+import org.apache.jcs.utils.timing.ElapsedTimer;
+import org.apache.jcs.utils.timing.SleepUtil;

/**
* Put a few hundred thousand entries in the block disk cache.
@@ -38,15 +40,19 @@
int items = 300000;
String region = "testCache1";

- JCS jcs = JCS.getInstance( region );
+ System.out.println( "--------------------------" );
+ long initialMemory = measureMemoryUse();
+ System.out.println( "Before getting JCS: " + initialMemory );

+ JCS jcs = JCS.getInstance( region );
+ jcs.clear();
+
try
{
-
+ ElapsedTimer timer = new ElapsedTimer();
System.out.println( "Start: " + measureMemoryUse() );

// Add items to cache
-
for ( int i = 0; i <= items; i++ )
{
jcs.put( i + ":key", region + " data " + i );
@@ -61,24 +67,40 @@
System.out.println( jcs.getStats() );
System.out.println( "--------------------------" );
System.out.println( "After wait: " + measureMemoryUse() );
+
+ for ( int i = 0; i < 10; i++ )
+ {
+ SleepUtil.sleepAtLeast( 3000 );
+ System.out.println( "--------------------------" );
+ System.out.println( "After sleep. " +
timer.getElapsedTimeString() + " memory used = " + measureMemoryUse() );
+ System.out.println( jcs.getStats() );
+ }

// Test that all items are in cache
-
+ System.out.println( "--------------------------" );
+ System.out.println( "Retrieving all." );
for ( int i = 0; i <= items; i++ )
{
+ //System.out.print( "\033[s" );
String value = (String) jcs.get( i + ":key" );
-
- assertEquals( region + " data " + i, value );
+ if( i % 1000 == 0 )
+ {
+ //System.out.print( "\033[r" );
+ System.out.println( i + " ");
+ }
+ assertEquals( "Wrong value returned.", region + " data " + i,
value );
}
-
- System.out.println( "After get: " + measureMemoryUse() );
+ long aftetGet = measureMemoryUse();
+ System.out.println( "After get: " + aftetGet + " diff = " +
(aftetGet - initialMemory));
+
}
finally
{
// dump the stats to the report
System.out.println( jcs.getStats() );
System.out.println( "--------------------------" );
- System.out.println( "End: " + measureMemoryUse() );
+ long endMemory = measureMemoryUse();
+ System.out.println( "End: " + endMemory + " diff = " + (endMemory
- initialMemory) );
}
}


<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

Recently Viewed:
qnx.openqnx.dev...    gcc.libstdc++.c...    solaris.opensol...    information-ret...    misc.misterhous...    web.catalyst.ge...    apache.webservi...    redhat.release....    hardware.lirc/2...    kernel.autofs/2...    technology.sust...    linux.vdr/2003-...    editors.lyx.gen...    org.user-groups...    netbsd.devel.pk...    xdg.devel/2004-...    version-control...    jakarta.slide.d...    debian.packages...    creativecommons...    ports.ppc.embed...    bug-tracking.bu...   
Home | blog view | USPTO Patent Archive | advertise | OSDir is an inevitable website. super tiny logo

Free Magazines

Cisco News
Receive a free quarterly e-newsletter with exclusive articles on how Cisco IT uses its own products and solutions to enable the business.
subscribe

Systems Management News, the newspaper for IT systems administration and data center managers! Each issue of Systems Management News is chock-full of news and analysis to help you understand what's happening in your field.
subscribe

The Enterprise Newsweekly eWeek is the essential technology information source for builders of e-business.
subscribe

Oracle Magazine Oracle Magazine contains technology strategy articles, sample code, tips, Oracle and partner news, how to articles for developers and DBAs, and more. Oracle (NASDAQ: ORCL) is the world's largest enterprise software company.
subscribe

Total Telecom Total Telecom is "The Economist of the communications industry".
subscribe

Navigation