Skip to content

Commit ce1f0d0

Browse files
Neil DEVASNeil DEVAS
authored andcommitted
fix abort
1 parent 99c1578 commit ce1f0d0

3 files changed

Lines changed: 46 additions & 33 deletions

File tree

src/main/java/group25/Server/Common/AbstractRMHashMapManager.java

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,37 @@ public void crashResourceManager(CrashMode cm) {
4949
}
5050

5151
public void vote(int xid) throws RemoteException {
52-
if (!transactionExists(xid)) middlewareRM.receiveVote(xid, false, this.m_name);
53-
54-
// get global lock
55-
boolean gotLock = globalLock.lock(xid);
56-
if (!gotLock) middlewareRM.receiveVote(xid, false, this.m_name);
57-
58-
updateThenPersistGlobalState(xid);
59-
middlewareRM.receiveVote(xid, true, this.m_name);
52+
new Thread(() -> {
53+
if (!transactionExists(xid)) {
54+
try {
55+
middlewareRM.receiveVote(xid, false, this.m_name);
56+
return;
57+
} catch (RemoteException e) {
58+
// TODO Auto-generated catch block
59+
e.printStackTrace();
60+
}
61+
return;
62+
}
63+
64+
// get global lock
65+
boolean gotLock = globalLock.lock(xid);
66+
if (!gotLock) {
67+
try {
68+
middlewareRM.receiveVote(xid, false, this.m_name);
69+
} catch (RemoteException e) {
70+
// TODO Auto-generated catch block
71+
e.printStackTrace();
72+
}
73+
}
74+
75+
updateThenPersistGlobalState(xid);
76+
try {
77+
middlewareRM.receiveVote(xid, true, this.m_name);
78+
} catch (RemoteException e) {
79+
// TODO Auto-generated catch block
80+
e.printStackTrace();
81+
}
82+
}).start();
6083
}
6184

6285
public boolean doCommit(int xid) throws RemoteException {

src/main/java/group25/Server/Common/FairWaitInterruptibleLock.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public boolean lock(int xid) {
1818
synchronized(this) {
1919
xids.addLast(xid);
2020
xidToSemaphore.put(xid, new Semaphore(1));
21-
21+
System.out.println("getting xids in lock " + xids);
2222
try {
2323
if (xids.peekFirst() != xid) {// not first in line
2424
xidToSemaphore.get(xid).acquire();// next acquire() fails
@@ -57,7 +57,7 @@ public boolean unlock(int xid) {
5757

5858
public boolean interruptWaiter(int xid) {
5959
synchronized(this) {
60-
if (xids.peekFirst() == xid) {
60+
if (xids.peekFirst() != null && xids.peekFirst() == xid) {
6161
return false;
6262
}
6363

src/main/java/group25/Server/Common/TransactionManager.java

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -127,19 +127,18 @@ public synchronized boolean commit(int xid) throws InvalidTransactionException,
127127
}
128128

129129
crashIf(CrashMode.TM_BEFORE_VOTE_REQUEST);
130-
System.out.println("acquired it");
131130
synchronized(resourceManagers) {
132-
resourceManagers = (ArrayList<Name_RM_Vote>)resourceManagers.clone();
133-
}
134-
for (Name_RM_Vote name_rm_vote : resourceManagers) {
135-
name_rm_vote.rm.vote(xid);
131+
for (Name_RM_Vote name_rm_vote : resourceManagers) {
132+
name_rm_vote.rm.vote(xid);
133+
}
136134
}
137-
System.out.println("released it");
135+
138136
crashIf(CrashMode.TM_BEFORE_ANY_VOTE_REPLIES);
139137

140138
Semaphore sem = new Semaphore(1);
141139
synchronized(voteReplyWaitMap) {
142140
voteReplyWaitMap.put(xid, sem);
141+
System.out.println("getting semaphore " + voteReplyWaitMap.get(xid));
143142
}
144143
try {
145144
sem.acquire();
@@ -155,7 +154,10 @@ public synchronized boolean commit(int xid) throws InvalidTransactionException,
155154
}
156155

157156
public void receiveVote(int xid, boolean voteYes, String rmName) {
158-
Semaphore sem = voteReplyWaitMap.get(xid);
157+
Semaphore sem = null;
158+
synchronized(voteReplyWaitMap) {
159+
sem = voteReplyWaitMap.get(xid);
160+
}
159161
if (!voteYes) {
160162
System.out.println("vote no");
161163
try {
@@ -177,25 +179,18 @@ public void receiveVote(int xid, boolean voteYes, String rmName) {
177179
synchronized(resourceManagerRecorder) {
178180
resourceManagers = resourceManagerRecorder.get(xid);
179181
}
180-
System.out.println("got it!!!! " + resourceManagerRecorder);
181182

182183
if (resourceManagers == null) {
183184
System.out.println("resource managers is null");
184185
return;
185186
}; // already aborted
186187

187-
boolean allYes = false;
188-
System.out.println("about to go into the resourcemanagers");
189188
synchronized(resourceManagers) {
190-
System.out.println("about to do more shit");
191189
int numRMs = resourceManagers.size();
192-
System.out.println(xid + " used " + " numRMs " + numRMs);
193190
int yesCount = 0;
194191
for (Name_RM_Vote name_rm_vote : resourceManagers) {
195192
if (name_rm_vote.rmName.equals(rmName)) {
196-
System.out.println("got the dudes vote");
197193
if (voteYes) {
198-
System.out.println("voted yes");
199194
name_rm_vote.votedYes = true;
200195
}
201196
}
@@ -204,26 +199,21 @@ public void receiveVote(int xid, boolean voteYes, String rmName) {
204199
}
205200
}
206201
if (yesCount == numRMs) {
207-
System.out.println("all yesses");
208-
allYes = true;
209-
}
210-
if (allYes) {
211202
for (Name_RM_Vote name_rm_vote : resourceManagers) {
212203
try {
213-
System.out.println("calling do commit");
204+
System.out.println("calling do commit on " + name_rm_vote.rmName);
214205
name_rm_vote.rm.doCommit(xid);
215206
} catch (RemoteException e) {
216207
// TODO handle this
217208
e.printStackTrace();
218209
}
219210
}
211+
lockManager.UnlockAll(xid);
212+
resourceManagerRecorder.remove(xid);
213+
sem.release();
220214
}
221215
}
222216
// ------------- HERE ENDS 2PC -------------
223-
System.out.println("unlocking and releasing");
224-
lockManager.UnlockAll(xid);
225-
resourceManagerRecorder.remove(xid);
226-
sem.release();
227217
return;
228218
}
229219

0 commit comments

Comments
 (0)