public void sendTuples() { Console.WriteLine("sendTuples starting"); while (true) { if (_operator.freeze) { _operator.eventSendTuples.WaitOne(); } if (_operator.outputTuples.Count != 0) { Tup outputTuple; lock (_operator.outputTuples) { outputTuple = (Tup)_operator.outputTuples[0].Clone(); /*foreach (Tup tup in _operator.outputTuples) * { * Console.WriteLine("tup = " + tup.id); * }*/ } lock (_operator.sendAddresses) { string routing = _operator.routing; int fieldNumberHashing = -1; if (routing.Contains('(')) { routing = "hashing"; fieldNumberHashing = Int32.Parse(_operator.routing.Split('(')[1].Split(')')[0]); } bool receivedAnswer = true; if (_operator.sendAddresses.Count != 0) { List <string> savedReplicaIDs = new List <string>(); bool validID = false; Console.WriteLine("output tuple ID = " + outputTuple.id); Console.WriteLine("processing number = " + _operator.processingNumber); //Thread.Sleep(10000); _operator.atualizaProcessingNumber(); if (outputTuple.id == _operator.processingNumber + 1) { Console.WriteLine("OLAAA"); validID = true; outputTuple.id = _operator.sequenceNumber + 1; foreach (string operatorID in aliveReplicas.Keys) { int limit = aliveReplicas[operatorID].Count; int replicaIndex = -1; switch (routing) { case "primary": replicaIndex = 0; //Always the first available replica of each operator break; case "random": Random random = new Random(); replicaIndex = random.Next(0, limit); break; case "hashing": replicaIndex = getHashValue(outputTuple, limit, fieldNumberHashing); break; } Console.WriteLine("BBBBB"); int id = aliveReplicas[operatorID][replicaIndex]; string replicaID = operatorID + "-" + id; string sendAddress = _operator.sendAddresses[replicaID]; try { operatorServices = (OperatorServices)Activator.GetObject( typeof(OperatorServices), sendAddress); Console.WriteLine("Sending to " + sendAddress + " the following tuple -> " + constructTuple(outputTuple)); var task = Task.Run(() => operatorServices.exchangeTuples(outputTuple)); if (task.Wait(TimeSpan.FromSeconds(TIMEOUT))) { contador++; // Just to make an aux print in the Console Console.WriteLine("Received Answer " + contador); addSequenceNumberToAllReplicas(); addProcessingNumberToAllReplicas(); } else { Console.WriteLine("Did not received answer"); savedReplicaIDs.Add(replicaID); receivedAnswer = false; if (_operator.semantics.Equals("at-most-once")) { _operator.addSequenceNumberToAllReplicas(); _operator.addProcessingNumberToAllReplicas(); } throw new DadStormTimeOutException(); } if (_operator.loggingLevel.Equals("full")) { new Thread(() => puppetMasterServices.addMessageToLog(constructMsgToLog(outputTuple))).Start(); } } catch (System.Net.Sockets.SocketException e) //Operator crashou { Console.WriteLine("I think that Operator " + replicaID + " crashed. SocketException"); } catch (DadStormTimeOutException e) { Console.WriteLine("I think that Operator " + replicaID + " crashed. TimeOutException"); } catch (Exception e) { Console.WriteLine("EXCEPTION = " + e.InnerException.Message); Console.WriteLine("I think that Operator " + replicaID + " crashed. General Exception"); } } } foreach (string savedReplicaID in savedReplicaIDs) { string failedOperator = savedReplicaID.Split('-')[0]; int failedReplicaID = Int32.Parse(savedReplicaID.Split('-')[1]); aliveReplicas[failedOperator].Remove(failedReplicaID); } if (_operator.semantics.Equals("at-most-once") && validID || _operator.semantics.Equals("at-least-once") && (receivedAnswer)) { lock (_operator.outputTuples) { _operator.outputTuples.RemoveAt(0); } } receivedAnswer = false; } } } } }