asmuts 2004/07/22 06:17:51
Modified: src/java/org/apache/jcs/auxiliary/disk/indexed
IndexedDiskCache.java IndexedDisk.java
Log:
Realtime defragmentation is fully functional now.
Along with recylcing the usused spots on disk, the disk cache is much more efficient
in its disk consumption.
Revision Changes Path
1.15 +116 -20
jakarta-turbine-jcs/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCache.java
Index: IndexedDiskCache.java
===================================================================
RCS file:
/home/cvs/jakarta-turbine-jcs/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDiskCache.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- IndexedDiskCache.java 16 Jul 2004 01:26:34 -0000 1.14
+++ IndexedDiskCache.java 22 Jul 2004 13:17:49 -0000 1.15
@@ -131,6 +131,15 @@
if (keyHash.size() == 0)
{
dataFile.reset();
+ } else {
+ boolean isOk = checkKeyDataConsistency();
+ if (!isOk)
+ {
+ keyHash.clear();
+ keyFile.reset();
+ dataFile.reset();
+ log.warn( "Corruption detected. Reset data and keys files.");
+ }
}
}
@@ -196,6 +205,7 @@
{
log.info("Reset maxKeySize to: '" + maxKeySize + "'");
}
+
}
if (log.isDebugEnabled())
@@ -224,6 +234,68 @@
}
}
+
+ /**
+ * Check the consitency between the keys and the datafile. Makes sure
+ * no staring positions in the keys exceed the file length.
+ *
+ * @return True if the test passes
+ */
+ private boolean checkKeyDataConsistency() {
+
+ log.info( "Performing inital consistency check" );
+
+ boolean isOk = true;
+ long len = 0;
+ try {
+ len = dataFile.length();
+ }catch (Exception e ) {
+ log.error(e);
+ }
+
+ Iterator itr = keyHash.entrySet().iterator();
+ while (itr.hasNext())
+ {
+ Map.Entry e = (Map.Entry) itr.next();
+ IndexedDiskElementDescriptor de = (IndexedDiskElementDescriptor) e.
+ getValue();
+ long pos = de.pos;
+
+ if (pos > len)
+ {
+ isOk = false;
+ }
+
+ if ( !isOk )
+ {
+ log.warn( "\n The dataFile is corrupted!" +
+ "\n raf.length() = " + len +
+ "\n pos = " + pos );
+ return isOk;
+ //reset();
+ //throw new IOException( "The Data File Is Corrupt, need to reset" );
+ // return null;
+ }
+
+/*
+ else
+ {
+ raf.seek(pos);
+ int datalen = raf.readInt();
+ if (datalen > raf.length())
+ {
+ isOk = false;
+ break;
+ }
+ }
+ */
+ }
+
+ log.info( "Finished inital consistency check, isOk = " + isOk );
+
+ return isOk;
+ }
+
/**
* Saves key file to disk. This converts the LRUMap to a HashMap for
deserialzation.
*/
@@ -392,27 +464,33 @@
{
//storageLock.readLock();
storageLock.readLock().acquire();
+ try {
+ if (!alive)
+ {
+ log.debug("No longer alive so returning null, cacheName: " +
+ cacheName + ", key = " + key);
- if (!alive)
- {
- log.debug("No longer alive so returning null, cacheName: " +
- cacheName + ", key = " + key);
+ return null;
+ }
- return null;
+ object = readElement(key);
+ }
+ finally
+ {
+ //storageLock.done();
+ storageLock.readLock().release();
}
-
- object = readElement(key);
-
}
- catch (Exception e)
+ catch (IOException ioe)
{
log.error("Failure getting from disk, cacheName: " + cacheName +
- ", key = " + key, e);
+ ", key = " + key, ioe);
+ reset();
}
- finally
+ catch (Exception e)
{
- //storageLock.done();
- storageLock.readLock().release();
+ log.error("Failure getting from disk, cacheName: " + cacheName +
+ ", key = " + key, e);
}
return object;
@@ -501,11 +579,12 @@
}
}
+ boolean reset = false;
boolean removed = false;
try
{
//storageLock.writeLock();
- storageLock.writeLock().release();
+ storageLock.writeLock().acquire();
if (key instanceof String
&& key.toString().endsWith(CacheConstants.NAME_COMPONENT_DELIMITER))
@@ -608,7 +687,7 @@
catch (Exception e)
{
log.error(e);
- reset();
+ reset = true;
}
finally
{
@@ -616,6 +695,11 @@
storageLock.writeLock().release();
}
+ if ( reset ) {
+ reset();
+ }
+
+
return false;
}
@@ -645,7 +729,9 @@
*/
private void reset()
{
- log.debug("Reseting cache");
+ if ( log.isInfoEnabled() ) {
+ log.info("Reseting cache");
+ }
try
{
@@ -850,7 +936,7 @@
new IndexedDisk(new File(rafDir, fileName + "Temp.data"));
//dataFileTemp.reset();
- // set flag to true
+ // make sure flag is set to true
isOptomizing = true;
int len = keys.length;
@@ -1005,7 +1091,7 @@
{
log.error("Failed to get orinigal off disk cache: " + fileName
+ ", key: " + key + "; keyHash.tag = " + keyHash.tag);
- reset();
+ //reset();
throw e;
}
@@ -1078,10 +1164,20 @@
newData.length());
}
- newData.renameTo(newFileName);
+ boolean success = newData.renameTo(newFileName);
+ if (log.isInfoEnabled())
+ {
+ log.info( " rename success = " + success );
+ }
}
dataFile =
new IndexedDisk(newFileName);
+
+ if (log.isInfoEnabled())
+ {
+ log.info("1 dataFile.length() " + dataFile.length());
+ }
+
keyHash = keyHashTemp;
keyFile.reset();
1.8 +6 -0
jakarta-turbine-jcs/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDisk.java
Index: IndexedDisk.java
===================================================================
RCS file:
/home/cvs/jakarta-turbine-jcs/src/java/org/apache/jcs/auxiliary/disk/indexed/IndexedDisk.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- IndexedDisk.java 16 Jul 2004 01:26:34 -0000 1.7
+++ IndexedDisk.java 22 Jul 2004 13:17:49 -0000 1.8
@@ -70,6 +70,7 @@
*/
Serializable readObject( long pos ) throws IOException
{
+ String message = null;
byte[] data = null;
boolean corrupted = false;
try
@@ -78,6 +79,7 @@
{
if ( pos > raf.length() ) {
corrupted = true;
+ message = "Postion is greater than raf length";
}
else
{
@@ -86,6 +88,7 @@
if (datalen > raf.length())
{
corrupted = true;
+ message = "Postion(" + pos + ") + datalen (" + datalen + ") is
greater than raf length";
}
else
{
@@ -96,6 +99,7 @@
if ( corrupted )
{
log.warn( "\n The dataFile is corrupted!" +
+ "\n " + message +
"\n raf.length() = " + raf.length() +
"\n pos = " + pos );
//reset();
@@ -271,6 +275,8 @@
synchronized void reset()
throws IOException
{
+
+ log.warn( "Resetting data file" );
raf.close();
File f = new File( filepath );
int i = 0;
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]