You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ra...@apache.org on 2007/01/25 14:58:03 UTC

svn commit: r499797 - /incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/kaha/impl/index/IndexManager.java

Author: rajdavies
Date: Thu Jan 25 05:58:02 2007
New Revision: 499797

URL: http://svn.apache.org/viewvc?view=rev&rev=499797
Log:
fix for http://issues.apache.org/activemq/browse/AMQ-1082

Modified:
    incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/kaha/impl/index/IndexManager.java

Modified: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/kaha/impl/index/IndexManager.java
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/kaha/impl/index/IndexManager.java?view=diff&rev=499797&r1=499796&r2=499797
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/kaha/impl/index/IndexManager.java (original)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/kaha/impl/index/IndexManager.java Thu Jan 25 05:58:02 2007
@@ -43,10 +43,12 @@
     private RandomAccessFile indexFile;
     private StoreIndexReader reader;
     private StoreIndexWriter writer;
-    private LinkedList freeList=new LinkedList();
+ 
     private DataManager redoLog;
     private String mode;
     private long length=0;
+    private IndexItem firstFree;
+    private IndexItem lastFree;
 
     public IndexManager(File directory,String name,String mode,DataManager redoLog) throws IOException{
         this.directory = directory;
@@ -57,7 +59,7 @@
     }
 
     public synchronized boolean isEmpty(){
-        return freeList.isEmpty()&&length==0;
+        return lastFree == null &&length==0;
     }
 
     public synchronized IndexItem getIndex(long offset) throws IOException{
@@ -70,10 +72,16 @@
     }
 
     public synchronized void freeIndex(IndexItem item) throws IOException{
-        //item.reset();
+        item.reset();
         item.setActive(false);
+        if (lastFree == null) {
+            firstFree=lastFree=item;
+        }
+        else {
+            lastFree.setNextItem(item.getOffset());
+        }
         writer.updateIndexes(item);
-        freeList.add(item);
+        
     }
 
     public synchronized void storeIndex(IndexItem index) throws IOException{
@@ -84,7 +92,7 @@
         try {
         writer.updateIndexes(index);
         }catch(Throwable e) {
-            log.error(name + " GORT ERROR! ",e);
+            log.error(name + " error updating indexes ",e);
         }
     }
 
@@ -92,7 +100,7 @@
         writer.redoStoreItem(redo);
     }
 
-    public synchronized IndexItem createNewIndex(){
+    public synchronized IndexItem createNewIndex() throws IOException{
         IndexItem result=getNextFreeIndex();
         if(result==null){
             // allocate one
@@ -118,7 +126,7 @@
 
         
     public synchronized boolean delete() throws IOException{
-        freeList.clear();
+        firstFree = lastFree = null;
         if(indexFile!=null){
             indexFile.close();
             indexFile=null;
@@ -126,12 +134,23 @@
         return file.delete();
     }
 
-    private synchronized IndexItem getNextFreeIndex(){
+    private synchronized IndexItem getNextFreeIndex() throws IOException{
         IndexItem result=null;
-        if(!freeList.isEmpty()){
-            result=(IndexItem) freeList.removeLast();
+        if (firstFree != null) {
+            if (firstFree.equals(lastFree)) {
+                result = firstFree;
+                firstFree=lastFree=null;
+                
+            }else {
+                result = firstFree;
+                firstFree = getIndex(firstFree.getNextItem());
+                if (firstFree==null) {
+                    lastFree=null;
+                }
+            }
             result.reset();
         }
+       
         return result;
     }
 
@@ -158,11 +177,19 @@
         reader=new StoreIndexReader(indexFile);
         writer=new StoreIndexWriter(indexFile,name,redoLog);
         long offset=0;
+        
         while((offset+IndexItem.INDEX_SIZE)<=indexFile.length()){
             IndexItem index=reader.readItem(offset);
             if(!index.isActive()){
                 index.reset();
-                freeList.add(index);
+                if (lastFree != null) {
+                    lastFree.setNextItem(index.getOffset());
+                    updateIndexes(lastFree);
+                    lastFree=index;
+                }else {
+                    lastFree=firstFree=index;
+                }
+                
             }
             offset+=IndexItem.INDEX_SIZE;
         }