1 package com.daffodilwoods.daffodildb.server.datasystem.indexsystem; 2 3 import com.daffodilwoods.daffodildb.server.datasystem.btree.*; 4 import com.daffodilwoods.daffodildb.server.datasystem.interfaces.*; 5 import com.daffodilwoods.database.resource.DException; 6 import com.daffodilwoods.daffodildb.server.datasystem.persistentsystem. 7 ClusterCharacteristics; 8 import java.util.*; 9 import com.daffodilwoods.daffodildb.utils.byteconverter.CbCzufIboemfs; 10 import com.daffodilwoods.daffodildb.server.datasystem.persistentsystem.Cluster; 11 import com.daffodilwoods.daffodildb.utils.byteconverter.CUbcmfLfzIboemfs; 12 import com.daffodilwoods.daffodildb.utils.byteconverter.CbCUsffWbmvfIboemfs; 13 import com.daffodilwoods.daffodildb.server.datasystem.persistentsystem. 14 PersistentDatabase; 15 import com.daffodilwoods.daffodildb.server.datasystem.persistentsystem.*; 16 17 29 30 public class FileNodeManager implements _NodeManager { 31 32 35 36 private _ClusterProvider clusterProvider; 37 38 41 private IndexColumnInformation iinf; 42 43 46 private BTreeControlCluster btreeControl; 47 48 51 52 private int size; 53 54 57 private Map nodeMap; 58 59 62 private _Index btree; 63 64 67 private static int Node_Limit = 10; 68 private CbCUsffWbmvfIboemfs handler; 69 70 private boolean isTempDatabase; 71 72 80 81 public FileNodeManager(IndexColumnInformation iinf1, 82 _ClusterProvider clusterProvider0, int address, 83 CbCUsffWbmvfIboemfs handler0,boolean isDefault) throws DException { 84 iinf = iinf1; 85 clusterProvider = clusterProvider0; 86 double version = clusterProvider.getVersionHandler().getDbVersion(); 87 btreeControl = address == -1 ? new TempIndexBtreeControlCluster(address, clusterProvider) : 88 version > 3.2 && !isDefault ? (BTreeControlCluster)new IndexBtreeControlCluster(address, clusterProvider): 89 new DefaultBTreeControlCluster(address, clusterProvider); 90 91 size = btreeControl.getSize(); 92 nodeMap = new HashMap(); 93 handler = handler0; 94 isTempDatabase =( (PersistentDatabase)clusterProvider).getDatabaseName().equalsIgnoreCase(DatabaseConstants.TEMPDATABASE ) ; 95 } 96 97 108 109 119 120 public BTreeNode getRootNode(_DatabaseUser user) throws DException { 121 int rootClusterAddress = btreeControl.getRootClusterAddress(); 122 if (rootClusterAddress == 0) 123 return null; 124 ClusterCharacteristics cc = new ClusterCharacteristics(rootClusterAddress, true); 125 BTreeNode btreeNode = (BTreeNode) nodeMap.get(cc); 126 if (btreeNode != null) { 127 if (user != null) { 128 Cluster cls = ( (FixedFileNode) btreeNode.getNode()).cluster; 129 if (cls.readMode) 130 cls = clusterProvider.getCluster(user, cc); 131 user.addCluster(cls); 132 } 133 return btreeNode; 134 } 135 return getNode(user,cc); 136 148 } 149 150 156 157 public synchronized BTreeNode getNewNode(_DatabaseUser user) throws DException { 158 FixedBTreeCluster cluster = (FixedBTreeCluster) clusterProvider.getNewCluster(user); 159 cluster.setHeader(); 160 FixedFileNode fileNode = iinf.isVariableColumn() ? 161 new VariableFileNode(cluster, iinf, handler) : 162 new FixedFileNode(cluster, iinf, handler); 163 BTreeNode node = new BTreeNode(btree, fileNode); 164 updateNodeMapping(cluster.getClusterCharacteristics(), node); 165 return node; 166 } 167 168 175 public void updateSizeAndBTreeInfo(_DatabaseUser user, boolean increment, 176 BTreeNode rootNode) throws DException { 177 size += increment ? 1 : -1; 178 if (size == 0) 179 addInFreeList(user, rootNode); 180 btreeControl.updateBTreeInfo(user, rootNode, size); 181 } 182 183 187 public int getSize() { 188 return size; 189 } 190 191 202 203 public synchronized BTreeNode getNode(_DatabaseUser user, Object nodekey) throws 204 DException { 205 ClusterCharacteristics cc = (ClusterCharacteristics) nodekey; 206 BTreeNode btreeNode = (BTreeNode) nodeMap.get(cc); 207 if (btreeNode != null ) { 208 if( user != null){ 209 _Node node = btreeNode.getNode(); 210 Cluster cls = ( (FixedFileNode) node).cluster; 211 if (cls.readMode) 212 cls = clusterProvider.getCluster(user, cc); 213 user.addCluster(cls); 214 } 215 return btreeNode; 216 } 217 FixedBTreeCluster cluster = user == null ? 218 (FixedBTreeCluster) clusterProvider.getReadCluster(cc) 219 : (FixedBTreeCluster) clusterProvider.getCluster(user, cc); 220 FixedFileNode fileNode = iinf.isVariableColumn() ? 221 new VariableFileNode(cluster, iinf, handler) : 222 new FixedFileNode(cluster, iinf, handler); 223 btreeNode = new BTreeNode(btree, fileNode); 224 updateNodeMapping(cc, btreeNode); 225 return btreeNode; 226 } 227 228 232 public void setBTree(_Index btree0) { 233 btree = btree0; 234 } 235 236 240 241 public CbCzufIboemfs[] getByteHandlers() throws DException { 242 return iinf.getHandlers(); 243 } 244 245 249 250 public int[] getColumnTypes() throws DException { 251 return iinf.getTypeOfColumns(); 252 } 253 254 final void updateNodeMapping(ClusterCharacteristics clusterCharacteristics, 255 BTreeNode node) throws DException { 256 if (nodeMap.size() > Node_Limit) { 257 synchronized (this) { 258 if (nodeMap.size() > Node_Limit) { 259 ArrayList arr = new ArrayList(5); 260 Iterator iter = nodeMap.keySet().iterator(); 261 int cnt = 0; 262 while (iter.hasNext() && ++cnt < Node_Limit / 2) { 263 BTreeNode obj = (BTreeNode) nodeMap.get(iter.next()); 264 267 if(!obj.isNodeCanBeRemovedFromMap() ){ 268 cnt--; 269 continue; 270 } 271 arr.add( obj); 272 273 } 274 for (int i = 0; i < arr.size(); i++) { 275 BTreeNode kv = (BTreeNode) arr.get(i); 276 kv.setFlagForNodeRemovedFromMap(); 277 FixedFileNode fixedFileNode = (FixedFileNode) kv.getNode(); 278 Cluster cluster = fixedFileNode.cluster; 279 ClusterCharacteristics cc = cluster. 280 getClusterCharacteristics(); 281 kv.clearReferences(); 282 fixedFileNode.clearReferences(); 283 if(cluster.isDirty() ) 284 clusterProvider.updateWriteClusters(cluster ); 285 286 fixedFileNode.clearReferences(); 287 nodeMap.remove(cc); 288 } 289 arr.clear(); 290 Object isFirstTime = nodeMap.put(clusterCharacteristics, node); 291 if(isFirstTime != null) 292 new Exception (" Error in FileNodeManager class getNode or getNewNode method node already found in map from if consult to Kuldeep kumar " ).printStackTrace() ; 293 } else { 294 Object isFirstTime = nodeMap.put(clusterCharacteristics, node); 295 if(isFirstTime != null) 296 new Exception (" Error in FileNodeManager class getNode or getNewNode method node already found in map from else consult to Kuldeep kumar " ).printStackTrace() ; 297 } 298 } 299 } else { 300 Object isFirstTime = nodeMap.put(clusterCharacteristics, node); 301 if(isFirstTime != null) 302 new Exception (" Error in FileNodeManager class getNode or getNewNode method node already found in map from outer else consult to Kuldeep kumar " ).printStackTrace() ; 303 } 304 305 } 306 307 private void addInFreeList(_DatabaseUser user, BTreeNode rootNode) throws 308 DException { 309 if (rootNode.isLeaf()) 310 return; 311 ArrayList freeNodeList = new ArrayList(0); 312 BTreeNode childNode; 313 for (int i = 0; i < rootNode.getElementCount(); i++) { 314 childNode = rootNode.getElement(i, null).getChild(); 315 if (childNode != null) 316 addInFreeList(user,childNode, freeNodeList); 317 } 318 ClusterCharacteristics cc; 319 for (int i = freeNodeList.size() - 1; i >= 0; i--) { 320 if(isTempDatabase && user.getSize() >= 10) 321 user.writeToFileWithLock() ; 322 cc = (ClusterCharacteristics) freeNodeList.get(i); 323 nodeMap.remove(cc); 324 clusterProvider.addFreeCluster(user, cc.getStartAddress()); 325 } 326 FixedBTreeCluster cluster = ( (FixedFileNode) rootNode.getNode()).cluster; 327 cluster.setHeader(); 328 cluster.reInitializeActiveRecordCount(); 329 cluster.reInitializeActualRecordCount(); 330 ( (FixedFileNode) rootNode.getNode()).clearCache(); 331 BTreeElement element = new BTreeElement(); 332 element.setCurrentNode(rootNode); 333 ( (FixedFileNode) rootNode.getNode()).insertDummyElement(element); 334 335 336 } 337 338 private void addInFreeListCompletely(_DatabaseUser user, BTreeNode rootNode) throws 339 DException { 340 341 ArrayList freeNodeList = new ArrayList(0); 342 BTreeNode childNode; 343 for (int i = 0; i < rootNode.getElementCount(); i++) { 344 childNode = rootNode.getElement(i, null).getChild(); 345 if (childNode != null) 346 addInFreeList(user,childNode, freeNodeList); 347 } 348 freeNodeList.add( (ClusterCharacteristics) rootNode.getNode().getNodeKey()); 349 ClusterCharacteristics cc; 350 for (int i = freeNodeList.size() - 1; i >= 0; i--) { 351 cc = (ClusterCharacteristics) freeNodeList.get(i); 352 nodeMap.remove(cc); 353 clusterProvider.addFreeCluster(user, cc.getStartAddress()); 354 if(isTempDatabase && user.getSize() >= 10) 355 user.writeToFileWithLock() ; 356 } 357 btreeControl.releaseControlCluster(user); 358 359 } 360 361 private void addInFreeList(_DatabaseUser user,BTreeNode node, 362 ArrayList freeNodeList) throws DException { 363 if(isTempDatabase && user.getSize() >= 10) 364 user.writeToFileWithLock() ; 365 if (!node.isLeaf()) { 366 BTreeNode childNode; 367 if(node.isNodeRemovedFromMap() ) 368 node = getNode(user,node.getNodeKey() ); 369 for (int i = 0; i < node.getElementCount(); i++) { 370 childNode = node.getElement(i, null).getChild(); 371 if (childNode != null) 372 addInFreeList(user,childNode, freeNodeList); 373 } 374 } 375 freeNodeList.add( (ClusterCharacteristics) node.getNode().getNodeKey()); 376 } 377 378 public int getTotalSizeOfNodeMapAndWeakNodeMap() { 379 return nodeMap.size(); 380 } 381 382 public Map getNodeMap() { 383 return nodeMap; 384 } 385 386 public PersistentDatabase getUnderlyingDatabase() { 387 return (PersistentDatabase) clusterProvider; 388 } 389 390 public CUbcmfLfzIboemfs getTableKeyHandler() { 391 return (CUbcmfLfzIboemfs) handler; 392 } 393 394 public void releaseResource(_DatabaseUser user, boolean releaseCompletely) throws 395 DException { 396 BTreeNode rootNode = getRootNode(user); 397 398 if (rootNode != null) { 399 if (releaseCompletely) 400 addInFreeListCompletely(user, rootNode); 401 else 402 addInFreeList(user, rootNode); 403 } 404 } 405 406 public void setSize(int size0){ 407 size = size0; 408 } 409 410 } 411 | Popular Tags |