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() {