1 package com.daffodilwoods.daffodildb.server.sessionsystem; 2 3 import java.util.HashMap ; 4 import java.util.ArrayList ; 5 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator._Iterator; 6 import com.daffodilwoods.database.resource.DException; 7 import com.daffodilwoods.daffodildb.server.datasystem.utility._Record; 8 import com.daffodilwoods.database.general.SystemFields; 9 import java.util.*; 10 import com.daffodilwoods.daffodildb.server.serversystem._ServerSession; 11 12 public class DeadLockDetector { 13 14 private HashMap waitingIdsMap; 15 16 17 public DeadLockDetector() { 18 waitingIdsMap = new HashMap (); 19 20 } 21 22 public synchronized void addIntoWaitingMap(Object sessionId0,_Iterator iterator0){ 23 waitingIdsMap.put(sessionId0 ,iterator0) ; 24 } 25 26 public synchronized void removeFromWaitingMap(Object sessionId0){ 27 waitingIdsMap.remove(sessionId0) ; 28 } 29 30 31 public synchronized void checkDeadLock(_ServerSession serverSession,Object sessionId0) throws DException{ 32 ArrayList idsList = new ArrayList (); 33 idsList.add(sessionId0); 34 _Iterator iterator = (_Iterator) waitingIdsMap.get(sessionId0) ; 35 try { 36 checkForWaitingIds(iterator, idsList); 37 } 38 catch (DException ex) { 39 if(ex.getDseCode().equalsIgnoreCase("DSE2050") ){ 40 ; serverSession.rollback() ; 42 throw ex; 43 } 44 45 } 46 } 47 48 private void checkForWaitingIds(_Iterator iterator,ArrayList idsList) throws DException{ 49 if(iterator.first() ) 50 do{ 51 try { 52 _Record record = iterator.getRecord(); 53 Object invalidSessionId = record.getObject(SystemFields. 54 invalidSessionId); 55 Object sessionId = invalidSessionId.equals(SystemFields.maxIntegerValue) ? 56 record.getObject(SystemFields.sessionId) : invalidSessionId; 57 if (idsList.contains(sessionId)) { 58 ; throw new DException("DSE2050", null); 60 } 61 idsList.add(sessionId); 62 detectDeadLock(sessionId, idsList); 63 idsList.remove(idsList.size() - 1); 64 } 65 catch (DException ex) { 66 if(ex.getDseCode().equalsIgnoreCase("DSE2050") ) 67 throw ex; 68 } 69 }while(iterator.next() ); 70 } 71 72 private void detectDeadLock(Object sessionId0,ArrayList idsList ) throws DException{ 73 Object iterator = waitingIdsMap.get(sessionId0) ; 74 if(iterator != null ) 75 checkForWaitingIds( (_Iterator) iterator, idsList ); 76 } 77 } 78 | Popular Tags |