Esempio n. 1
0
        public static void CallbackWrite(IAsyncResult ar)
        {
            RemoteAsyncWriteDelegate del = (RemoteAsyncWriteDelegate)((AsyncResult)ar).AsyncDelegate;

            lock (WriteLock)
            {
                _responseWrite.Add(del.EndInvoke(ar));
                writeHandles[writeCounter++].Set();
                if (writeCounter == numServers)
                {
                    writeCounter = 0;
                }
            }
        }
Esempio n. 2
0
        public void Write(Tuple tuple)
        {
            bool ViewOutOfDate = true;

            while (ViewOutOfDate)
            {
                _responseWrite = new List <bool>();
                View actualView    = this.GetView();
                int  numberServers = actualView.Count();
                numServers = numberServers;

                writeHandles = new AutoResetEvent[numberServers];

                Console.WriteLine(actualView);

                for (int i = 0; i < numberServers; i++)
                {
                    writeHandles[i] = new AutoResetEvent(false);
                }

                //List<ITupleSpaceXL> serversObj = new List<ITupleSpaceXL>();

                List <string> toRemove = new List <string>();


                foreach (string serverPath in actualView.Servers)
                {
                    try
                    {
                        ITupleSpaceXL server = (ITupleSpaceXL)Activator.GetObject(typeof(ITupleSpaceXL), serverPath);

                        RemoteAsyncWriteDelegate RemoteDel = new RemoteAsyncWriteDelegate(server.write);
                        a++;
                        AsyncCallback RemoteCallback = new AsyncCallback(CallbackWrite);
                        IAsyncResult  RemAr          = RemoteDel.BeginInvoke(_workerId, _requestId, tuple, _view, CallbackWrite, null);
                    }
                    catch (System.Net.Sockets.SocketException)
                    {
                        Console.WriteLine("** FRONTEND WRITE: Could not call write on server");
                    }
                }

                WaitHandle.WaitAll(writeHandles, 2000);

                //When some server joins the view while the operation is taking place

                //Because some machine on my view crashed while the operation was taking place
                if (_responseWrite.Count != _view.Servers.Count)
                {
                    writeCounter = 0;
                    foreach (string s in _view.Servers)
                    {
                        try
                        {
                            ITupleSpaceXL tupleSpace = (ITupleSpaceXL)Activator.GetObject(typeof(ITupleSpaceXL), s);
                            tupleSpace.checkView();
                        }
                        catch (Exception) { Console.WriteLine("Server " + s + " is dead."); }
                    }
                    if (_responseWrite.Count > 0)
                    {
                        ViewOutOfDate = false;
                    }
                }
                else
                {
                    if (_responseWrite.Contains(false) == true)
                    {
                        Console.WriteLine("** FRONTEND WRITE: View has been changed");
                    }
                    else
                    {
                        ViewOutOfDate = false;
                    }
                }
                _requestId++;
            }
            Console.WriteLine("** FRONTEND WRITE: Just wrote " + tuple + " a = " + a);
        }