Example #1
0
        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++;
        }
Example #3
0
        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());
        }
Example #6
0
 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)
 {
 }
Example #8
0
        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));
            }
        }
Example #9
0
 public abstract Tuple Take(Tuple tuple);
Example #10
0
 public abstract Tuple Read(Tuple tuple);
Example #11
0
 public abstract void Write(Tuple tuple);
Example #12
0
 protected Request(int seqNum, string srcEndpointURL, Tuple tuple) : base(srcEndpointURL)
 {
     SeqNum = seqNum;
     Tuple  = tuple;
 }