public override Tuple Take(Tuple tuple) { var request = new TakeRequest(ClientRequestSeqNumber, EndpointURL, tuple); Log("[SEQ:" + ClientRequestSeqNumber + "] Take: " + tuple); return(SendBlockingRequest(request)); }
public override void Write(Tuple tuple) { var request = new WriteRequest(ClientRequestSeqNumber, EndpointURL, tuple); MulticastMessageWaitAll(View.Nodes, request); WaitMessage(request, View.Nodes); ClientRequestSeqNumber++; }
public override void Write(Tuple tuple) { var request = new WriteRequest(ClientRequestSeqNumber, EndpointURL, tuple); Log("[SEQ:" + ClientRequestSeqNumber + "] Write: " + tuple); SendMessageToRandomServer(request); ClientRequestSeqNumber++; }
public override Tuple Take(Tuple tuple) { int timeStep = 250; // ms List <Message> messages = null; Message resultMessage = null; List <Tuple> intersection = new List <Tuple>(); Tuple selectedTuple = new Tuple(new List <object>()); // PHASE 1 var takeRequest = new TakeRequest(ClientRequestSeqNumber, EndpointURL, tuple); // wait for all responses MulticastMessageWaitAll(View.Nodes, takeRequest); WaitMessage(takeRequest, View.Nodes); ClientRequestSeqNumber++; lock (ReplyResultQueue) { ReplyResultQueue.TryGetValue(takeRequest, out var replyResult); messages = new List <Message>(replyResult?.GetAllResults()); } // get the intersection Response response; intersection = ((Response)messages.First()).Tuples; foreach (Message msg in messages) { response = (Response)msg; intersection = new List <Tuple>(intersection.Intersect(response.Tuples)); } // choose random tuple from intersection selectedTuple = intersection.ElementAt((new Random()).Next(0, intersection.Count)); // phase 2, issue a take remove and wait for all acks Message takeRemove = new TakeRemove(EndpointURL, selectedTuple, takeRequest.SeqNum); MulticastMessageWaitAll(View.Nodes, takeRemove); WaitMessage(takeRemove, View.Nodes); return(selectedTuple); }
public override Tuple Read(Tuple tuple) { Message resultMessage = null; var request = new ReadRequest(ClientRequestSeqNumber, EndpointURL, tuple); MulticastMessageWaitAny(View.Nodes, request); // wait until it gets a any message WaitMessage(request, View.Nodes); lock (ReplyResultQueue) { ReplyResultQueue.TryGetValue(request, out var replyResult); resultMessage = replyResult?.GetAnyResult(); } ClientRequestSeqNumber++; Response response = (Response)resultMessage; return(response.Tuples.First()); }
public TakeRemove(string srcRemoteURL, Tuple selectedTuple, int takeRequestSeqNum) : base(srcRemoteURL) { SelectedTuple = selectedTuple; TakeRequestSeqNumber = takeRequestSeqNum; }
public ReadRequest(int seqNum, string srcEndpointURL, Tuple tuple) : base(seqNum, srcEndpointURL, tuple) { }
public void runScript(string[] script) { ProcessLines(script, 1); // process the lines with instructions n times void ProcessLines(string[] lines, int n) { var onRepeat = false; var repeatCycle = 0; var repeatInstructions = new List <string>(); for (var i = 0; i < n; i++) { foreach (var line in lines) { var splitLine = line.Split(' '); // if inside a begin-repeat if (onRepeat) { if (splitLine[0] != "end-repeat") { repeatInstructions.Add(line); continue; } ProcessLines(repeatInstructions.ToArray(), repeatCycle); onRepeat = false; repeatCycle = 0; repeatInstructions.Clear(); continue; } Tuple receivedTuple; switch (splitLine[0]) { case "add": Tuple tupleToAdd = ParseTuple(splitLine[1]); Write(tupleToAdd); Console.WriteLine("Added: " + tupleToAdd); break; case "read": Tuple tupleToRead = ParseTuple(splitLine[1]); receivedTuple = Read(tupleToRead); Console.WriteLine("Tried to Read: " + tupleToRead + ", and got: " + receivedTuple); break; case "take": Tuple tupleToTake = ParseTuple(splitLine[1]); receivedTuple = Take(tupleToTake); Console.WriteLine("Tried to Take: " + tupleToTake + ", and got: " + receivedTuple); break; case "wait": var time = int.Parse(splitLine[1]); Thread.Sleep(time); break; case "begin-repeat": onRepeat = true; repeatCycle = int.Parse(splitLine[1]); break; case "end-repeat": throw new NotSupportedException(); } } } } // parses a string representation of a tuple Tuple ParseTuple(string stringTuple) { var fields = new List <object>(); var matches = Regex.Matches(stringTuple, "\"[^\"]+\"|\\w+\\([^\\)]+\\)|\\w+"); foreach (var match in matches) { var field = match.ToString(); // if it's a string if (field[0].Equals('"')) { // add to the list of object (the tuple fields) fields.Add(field.Trim('"')); } // if it's an object else { if (field.Equals("null")) { fields.Add(null); } else { object[] classArgs = field.Split("(),\"".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); var classType = Type.GetType("CommonTypes.tuple.tupleobjects." + classArgs[0] + ", CommonTypes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") ?? throw new InvalidOperationException("Could not create instance using classType: " + classArgs[0]); // if it has arguments if (classArgs.Length > 1) { // convert strings to int if applicable classArgs = Array.ConvertAll(classArgs.Skip(1).ToArray(), s => int.TryParse(s.ToString(), out var i) ? i : s); // instantiate dadTestObject using the arguments provided var dadTestObject = Activator.CreateInstance(classType, classArgs); // add to the list of object (the tuple fields) fields.Add(dadTestObject); } else { fields.Add(classType); } } } } return(new Tuple(fields)); } }
public abstract Tuple Take(Tuple tuple);
public abstract Tuple Read(Tuple tuple);
public abstract void Write(Tuple tuple);
protected Request(int seqNum, string srcEndpointURL, Tuple tuple) : base(srcEndpointURL) { SeqNum = seqNum; Tuple = tuple; }