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]

Reply via email to