1 package com.jofti.store; 2 3 import java.nio.ByteBuffer ; 4 import java.util.LinkedHashMap ; 5 import java.util.Map ; 6 import java.util.Properties ; 7 import java.util.Map.Entry; 8 9 import org.apache.commons.logging.Log; 10 import org.apache.commons.logging.LogFactory; 11 12 import com.jofti.btree.BTree; 13 import com.jofti.btree.IPage; 14 import com.jofti.btree.LeafNodeEntry; 15 import com.jofti.core.IStoreKey; 16 import com.jofti.exception.JoftiException; 17 18 public class LRUStoreManager extends AbstractStoreManager 19 { 20 21 private static Log log = LogFactory 22 .getLog(AbstractStoreManager.class); 23 24 protected Map lruMap = null; 25 26 private Object objectLock = new Object (); 27 28 public void init(Properties properties) throws JoftiException 29 { 30 31 if (log.isInfoEnabled()) { 32 log.info("Initialising LRU store manager"); 33 } 34 35 super.init(properties); 36 37 lruMap = new LinkedHashMap () { 38 protected final int limit = maxNodes; 39 40 45 protected boolean removeEldestEntry(Entry eldest) 46 { 47 if (size() > limit) { 49 StoreWrapper wrapper = (StoreWrapper) eldest.getValue(); 50 CachedPage page = (CachedPage) wrapper.page; 51 if (!page.hasReferences()) { 52 pageManager.releasePage(page.page); 53 } else { 54 log.debug("reference held - unable to release page " 55 + page.page); 56 } 57 return true; 58 } 59 60 return false; 61 } 62 }; 63 64 if (log.isInfoEnabled()) { 65 log.info("Initialised LRu store manager"); 66 } 67 } 68 69 public IStoreKey store(IStoreKey key, IPage page) throws JoftiException 70 { 71 72 StoreWrapper wrapper = null; 73 74 int limit = page.getBuffer().limit(); 76 FilePositionHolder[] array = allocatePositions(key.getFilePositions(), 77 limit); 78 key.setFilePositions(array); 79 80 ByteBuffer buf = pageManager.acquireBuffer(limit); 82 83 doStore(key, page.copyBuffer(buf)); 84 pageManager.releaseBuffer(buf); 86 87 wrapper = new StoreWrapper(key, page); 88 89 synchronized (objectLock) { 91 ((CachedPage) page).releaseReference(); 92 lruMap.put(key, wrapper); 93 } 94 95 return null; 96 } 97 98 protected IPage getNewPage(int size) 99 { 100 IPage temp = doGetNewPage(size); 101 102 CachedPage cPage = new CachedPage(temp); 104 cPage.entries = new LeafNodeEntry[BTree.getMaxNodeSize()]; 105 cPage.acquireReference(); 107 return cPage; 108 } 109 110 public void releasePage(IStoreKey key, IPage page) 111 { 112 synchronized (objectLock) { 113 ((CachedPage) page).releaseReference(); 114 } 115 } 116 117 public StoreWrapper retrieve(IStoreKey key) throws JoftiException 118 { 119 StoreWrapper obj = null; 120 synchronized (objectLock) { 121 obj = (StoreWrapper) lruMap.get(key); 122 if (obj != null) { 123 ((CachedPage) obj.page).acquireReference(); 124 return obj; 125 } 126 } 127 128 130 IPage page = doRetrieve(key); 131 133 CachedPage cPage = new CachedPage(page); 134 cPage.entries = new LeafNodeEntry[BTree.getMaxNodeSize()]; 135 cPage.acquireReference(); 136 137 obj = new StoreWrapper(key, cPage); 138 synchronized (objectLock) { 139 lruMap.put(key, obj); 140 } 141 return obj; 142 143 } 144 145 public void remove(IStoreKey key, IPage page) throws JoftiException 146 { 147 releasePage(key, page); 148 synchronized (objectLock) { 149 150 StoreWrapper wrapper = (StoreWrapper) lruMap.remove(key); 151 CachedPage cPage = (CachedPage) wrapper.page; 152 cPage.releaseReference(); 153 if (!cPage.hasReferences()) { 154 pageManager.releasePage(cPage.page); 155 } 156 } 157 doRemove(key); 158 159 } 160 161 public void removeAll() throws JoftiException 162 { 163 java.util.Iterator it = lruMap.entrySet().iterator(); 164 int size = lruMap.size(); 165 for (int i = 0; i < size; i++) { 166 Map.Entry entry = (Map.Entry ) it.next(); 167 StoreWrapper wrap = (StoreWrapper) entry.getValue(); 168 169 CachedPage old = (CachedPage) wrap.page; 170 old.releaseReference(); 171 if (!old.hasReferences()) { 172 pageManager.releasePage(old.page); 173 } 174 175 } 176 lruMap.clear(); 177 doRemoveAll(); 178 } 179 180 181 } 182 | Popular Tags |