1 package com.jofti.store; 2 3 import java.nio.ByteBuffer ; 4 5 import com.jofti.btree.BTree; 6 import com.jofti.btree.IPage; 7 import com.jofti.core.IStoreManager; 8 import com.jofti.exception.JoftiException; 9 10 import edu.emory.mathcs.backport.java.util.concurrent.LinkedBlockingQueue; 11 12 18 public class PageManager { 19 20 23 26 LinkedBlockingQueue bufQueue = null; 27 28 LinkedBlockingQueue largeBufQueue = null; 29 30 LinkedBlockingQueue pageQueue = null; 31 32 private int blockSize = 0; 33 34 private int maxPages = 100; 35 36 private int pageNumber = 10; 37 38 long waitingTime = 0; 39 40 private long newPages = 0; 41 42 long accesses = 0; 43 44 long newBuffers=0; 45 46 long bufferAccesses=0; 47 48 49 50 IStoreManager manager = null; 51 IEntrySerializer serializer =null; 52 53 public PageManager() { 54 super(); 55 } 56 57 public void init(int blockSize, int maxPages, int pageNumber, 58 IStoreManager manager, IEntrySerializer serializer) throws JoftiException 59 { 60 this.blockSize = blockSize; 62 this.maxPages = maxPages; 63 this.manager = manager; 64 this.serializer = serializer; 65 66 bufQueue = new LinkedBlockingQueue(maxPages); 68 largeBufQueue = new LinkedBlockingQueue(maxPages); 69 pageQueue = new LinkedBlockingQueue(maxPages); 70 71 for (int i = 0; i < pageNumber; i++) { 73 int[] arr = new int[BTree.getMaxNodeSize()]; 74 for (int j = 0; j < arr.length; j++) { 75 arr[j] = -1; 76 } 77 ByteBuffer buf = ByteBuffer.allocate(blockSize); 78 buf.flip(); 79 Page page = new Page(arr, buf, manager,serializer); 80 pageQueue.add(page); 81 } 82 83 for (int i = 0; i < pageNumber; i++) { 85 ByteBuffer buf = ByteBuffer.allocate(blockSize); 86 buf.flip(); 87 bufQueue.add(buf); 88 } 89 90 for (int i = 0; i < pageNumber; i++) { 92 ByteBuffer buf = ByteBuffer.allocate(blockSize * 2); 93 buf.flip(); 94 largeBufQueue.add(buf); 95 } 96 this.pageNumber = pageNumber; 97 98 } 99 100 101 public IPage acquirePage(int size) throws JoftiException 102 { 103 104 accesses++; 105 106 Page page = (Page) pageQueue.poll(); 107 108 if (page == null) { 110 111 ++newPages; 112 int[] arr = new int[BTree.getMaxNodeSize()]; 114 for (int j = 0; j < arr.length; j++) { 115 arr[j] = -1; 116 } 117 118 page = new Page(arr, acquireBuffer(size), manager,serializer); 119 120 } else { 121 if ((size > blockSize && page.buf.capacity() == blockSize) 122 || (size <= blockSize && page.buf.capacity() > blockSize)) { 123 bufQueue.offer(page.buf); 125 page.buf = acquireBuffer(size); 126 } 127 } 128 return page; 129 } 130 131 137 public void releasePage(IPage page) { 138 139 page.reset(); 140 141 142 if (!pageQueue.offer(page)){ 143 releaseBuffer(page.getBuffer()); 144 } 145 146 } 147 148 public ByteBuffer acquireBuffer(int size) { 149 ++bufferAccesses; 150 ByteBuffer buf = null; 151 if (size > blockSize) { 152 buf = (ByteBuffer ) largeBufQueue.poll(); 153 if (buf == null || size > buf.capacity()) { 154 ++newBuffers; 155 buf = ByteBuffer.allocate(size); 156 buf.flip(); 157 } 158 159 } else { 160 buf = (ByteBuffer ) bufQueue.poll(); 161 if (buf == null) { 162 ++newBuffers; 163 buf = ByteBuffer.allocate(blockSize); 164 buf.flip(); 165 } 166 } 167 return buf; 168 } 169 170 public void releaseBuffer(ByteBuffer buf) { 171 buf.clear(); 172 buf.flip(); 173 if (buf.capacity() <= blockSize) { 174 bufQueue.offer(buf); 175 } else { 176 largeBufQueue.offer(buf); 177 } 178 } 179 180 } | Popular Tags |