public TSpaceMsg ProcessRequest(TSpaceMsg msg) { TSpaceMsg response; //Console.WriteLine("started processing"); //Console.WriteLine(msg); TSMan.Processing(); response = XLProcessRequest(msg); lock (TSpaceAdvManager.ProcessedRequests) { if (response.Code != "Repeated" && response.Code != "badView" && TSpaceAdvManager.ProcessedRequests.Contains(msg.RequestID)) { TSpaceAdvManager.ProcessedRequests.UpdateResponse(msg.RequestID, response); //Console.WriteLine("SAVED THIS TRASH: " + response.ToString()); } } TSMan.FinishedProcessing(); //Console.WriteLine("finished processing"); //Console.WriteLine("RESPONSE:" + response); return(response); }
public TSpaceMsg SMRProcessRequest(TSpaceMsg msg) { TSMan.CheckFreeze(); TSMan.CheckDelay(); lock (AggredOperations) { if (msg.Code != "proposeSeq") { AggredOperations[msg.OperationID] = msg.SequenceNumber; } else { //Console.WriteLine("Not Agreed: " + msg.OperationID); } } TSpaceMsg response = new TSpaceMsg { ProcessID = TSMan.URL, OperationID = msg.OperationID, RequestID = msg.RequestID, MsgView = TSMan.GetTotalView() }; // Verifying View! Wrong view sends updated view if (!TSMan.ValidView(msg)) { Console.WriteLine("Wrong View ( s = " + TSMan.ServerView.ID + "; c = " + msg.MsgView.ID + " )"); return(TSMan.CreateBadViewReply(msg)); } lock (TSpaceAdvManager.ProcessedRequests) { // Check if request as already been processed if (TSpaceAdvManager.ProcessedRequests.Contains(msg.RequestID)) { // Check if it was processed in a previous viwew if (TSpaceAdvManager.ProcessedRequests.GetByKey(msg.RequestID).Request.MsgView.ID < TSMan.ServerView.ID) { //Console.WriteLine(TSMan.ServerView.ID); TSpaceAdvManager.ProcessedRequests.UpdateView(msg.RequestID, TSMan.ServerView); TSpaceMsg resp = TSpaceAdvManager.ProcessedRequests.GetByKey(msg.RequestID).Response; if (resp == null) { Console.WriteLine("NULL RESPONSE SAVED"); return(null); } return(resp); } else { response.Code = "Repeated"; return(response); } } Console.WriteLine("Starting processing of request " + msg.RequestID); // Add sequence number of request to processed requests TSpaceAdvManager.ProcessedRequests.Add(msg); } string command = msg.Code; Message update = null; // Sequence number proposal request if (command.Equals("proposeSeq")) { lock (AggredOperations) { //Already was executed corresponsing operation if (AggredOperations.ContainsKey(msg.OperationID)) { response.Code = "proposedSeq"; response.SequenceNumber = AggredOperations[msg.OperationID]; return(response); } lock (MessageQueue) { // Increment sequence number Interlocked.Increment(ref SequenceNumber); } response.SequenceNumber = SequenceNumber; response.Code = "proposedSeq"; AddMessageToQueue(msg); } Console.WriteLine("Proposing (id = " + msg.OperationID + "; seq = " + response.SequenceNumber + ")"); return(response); } // Message with agreed sequence number else { //Update message queue with agreed seq number update = UpdateMessage(msg.OperationID, msg.SequenceNumber); if (update == null) { Console.WriteLine("Err: operation message not in queue"); //response.Code = "Err"; } } //Wait for the message head of queue Monitor.Enter(MessageQueue); while (MessageQueue.Count == 0 || !MessageQueue[0].MessageID.Equals(msg.OperationID)) { TSMan.FinishedProcessing(); Monitor.Wait(MessageQueue, 500); TSMan.Processing(); } Monitor.Exit(MessageQueue); Console.WriteLine("Execute operation " + msg.OperationID + ": code = " + command); // Execute the operation if (TSMan.Verbose) { Console.WriteLine(msg); } switch (command) { case "add": lock (TakeLock) { if (msg.Tuple == null) { response.Code = "ERR"; break; } TSMan.TSpace.Add(msg.Tuple); response.Code = "ACK"; break; } case "read": if (msg.Tuple == null) { response.Code = "ERR"; break; } response.Tuple = TSMan.TSpace.Read(msg.Tuple); response.Code = "OK"; if (response.Tuple == null) { Console.WriteLine("Match not Found"); } break; case "take1": lock (TakeLock) { if (msg.Tuple == null) { response.Code = "ERR"; break; } // Get matching tuple response.Tuple = TSMan.TSpace.Read(msg.Tuple); response.Code = "OK"; if (response.Tuple != null) { // Delete it TSMan.TSpace.Take2(response.Tuple); } } response.Code = "OK"; break; case "take2": Console.WriteLine("Current Tuple Space not in XL mode"); response.Code = "ERR"; break; // Operation exclusive of the XL Tuple Space case "releaseLocks": lock (TakeLock) response.Code = "ERR"; Console.WriteLine("Current Tuple Space not in XL mode"); break; default: Console.WriteLine("Invalid command."); break; } RemoveFromQueue(msg.OperationID); return(response); }