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); //} } } }
//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? }