/***************************************************************/ /* Simulacao de uma Versao do Algoritmo de Consenso Paxos */ /* */ /* Disciplina: CI721 - Sistemas Distribuídos */ /* Autor: Flavio Rogerio Uber */ /* Professor: Elias P. Duarte Jr. */ /* */ /***************************************************************/ #include #include #include #include "smpl.h" /* eventos */ #define send_msg 1 #define recv_msg 2 #define recv_ack 3 #define recv_nack 4 #define fault 5 #define decision 6 typedef struct { int id; int *tempo; int instante; int *aceite; int valor; } tmsg; /* descritor do nodo */ typedef struct { int id; int *STATE; int id_atual; int id_aceito; int vl_consenso; }tnodo; tmsg *msgs; tnodo *nodo; main(int argc, char *argv[]){ static int N, token, P, event, r, i, j, k, rnd, qt_ack, valor_final, qt, id_temp, falho; static char fa_name[5]; if (argc != 2){ puts("Uso correto: trabalho "); exit(1); } N = atoi(argv[1]); smpl(0,"Um exemplo de simulacao"); reset(); stream(1); /* inicializacao */ nodo = (tnodo *)malloc(sizeof(tnodo)*N); for (i=0;i 1) printf("\n\nO processo %d recebeu %d ACK.",token, qt_ack-1); // informa no log a quantidade de ACK recebida for(i=0;i (N-falho)/2) { //a maioria é calculada diminuindo a quantidade de processos falhos printf("\nAgora o processo %d recebeu ACK da maioria dos processos não-falhos e esta pronto para o consenso.",token); valor_final = msgs[k].valor; //o valor do consenso será o valor informado na mensagem nodo[token].vl_consenso = valor_final; k=(token+1)%N; while (k != token){ if (nodo[token].STATE[k] != 1){ //prepara o consenso apenas para os processo nao-falhos schedule(decision,0,k); printf("\nA decisao de consenso foi enviada para o processo %d.",k); } else printf("\nA decisao de consenso nao foi enviada ao processo %d, pois ele esta falho.",k); k=(k+1)%N; } } else { printf("\nAinda não há ACK suficiente para o consenso."); //se nao houver maioria, isso e informado no log } } break; case recv_nack: k = 0; while (((msgs[k].id)%N != token)&&(k id_temp%N) // e calculado o novo ID para a nova mensagem a ser enviada id_temp = id_temp + (token - id_temp%N); else id_temp = id_temp + (N-((token - id_temp%N)*-1)); nodo[token].id_atual = id_temp; printf("\n\nO processo %d recebeu NACK e fara a geracao de um novo ID para reenviar a mensagem.", token); msgs[token].id=-1; //reinicializa-se a mensagem do processo for(j=0;j