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 2008/02/28 17:42:37 UTC
svn commit: r632050 -
/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/kaha/impl/index/hash/HashIndex.java
Author: rajdavies
Date: Thu Feb 28 08:42:30 2008
New Revision: 632050
URL: http://svn.apache.org/viewvc?rev=632050&view=rev
Log:
changed free list implementation
Modified:
activemq/trunk/activemq-core/src/main/java/org/apache/activemq/kaha/impl/index/hash/HashIndex.java
Modified: activemq/trunk/activemq-core/src/main/java/org/apache/activemq/kaha/impl/index/hash/HashIndex.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/kaha/impl/index/hash/HashIndex.java?rev=632050&r1=632049&r2=632050&view=diff
==============================================================================
--- activemq/trunk/activemq-core/src/main/java/org/apache/activemq/kaha/impl/index/hash/HashIndex.java (original)
+++ activemq/trunk/activemq-core/src/main/java/org/apache/activemq/kaha/impl/index/hash/HashIndex.java Thu Feb 28 08:42:30 2008
@@ -19,6 +19,7 @@
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
+import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.activemq.kaha.Marshaller;
import org.apache.activemq.kaha.StoreEntry;
@@ -57,8 +58,7 @@
private HashBin[] bins;
private Marshaller keyMarshaller;
private long length;
- private HashPage firstFree;
- private HashPage lastFree;
+ private LinkedList<HashPage> freeList = new LinkedList<HashPage>();
private AtomicBoolean loaded = new AtomicBoolean();
private LRUCache<Long, HashPage> pageCache;
private boolean enablePageCaching=true;
@@ -207,23 +207,14 @@
page.setId(offset);
page.readHeader(dataIn);
if (!page.isActive()) {
- if (lastFree != null) {
- lastFree.setNextFreePageId(offset);
- indexFile.seek(lastFree.getId());
- dataOut.reset();
- lastFree.writeHeader(dataOut);
- indexFile.write(dataOut.getData(), 0, HashPage.PAGE_HEADER_SIZE);
- lastFree = page;
- } else {
- lastFree = page;
- firstFree = page;
- }
+ freeList.add(page);
} else {
addToBin(page);
size+=page.size();
}
offset += pageSize;
}
+ System.err.println("AFTER LOAD SIZE = " + size);
length = offset;
} catch (IOException e) {
LOG.error("Failed to load index ", e);
@@ -237,8 +228,7 @@
if (indexFile != null) {
indexFile.close();
indexFile = null;
- firstFree = null;
- lastFree = null;
+ freeList.clear();
bins = new HashBin[bins.length];
}
}
@@ -249,7 +239,7 @@
HashEntry entry = new HashEntry();
entry.setKey((Comparable)key);
entry.setIndexOffset(value.getOffset());
- if (getBin(key).put(entry)) {
+ if (!getBin(key).put(entry)) {
size++;
}
}
@@ -313,7 +303,7 @@
HashPage createPage(int binId) throws IOException {
HashPage result = getNextFreePage();
- if (result == null) {
+ if (result == null) {
// allocate one
result = new HashPage(keysPerPage);
result.setId(length);
@@ -322,6 +312,7 @@
length += pageSize;
indexFile.seek(length);
indexFile.write(HashEntry.NOT_SET);
+ System.err.println("ALLOCATED NEW PAGE size = " + size);
}
addToCache(result);
return result;
@@ -331,33 +322,16 @@
removeFromCache(page);
page.reset();
page.setActive(false);
- if (lastFree == null) {
- firstFree = page;
- lastFree = page;
- } else {
- lastFree.setNextFreePageId(page.getId());
- writePageHeader(lastFree);
- }
writePageHeader(page);
+ freeList.add(page);
}
private HashPage getNextFreePage() throws IOException {
HashPage result = null;
- if (firstFree != null) {
- if (firstFree.equals(lastFree)) {
- result = firstFree;
- firstFree = null;
- lastFree = null;
- } else {
- result = firstFree;
- firstFree = getPageHeader(firstFree.getNextFreePageId());
- if (firstFree == null) {
- lastFree = null;
- }
- }
+ if(!freeList.isEmpty()) {
+ result = freeList.removeFirst();
result.setActive(true);
result.reset();
- writePageHeader(result);
}
return result;
}