예제 #1
0
        private void checkTableOfPendingTransactions(ulong tid)
        {
            Console.WriteLine(pendingTransactionSplitted.Count);
            Console.WriteLine("checkTableOfPendingTransactions: " + tid);

            bool transferDone = false;

            foreach (Tuple <string, ulong, int, int> tuple in pendingTransactionSplitted)
            {
                //(tuple.Item2 != 0) pq e a primeira vez

                if (tid >= tuple.Item2)
                {
                    IServer server = (IServer)Activator.GetObject(typeof(IServer), tuple.Item1);



                    List <PadIntRemote> padIntsToSend = new List <PadIntRemote>();
                    foreach (var padInt in objectsInServer)
                    {
                        if (padInt.Key >= tuple.Item3 && padInt.Key <= tuple.Item4)
                        {
                            padIntsToSend.Add(padInt.Value.getCommitted());
                        }
                    }

                    //TODO ter em conta que pode falhar
                    server.SendPadInt(padIntsToSend);
                    //foreach (var padInt in padIntsToSend)
                    //{
                    //    objectsInServer.Remove(padInt.uid);
                    //}
                }
            }
        }
예제 #2
0
        //o doCommit deveria ser atomico. pode dar problema?
        internal bool doCommit(ulong tid)
        {
            PadIntTransaction objectTransaction = null;
            PadIntTentative   tentative         = null;
            PadIntCommitted   commited          = null;

            List <PadIntRemote> toReplicate = new List <PadIntRemote>();

            //desbloquear threads em espera no read com
            Console.WriteLine("Em do commit Tid: " + tid);

            foreach (int modifiedObject in transactions[tid].getModifiedObjectIds())
            {
                //Console.WriteLine("Em do commit no for Tid: " + tid + "modificou" + modifiedObject);

                //por commited
                //remover objecto transaccao
                //remover objecto tentativa
                //por tentativa como commited se vamos remover vale a pena? ter em atenção que no read ele ve se o anterior esta commited. nao sei se deviamos eliminar.
                //actualizar o valor do commited


                objectTransaction = objectsInServer[modifiedObject];

                SortedList <ulong, PadIntTentative> tentatives = objectTransaction.getTentatives();
                tentative = tentatives[tid];

                commited = objectTransaction.getCommitted();
                commited.WriteTimestamp = tid;
                commited.Value          = tentative.Value;

                toReplicate.Add(commited);

                tentative.SetCommited();
                tentatives.Remove(tid);

                objectWaitHandle[modifiedObject].Set();//fez commit.temos de notificar threads para avancarem.
                pendingTransactions[modifiedObject].Set();
            }

            transactions[tid].setCommited();
            //Transacção efectuda e agora removida
            transactions.Remove(tid);

            if (replica != null)
            {
                replica.SendPadInt(toReplicate);
            }

            foreach (var p in toReplicate)
            {
                Console.WriteLine("replicado = " + p.uid + " " + p.Value);
            }

            checkTableOfPendingTransactions(tid);

            return(true); //sempre verdade?
        }