debugging LockManager

git-svn-id: https://asterixdb.googlecode.com/svn/branches/asterix_recovery@652 eaa15691-b419-025a-1212-ee371bd00084
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/DeadlockDetector.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/DeadlockDetector.java
index 89226a9..fcf5c3c 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/DeadlockDetector.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/DeadlockDetector.java
@@ -54,6 +54,7 @@
         PrimitiveIntHashMap tempHolderList;
 
         holderList.clear(true);
+        visitedHolderList.clear(true);
 
         //holderlist contains jobId
         //resourceList contains entityInfo's slot numbers instead of resourceId in order to avoid object creation 
@@ -74,6 +75,7 @@
             nextHolderList.clear(true);
 
             while (holder != -1) {
+                resourceList.clear(true);
                 getWaitingResourceList(holder, resourceList);
                 resourceList.beginIterate();
                 resource = resourceList.getNextKey();
@@ -106,7 +108,7 @@
             //set holderList to nextHolderList and nextHolderList to holderList
             tempHolderList = holderList;
             holderList = nextHolderList;
-            nextHolderList = holderList;
+            nextHolderList = tempHolderList;
             holderList.beginIterate();
             holder = holderList.getNextKey();
         }
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/EntityInfoManager.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/EntityInfoManager.java
index 0ed69a6..b8820c4 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/EntityInfoManager.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/EntityInfoManager.java
@@ -537,6 +537,9 @@
         int currentSlot = freeSlotNum;
         freeSlotNum = getNextFreeSlot(currentSlot);
         occupiedSlots++;
+        if (LockManager.IS_DEBUG_MODE) {
+            System.out.println(Thread.currentThread().getName()+" entity allocate: "+currentSlot);
+        }
         return currentSlot;
     }
 
@@ -544,6 +547,9 @@
         setNextFreeSlot(slotNum, freeSlotNum);
         freeSlotNum = slotNum;
         occupiedSlots--;
+        if (LockManager.IS_DEBUG_MODE) {
+            System.out.println(Thread.currentThread().getName()+" entity deallocate: "+slotNum);
+        }
     }
 
     public void deinitialize() {
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/EntityLockInfoManager.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/EntityLockInfoManager.java
index a54cfdd..7ccf318 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/EntityLockInfoManager.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/EntityLockInfoManager.java
@@ -706,9 +706,9 @@
         setFirstWaiter(currentSlot, -1);
         setUpgrader(currentSlot, -1);
         occupiedSlots++;
-        //        if (LockManager.IS_DEBUG_MODE) {
-        //            System.out.println("Allocated ELockInfo[" + currentSlot + "], freeSlotNum[" + freeSlotNum+"]");
-        //        }
+                if (LockManager.IS_DEBUG_MODE) {
+                    System.out.println(Thread.currentThread().getName() + " Allocated ELockInfo[" + currentSlot + "]");
+                }
         return currentSlot;
     }
 
@@ -716,9 +716,9 @@
         setNextFreeSlot(slotNum, freeSlotNum);
         freeSlotNum = slotNum;
         occupiedSlots--;
-        //        if (LockManager.IS_DEBUG_MODE) {
-        //            System.out.println("Deallocated ELockInfo[" + slotNum + "], freeSlotNum[" + freeSlotNum+"]");
-        //        }
+                if (LockManager.IS_DEBUG_MODE) {
+                    System.out.println(Thread.currentThread().getName() + " Deallocated ELockInfo[" + slotNum + "]");
+                }
     }
 
     public void deinitialize() {
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ExpectedResultFile b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ExpectedResultFile
index 769271d..787b09d 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ExpectedResultFile
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/ExpectedResultFile
@@ -1,4 +1 @@
-2 3 -1
-1 4 -1
-1 4 -1
-1 4 5 -1
\ No newline at end of file
+2 -1
\ No newline at end of file
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockManager.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockManager.java
index 4f4c630..b691601 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockManager.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockManager.java
@@ -561,6 +561,7 @@
         int datasetLockCount;
         int entityLockCount;
         byte lockMode;
+        boolean existWaiter = false;
 
         JobId jobId = txnContext.getJobId();
 
@@ -584,8 +585,9 @@
         int waiterObjId = jobInfo.getFirstWaitingResource();
         int nextWaiterObjId;
         while (waiterObjId != -1) {
+            existWaiter = true;
             waiterObj = lockWaiterManager.getLockWaiter(waiterObjId);
-            nextWaiterObjId = waiterObj.getNextWaiterObjId();
+            nextWaiterObjId = waiterObj.getNextWaitingResourceObjId();
             entityInfo = waiterObj.getEntityInfoSlot();
             if (IS_DEBUG_MODE) {
                 if (jobId.getId() != entityInfoManager.getJobId(entityInfo)) {
@@ -593,6 +595,28 @@
                             + entityInfoManager.getJobId(entityInfo) + "'s lock request!!!");
                 }
             }
+            
+            //0. remove from waiter(or upgrader)'s list of dLockInfo or eLockInfo.
+            did = entityInfoManager.getDatasetId(entityInfo);
+            tempDatasetIdObj.setId(did);
+            dLockInfo = datasetResourceHT.get(tempDatasetIdObj);
+            
+            if (waiterObj.isWaitingOnEntityLock()) {
+                entityHashValue = entityInfoManager.getPKHashVal(entityInfo);
+                eLockInfo = dLockInfo.getEntityResourceHT().get(entityHashValue);
+                if (waiterObj.isWaiter()) {
+                    entityLockInfoManager.removeWaiter(eLockInfo, waiterObjId);
+                } else {
+                    entityLockInfoManager.removeUpgrader(eLockInfo, waiterObjId);
+                }
+            } else {
+                if (waiterObj.isWaiter()) {
+                    dLockInfo.removeWaiter(waiterObjId);
+                } else {
+                    dLockInfo.removeUpgrader(waiterObjId);
+                }
+            }
+            
             //1. deallocate waiterObj
             lockWaiterManager.deallocate(waiterObjId);
 
@@ -692,6 +716,11 @@
 
         //remove JobInfo
         jobHT.remove(jobId);
+        
+        if (existWaiter) {
+            txnContext.setStatus(TransactionContext.TIMED_OUT_STATUS);
+            txnContext.setTxnState(TransactionState.ABORTED);
+        }
 
         if (IS_DEBUG_MODE) {
             trackLockRequest("Granted", RequestType.RELEASE_LOCKS, new DatasetId(0), 0, (byte) 0, txnContext,
@@ -877,19 +906,29 @@
         }
 
         lockRequestTracker.addEvent(s.toString(), request);
+        if (msg.equals("Requested")) {
+            lockRequestTracker.addRequest(request);
+        }
         System.out.println(request.prettyPrint() + "--> " + s.toString());
     }
 
-    public String getGlobalRequestHistory() {
+    public String getHistoryForAllJobs() {
         if (IS_DEBUG_MODE) {
-            return lockRequestTracker.getGlobalRequestHistory();
+            return lockRequestTracker.getHistoryForAllJobs();
         }
         return null;
     }
 
-    public String getLocalRequestHistory() {
+    public String getHistoryPerJob() {
         if (IS_DEBUG_MODE) {
-            return lockRequestTracker.getLocalRequestHistory();
+            return lockRequestTracker.getHistoryPerJob();
+        }
+        return null;
+    }
+    
+    public String getRequestHistoryForAllJobs() {
+        if (IS_DEBUG_MODE) {
+            return lockRequestTracker.getRequestHistoryForAllJobs();
         }
         return null;
     }
@@ -1075,7 +1114,6 @@
         int entityInfo;
         DatasetLockInfo dLockInfo;
         boolean isUpgrade = false;
-        int waiterCount = 0;
         int weakerModeLockCount;
 
         dLockInfo = datasetResourceHT.get(datasetId);
@@ -1126,8 +1164,8 @@
                     return false;
                 }
 
-                entityInfoManager.increaseEntityLockCount(entityInfo, waiterCount);
-                entityLockInfoManager.increaseLockCount(eLockInfo, lockMode, (short) waiterCount);
+                entityInfoManager.increaseEntityLockCount(entityInfo);
+                entityLockInfoManager.increaseLockCount(eLockInfo, lockMode);
                 entityLockInfoManager.addHolder(eLockInfo, entityInfo);
             }
         } else {//eLockInfo doesn't exist, so this lock request is the first request and can be granted without waiting.
@@ -1188,15 +1226,21 @@
             if (duplicatedWaiterObjId == -1) {
                 //add actor properly
                 if (isDatasetLockInfo) {
+                    waiter.setWaitingOnEntityLock(false);
                     if (isUpgrade) {
                         dLockInfo.addUpgrader(waiterId);
+                        waiter.setWaiter(false);
                     } else {
                         dLockInfo.addWaiter(waiterId);
+                        waiter.setWaiter(true);
                     }
                 } else {
+                    waiter.setWaitingOnEntityLock(true);
                     if (isUpgrade) {
+                        waiter.setWaiter(false);
                         entityLockInfoManager.addUpgrader(eLockInfo, waiterId);
                     } else {
+                        waiter.setWaiter(true);
                         entityLockInfoManager.addWaiter(eLockInfo, waiterId);
                     }
                 }
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockManagerDeterministicUnitTest.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockManagerDeterministicUnitTest.java
index 7922c4a..54183a2 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockManagerDeterministicUnitTest.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockManagerDeterministicUnitTest.java
@@ -116,7 +116,9 @@
             }
         }
 
-        resultScanner.close();
+        if (resultScanner != null) {
+            resultScanner.close();
+        }
         
         if (isSuccess) {
             log("\n*** Test Passed ***");
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockManagerRandomUnitTest.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockManagerRandomUnitTest.java
index ee934e1..ea34379 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockManagerRandomUnitTest.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockManagerRandomUnitTest.java
@@ -20,7 +20,7 @@
     private static final int MAX_NUM_OF_UPGRADE_JOB = 2;//2
     private static final int MAX_NUM_OF_ENTITY_LOCK_JOB = 8;//8
     private static final int MAX_NUM_OF_DATASET_LOCK_JOB = 2;//2
-    private static final int MAX_NUM_OF_THREAD_IN_A_JOB = 1; //4
+    private static final int MAX_NUM_OF_THREAD_IN_A_JOB = 2; //4
     private static int jobId = 0;
     private static Random rand;
 
@@ -125,6 +125,7 @@
     private int upgradeIndex;
     private boolean isUpgradeThread;
     private boolean isUpgradeThreadJob;
+    private boolean isDone;
 
     public LockRequestProducer(ILockManager lockMgr, TransactionContext txnContext, boolean isDatasetLock,
             boolean isUpgradeThreadJob, boolean isUpgradeThread) {
@@ -139,6 +140,7 @@
         requestHistory = new StringBuilder();
         unlockIndex = 0;
         upgradeIndex = 0;
+        isDone = false;
     }
 
     @Override
@@ -156,6 +158,8 @@
             e.printStackTrace();
             return;
         } finally {
+
+ 
             /*
             System.out.println("" + Thread.currentThread().getName() + "\n" + requestHistory.toString() + ""
                     + Thread.currentThread().getName() + "\n");
@@ -170,6 +174,9 @@
     private void runDatasetLockTask() {
         try {
             produceDatasetLockRequest();
+            if (isDone) {
+                return;
+            }
         } catch (ACIDException e) {
             e.printStackTrace();
             return;
@@ -183,6 +190,9 @@
 
         try {
             produceDatasetUnlockRequest();
+            if (isDone) {
+                return;
+            }
         } catch (ACIDException e) {
             e.printStackTrace();
             return;
@@ -218,6 +228,9 @@
         for (i = 0; i < lockCount; i++) {
             try {
                 produceEntityLockRequest(lockMode);
+                if (isDone) {
+                    return;
+                }
             } catch (ACIDException e) {
                 e.printStackTrace();
                 return;
@@ -228,6 +241,9 @@
         for (i = 0; i < upgradeCount; i++) {
             try {
                 produceEntityLockUpgradeRequest();
+                if (isDone) {
+                    return;
+                }
             } catch (ACIDException e) {
                 e.printStackTrace();
                 return;
@@ -240,6 +256,9 @@
             for (i = 0; i < lockCount; i++) {
                 try {
                     produceEntityUnlockRequest();
+                    if (isDone) {
+                        return;
+                    }
                 } catch (ACIDException e) {
                     e.printStackTrace();
                     return;
@@ -307,10 +326,12 @@
 
         while (upgradeIndex < size) {
             lockRequest = requestQueue.get(upgradeIndex++);
-            if (lockRequest.isUpgrade) {
+            if (lockRequest.isUpgrade || lockRequest.isTryLockFailed) {
                 continue;
             }
-            if (lockRequest.requestType == RequestType.UNLOCK || lockRequest.requestType == RequestType.RELEASE_LOCKS) {
+            if (lockRequest.requestType == RequestType.UNLOCK || lockRequest.requestType == RequestType.RELEASE_LOCKS
+                    || lockRequest.requestType == RequestType.INSTANT_LOCK
+                    || lockRequest.requestType == RequestType.INSTANT_TRY_LOCK) {
                 continue;
             }
             if (lockRequest.lockMode == LockMode.X) {
@@ -387,9 +408,9 @@
         
         if (existLockRequest) {
             int requestType = RequestType.RELEASE_LOCKS;
-            int datasetId = -1;
-            int entityHashValue = -1;
-            byte lockMode = LockMode.S;
+            int datasetId = lockRequest.datasetIdObj.getId();
+            int entityHashValue = lockRequest.entityHashValue;
+            byte lockMode = lockRequest.lockMode;
             LockRequest request = new LockRequest(Thread.currentThread().getName(), requestType, new DatasetId(datasetId), entityHashValue, lockMode,
                     txnContext);
             requestQueue.add(request);
@@ -402,10 +423,48 @@
 
         switch (request.requestType) {
             case RequestType.LOCK:
-                lockMgr.lock(request.datasetIdObj, request.entityHashValue, request.lockMode, request.txnContext);
+                try {
+                    lockMgr.lock(request.datasetIdObj, request.entityHashValue, request.lockMode, request.txnContext); 
+                } catch (ACIDException e) {
+                    if (request.txnContext.getStatus() == TransactionContext.TIMED_OUT_STATUS) {
+                        if (request.txnContext.getTxnState() != TransactionState.ABORTED) {
+                            request.txnContext.setTxnState(TransactionState.ABORTED);
+                            log("*** "+ request.txnContext.getJobId()+ " lock request causing deadlock ***");
+                            log("Abort --> Releasing all locks acquired by "+ request.txnContext.getJobId());
+                            try {
+                                lockMgr.releaseLocks(request.txnContext);
+                            } catch (ACIDException e1) {
+                                e1.printStackTrace();
+                            }
+                            log("Abort --> Released all locks acquired by "+ request.txnContext.getJobId());
+                        }
+                        isDone = true;
+                    } else {
+                        throw e;
+                    }
+                }
                 break;
             case RequestType.INSTANT_LOCK:
-                lockMgr.instantLock(request.datasetIdObj, request.entityHashValue, request.lockMode, request.txnContext);
+                try {
+                    lockMgr.instantLock(request.datasetIdObj, request.entityHashValue, request.lockMode, request.txnContext); 
+                } catch (ACIDException e) {
+                    if (request.txnContext.getStatus() == TransactionContext.TIMED_OUT_STATUS) {
+                        if (request.txnContext.getTxnState() != TransactionState.ABORTED) {
+                            request.txnContext.setTxnState(TransactionState.ABORTED);
+                            log("*** "+ request.txnContext.getJobId()+ " lock request causing deadlock ***");
+                            log("Abort --> Releasing all locks acquired by "+ request.txnContext.getJobId());
+                            try {
+                                lockMgr.releaseLocks(request.txnContext);
+                            } catch (ACIDException e1) {
+                                e1.printStackTrace();
+                            }
+                            log("Abort --> Released all locks acquired by "+ request.txnContext.getJobId());
+                        }
+                        isDone = true;
+                    } else {
+                        throw e;
+                    }
+                }
                 break;
             case RequestType.TRY_LOCK:
                 request.isTryLockFailed = !lockMgr.tryLock(request.datasetIdObj, request.entityHashValue,
@@ -431,6 +490,10 @@
             e.printStackTrace();
         }
     }
+    
+    private void log(String s) {
+        System.out.println(s);
+    }
 }
 
 class LockRequest {
@@ -464,31 +527,32 @@
 
     public String prettyPrint() {
         StringBuilder s = new StringBuilder();
-        s.append(threadName).append("\t").append(requestTime).append("\t");
+        //s.append(threadName.charAt(7)).append("\t").append("\t");
+        s.append(threadName.substring(7)).append("\t").append("\t");
         switch (requestType) {
             case RequestType.LOCK:
-                s.append("|L|");
+                s.append("L");
                 break;
             case RequestType.TRY_LOCK:
-                s.append("|TL|");
+                s.append("TL");
                 break;
             case RequestType.INSTANT_LOCK:
-                s.append("|IL|");
+                s.append("IL");
                 break;
             case RequestType.INSTANT_TRY_LOCK:
-                s.append("|ITL|");
+                s.append("ITL");
                 break;
             case RequestType.UNLOCK:
-                s.append("|UL|");
+                s.append("UL");
                 break;
             case RequestType.RELEASE_LOCKS:
-                s.append("|RL|");
+                s.append("RL");
                 break;
             case RequestType.CHECK_SEQUENCE:
-                s.append("|CSQ|");
+                s.append("CSQ");
                 return s.toString();
             case RequestType.CHECK_SET:
-                s.append("|CST|");
+                s.append("CST");
                 return s.toString();
             case RequestType.KILL:
                 s.append("|KI|");
@@ -496,8 +560,8 @@
             default:
                 throw new UnsupportedOperationException("Unsupported method");
         }
-        s.append("\t").append(txnContext.getJobId().getId()).append(",").append(datasetIdObj.getId()).append(",")
-                .append(entityHashValue).append(":");
+        s.append("\t").append(txnContext.getJobId().getId()).append("\t").append(datasetIdObj.getId()).append("\t")
+                .append(entityHashValue).append("\t");
         switch (lockMode) {
             case LockMode.S:
                 s.append("S");
@@ -514,7 +578,7 @@
             default:
                 throw new UnsupportedOperationException("Unsupported lock mode");
         }
-        s.append(",").append(isUpgrade).append("\n");
+        s.append("\n");
         return s.toString();
     }
 }
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockRequestFile b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockRequestFile
index 55ce07c..29e5a5f 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockRequestFile
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockRequestFile
@@ -1,20 +1,80 @@
-1 L	1 1 1 S
-2 L	2 1 1 S
-3 L	3 1 1 S
-4 L	1 1 1 X
-1 L	1 1 1 S
-5 L	5 1 1 S
-0 CST	
-2 UL	2 1 1 S
-3 UL	3 1 1 S
-2 KI
-3 KI
-0 CST
-4 UL	1 1 1 S
-0 CST	
-1 UL	1 1 1 S
-0 CST
-5 UL	5 1 1 S
-1 KI
-4 KI
-5 KI
\ No newline at end of file
+16		L	11	8	7	S
+11		L	8	5	-1	X
+12		L	9	9	-1	X
+13		TL	10	6	14	S
+9		TL	6	8	10	S
+8		TL	5	1	9	X
+10		TL	7	8	10	X
+7		TL	4	1	9	S
+6		TL	3	5	22	X
+5		TL	2	5	22	S
+15		TL	11	9	3	S
+14		TL	10	9	3	S
+4		TL	1	1	5	X
+3		TL	0	1	5	S
+16		TL	11	5	0	S
+9		UL	6	8	10	S
+13		L	10	5	14	S
+8		UL	5	1	9	S
+6		L	3	5	19	X
+7		TL	4	6	6	S
+5		L	2	5	19	S
+14		TL	10	0	13	S
+15		TL	11	0	13	S
+4		TL	1	2	18	X
+3		TL	0	2	18	S
+16		L	11	5	23	S
+7		UL	4	6	6	S
+8		TL	5	6	6	X
+14		TL	10	0	4	S
+15		TL	11	0	4	S
+4		L	1	9	29	X
+3		L	0	9	29	S
+7		L	4	3	26	S
+8		UL	5	6	6	S
+14		UL	10	0	4	S
+15		UL	11	0	4	S
+7		UL	4	3	26	S
+8		L	5	3	26	X
+14		TL	10	0	13	X
+15		RL	11	0	0	S
+7		L	4	6	16	S
+8		UL	5	3	26	S
+7		L	4	2	29	S
+14		RL	10	0	0	S
+8		L	5	6	16	X
+7		UL	4	2	29	S
+7		L	4	4	15	S
+7		TL	4	2	29	S
+7		L	4	2	25	S
+7		UL	4	2	25	S
+7		TL	4	7	6	S
+7		L	4	6	14	S
+7		UL	4	6	14	S
+7		L	4	7	0	S
+7		TL	4	1	22	S
+7		TL	4	7	7	S
+7		UL	4	7	7	S
+7		UL	4	6	16	S
+7		UL	4	4	15	S
+8		L	5	2	29	X
+7		UL	4	2	29	S
+7		UL	4	7	6	S
+8		UL	5	2	29	S
+7		UL	4	7	0	S
+8		L	5	4	15	X
+7		UL	4	1	22	S
+8		TL	5	2	29	X
+8		L	5	2	25	X
+8		UL	5	2	25	S
+8		TL	5	7	6	X
+8		L	5	6	14	X
+8		UL	5	6	14	S
+8		L	5	7	0	X
+8		TL	5	1	22	X
+8		TL	5	7	7	X
+8		UL	5	7	7	S
+8		UL	5	6	16	S
+8		UL	5	4	15	S
+8		UL	5	2	29	S
+8		UL	5	7	6	S
\ No newline at end of file
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockRequestTracker.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockRequestTracker.java
index d88abef..ba47b5a 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockRequestTracker.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockRequestTracker.java
@@ -7,36 +7,42 @@
 import java.util.Set;
 
 public class LockRequestTracker {
-    HashMap<Integer, StringBuilder> jobRequestHistory; //per job
-    StringBuilder globalRequestHistory;
+    HashMap<Integer, StringBuilder> historyPerJob; //per job
+    StringBuilder historyForAllJobs;
+    StringBuilder requestHistoryForAllJobs; //request only
 
     public LockRequestTracker() {
-        globalRequestHistory = new StringBuilder();
-        jobRequestHistory = new HashMap<Integer, StringBuilder>();
+        historyForAllJobs = new StringBuilder();
+        historyPerJob = new HashMap<Integer, StringBuilder>();
+        requestHistoryForAllJobs = new StringBuilder();
     }
 
     public void addEvent(String msg, LockRequest request) {
         int jobId = request.txnContext.getJobId().getId();
-        StringBuilder jobHistory = jobRequestHistory.get(jobId);
+        StringBuilder jobHistory = historyPerJob.get(jobId);
 
         //update jobHistory
         if (jobHistory == null) {
             jobHistory = new StringBuilder();
         }
         jobHistory.append(request.prettyPrint()).append("--> ").append(msg).append("\n");
-        jobRequestHistory.put(jobId, jobHistory);
+        historyPerJob.put(jobId, jobHistory);
 
         //handle global request queue
-        globalRequestHistory.append(request.prettyPrint()).append("--> ").append(msg).append("\n");
+        historyForAllJobs.append(request.prettyPrint()).append("--> ").append(msg).append("\n");
+    }
+    
+    public void addRequest(LockRequest request) {
+        requestHistoryForAllJobs.append(request.prettyPrint());
     }
 
-    public String getGlobalRequestHistory() {
-        return globalRequestHistory.toString();
+    public String getHistoryForAllJobs() {
+        return historyForAllJobs.toString();
     }
 
-    public String getLocalRequestHistory() {
+    public String getHistoryPerJob() {
         StringBuilder history = new StringBuilder();
-        Set<Entry<Integer, StringBuilder>> s = jobRequestHistory.entrySet();
+        Set<Entry<Integer, StringBuilder>> s = historyPerJob.entrySet();
         Iterator<Entry<Integer, StringBuilder>> iter = s.iterator();
         while (iter.hasNext()) {
             Map.Entry<Integer, StringBuilder> entry = (Map.Entry<Integer, StringBuilder>) iter.next();
@@ -44,4 +50,8 @@
         }
         return history.toString();
     }
+    
+    public String getRequestHistoryForAllJobs() {
+        return requestHistoryForAllJobs.toString();
+    }
 }
\ No newline at end of file
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockWaiter.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockWaiter.java
index 2f81c8d..2015aec 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockWaiter.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockWaiter.java
@@ -35,6 +35,8 @@
     private int nextWaiterObjId; //used for DatasetLockInfo and EntityLockInfo
     private int nextWaitingResourceObjId; //used for JobInfo
     private long beginWaitTime;
+    private boolean isWaiter; //is upgrader or waiter
+    private boolean isWaitingOnEntityLock; //is waiting on datasetLock or entityLock
 
     public LockWaiter() {
         this.victim = false;
@@ -123,4 +125,21 @@
     public long getBeginWaitTime() {
         return beginWaitTime;
     }
+    
+    public boolean isWaiter() {
+        return isWaiter;
+    }
+    
+    public void setWaiter(boolean isWaiter) {
+        this.isWaiter = isWaiter;
+    }
+    
+    public boolean isWaitingOnEntityLock() {
+        return isWaitingOnEntityLock;
+    }
+    
+    public void setWaitingOnEntityLock(boolean isWaitingOnEntityLock) {
+        this.isWaitingOnEntityLock = isWaitingOnEntityLock;
+    }
+    
 }
diff --git a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockWaiterManager.java b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockWaiterManager.java
index 1c0e2ff..dbe76ff 100644
--- a/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockWaiterManager.java
+++ b/asterix-transactions/src/main/java/edu/uci/ics/asterix/transaction/management/service/locking/LockWaiterManager.java
@@ -335,9 +335,9 @@
         childArray[currentSlot].setNextWaitingResourceObjId(-1);
         childArray[currentSlot].setBeginWaitTime(-1l);
         occupiedSlots++;
-//        if (LockManager.IS_DEBUG_MODE) {
-//            System.out.println(Thread.currentThread().getName()+"  Alloc LockWaiterId("+currentSlot+")");
-//        }
+        if (LockManager.IS_DEBUG_MODE) {
+            System.out.println(Thread.currentThread().getName()+"  Alloc LockWaiterId("+currentSlot+")");
+        }
         return currentSlot;
     }
 
@@ -345,9 +345,9 @@
         childArray[slotNum].setNextFreeSlot(freeSlotNum);
         freeSlotNum = slotNum;
         occupiedSlots--;
-//        if (LockManager.IS_DEBUG_MODE) {
-//            System.out.println(Thread.currentThread().getName()+"  Dealloc LockWaiterId("+slotNum+")");
-//        }
+        if (LockManager.IS_DEBUG_MODE) {
+            System.out.println(Thread.currentThread().getName()+"  Dealloc LockWaiterId("+slotNum+")");
+        }
     }
 
     public void deinitialize() {