KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > jofti > store > HashedStoreManager


1 package com.jofti.store;
2
3 import java.nio.ByteBuffer JavaDoc;
4 import java.util.Properties JavaDoc;
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 JavaDoc[] locks = null;
25
26     long stores = 0;
27
28     public void init(Properties JavaDoc 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 JavaDoc[maxNodes];
39         for (int i = maxNodes - 1; i >= 0; i--) {
40             locks[i] = new Object JavaDoc();
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         // wrap the page
69
CachedPage cPage = new CachedPage(temp);
70         cPage.entries = new LeafNodeEntry[BTree.getMaxNodeSize()];
71         // add a usage reference here
72
cPage.acquireReference();
73         return cPage;
74     }
75
76     public IStoreKey store(IStoreKey key, IPage page) throws JoftiException
77     {
78         StoreWrapper wrapper = null;
79
80         // get the number of positions we need to store the data
81
int limit = page.getBuffer().limit();
82         FilePositionHolder[] array = allocatePositions(key.getFilePositions(),
83                 limit);
84         key.setFilePositions(array);
85
86         // make sure we are storing a copy here
87
ByteBuffer JavaDoc buf = pageManager.acquireBuffer(limit);
88
89         doStore(key, page.copyBuffer(buf));
90         // release the buffer we have just stored
91
pageManager.releaseBuffer(buf);
92
93         int i = (int) (key.getId() % maxNodes);
94
95         // add to cached pages
96
synchronized (locks[i]) {
97             // release our reference
98
((CachedPage) page).releaseReference();
99             // get the old ref
100
wrapper = nodes[i];
101             // if previous is null
102
if (wrapper == null) {
103                 StoreWrapper newWrapper = new StoreWrapper(key, page);
104                 nodes[i] = newWrapper;
105                 // we are replacing the entry here
106
} 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             // else the page should be attached to the wrapper anyway
120

121         }
122
123         // we do not care
124
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             // get the previous entry
146
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         // create a new cached node
155
CachedPage cPage = new CachedPage(page);
156         cPage.entries = new LeafNodeEntry[BTree.getMaxNodeSize()];
157         cPage.acquireReference();
158         wrapper = new StoreWrapper(key, cPage);
159
160         // otherwise replace the val
161

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