1 package com.jofti.store; 2 3 import java.nio.ByteBuffer ; 4 import java.util.Properties ; 5 6 import org.apache.commons.logging.Log; 7 import org.apache.commons.logging.LogFactory; 8 9 import com.jofti.btree.BTree; 10 import com.jofti.btree.IPage; 11 import com.jofti.btree.LeafNodeEntry; 12 import com.jofti.core.IStoreKey; 13 import com.jofti.exception.JoftiException; 14 import com.jofti.util.PrimeFinder; 15 16 public class HashedStoreManager extends AbstractStoreManager 17 { 18 19 private static Log log = LogFactory 20 .getLog(AbstractStoreManager.class); 21 22 protected StoreWrapper[] nodes = null; 23 24 protected Object [] locks = null; 25 26 long stores = 0; 27 28 public void init(Properties properties) throws JoftiException 29 { 30 if (log.isInfoEnabled()) { 31 log.info("Initialising Hashed store manager"); 32 } 33 super.init(properties); 34 maxNodes = PrimeFinder.nextPrime(maxNodes); 35 36 37 nodes = new StoreWrapper[maxNodes]; 38 locks = new Object [maxNodes]; 39 for (int i = maxNodes - 1; i >= 0; i--) { 40 locks[i] = new Object (); 41 } 42 if (log.isInfoEnabled()) { 43 log.info("adjusted maxNodes to " + maxNodes); 44 log.info("Initialised Hashed store manager"); 45 } 46 } 47 48 public void removeAll() throws JoftiException 49 { 50 for (int i = 0; i < nodes.length; i++) { 51 StoreWrapper wrap = nodes[i]; 52 if (wrap != null) { 53 CachedPage old = (CachedPage) wrap.page; 54 old.releaseReference(); 55 if (!old.hasReferences()) { 56 pageManager.releasePage(old.page); 57 } 58 nodes[i] = null; 59 } 60 } 61 doRemoveAll(); 62 } 63 64 protected IPage getNewPage(int size) 65 { 66 IPage temp = doGetNewPage(size); 67 68 CachedPage cPage = new CachedPage(temp); 70 cPage.entries = new LeafNodeEntry[BTree.getMaxNodeSize()]; 71 cPage.acquireReference(); 73 return cPage; 74 } 75 76 public IStoreKey store(IStoreKey key, IPage page) throws JoftiException 77 { 78 StoreWrapper wrapper = null; 79 80 int limit = page.getBuffer().limit(); 82 FilePositionHolder[] array = allocatePositions(key.getFilePositions(), 83 limit); 84 key.setFilePositions(array); 85 86 ByteBuffer buf = pageManager.acquireBuffer(limit); 88 89 doStore(key, page.copyBuffer(buf)); 90 pageManager.releaseBuffer(buf); 92 93 int i = (int) (key.getId() % maxNodes); 94 95 synchronized (locks[i]) { 97 ((CachedPage) page).releaseReference(); 99 wrapper = nodes[i]; 101 if (wrapper == null) { 103 StoreWrapper newWrapper = new StoreWrapper(key, page); 104 nodes[i] = newWrapper; 105 } else if (!wrapper.key.equals(key)) { 107 108 CachedPage old = (CachedPage) wrapper.page; 109 if (!old.hasReferences()) { 110 pageManager.releasePage(old.page); 111 } else { 112 if (log.isDebugEnabled()) { 113 log.debug("unable to release ref on write " + old); 114 } 115 } 116 StoreWrapper newWrapper = new StoreWrapper(key, page); 117 nodes[i] = newWrapper; 118 } 119 121 } 122 123 return null; 125 } 126 127 public void releasePage(IStoreKey key, IPage page) 128 { 129 130 int i = (int) (key.getId() % maxNodes); 131 132 synchronized (locks[i]) { 133 ((CachedPage) page).releaseReference(); 134 } 135 } 136 137 public StoreWrapper retrieve(IStoreKey key) throws JoftiException 138 { 139 140 StoreWrapper wrapper = null; 141 142 int i = (int) (key.getId() % maxNodes); 143 144 synchronized (locks[i]) { 145 wrapper = nodes[i]; 147 if (wrapper != null && wrapper.key.equals(key)) { 148 ((CachedPage) wrapper.page).acquireReference(); 149 return wrapper; 150 } 151 } 152 153 IPage page = doRetrieve(key); 154 CachedPage cPage = new CachedPage(page); 156 cPage.entries = new LeafNodeEntry[BTree.getMaxNodeSize()]; 157 cPage.acquireReference(); 158 wrapper = new StoreWrapper(key, cPage); 159 160 162 synchronized (locks[i]) { 163 StoreWrapper old = nodes[i]; 164 165 if (old != null && !old.key.equals(key)) { 166 CachedPage oldPage = (CachedPage) old.page; 167 if (!oldPage.hasReferences()) { 168 pageManager.releasePage(oldPage.page); 169 } else { 170 if (log.isDebugEnabled()) { 171 log.debug("unable to release due to ref " 172 + oldPage.page); 173 } 174 } 175 } 176 177 nodes[i] = wrapper; 178 } 179 return wrapper; 180 181 } 182 183 public void remove(IStoreKey key, IPage page) throws JoftiException 184 { 185 releasePage(key, page); 186 int i = (int) (key.getId() % maxNodes); 187 188 StoreWrapper wrapper = null; 189 190 synchronized (locks[i]) { 191 192 wrapper = nodes[i]; 193 if (wrapper != null && wrapper.key.equals(key)) { 194 CachedPage oldPage = (CachedPage) wrapper.page; 195 oldPage.releaseReference(); 196 if (!oldPage.hasReferences()) { 197 pageManager.releasePage(oldPage.page); 198 } else { 199 if (log.isDebugEnabled()) { 200 log.debug("unable to release due to ref " 201 + oldPage.page); 202 } 203 } 204 205 nodes[i] = null; 206 207 } 208 209 } 210 doRemove(key); 211 212 } 213 214 } 215 | Popular Tags |