diff --git a/mydht b/mydht new file mode 100644 index 0000000000000000000000000000000000000000..6821cb787da2a6a7379ef09fa6d087f00280e3cf Binary files /dev/null and b/mydht differ diff --git a/t2.c b/t2.c index 89c079e0dc72eb346c44d9a2f85dcf205fd763c7..d51c59a98f2055c53b38c4cf0b3501174f6f6500 100644 --- a/t2.c +++ b/t2.c @@ -16,15 +16,28 @@ typedef struct Node { struct Node* prev; } Node; + +int atualiza_max_id(Node *dht){ + Node *current = dht; + int max_id = 0; + do { + if(current->id > max_id){ + max_id = current->id; + } + current = current->next; + } while (current != dht); + return max_id; +} + void redistribute_keys(Node *dht, Node* new_node) { Node *start = dht; do { Node* current = new_node; - // printf("Start:%d Next:%d\n", start->id, current->id); - // printf("Start->key_count:%d\n", start->key_count); + printf("Start:%d Next:%d\n", start->id, current->id); + printf("Start->key_count:%d\n", start->key_count); //O novo nodo deve ter as chaves EXISTENTES que são maiores que o antecessor e menores ou iguais a ele for (int i = 0; i < start->key_count; i++) { - // printf("Start->keys[%d]:%d\n", i, start->keys[i]); + printf("Start->keys[%d]:%d\n", i, start->keys[i]); if (start->keys[i] > start->id && start->keys[i] <= current->id) { current->keys[current->key_count++] = start->keys[i]; start->keys[i] = 0; @@ -161,14 +174,14 @@ Node* remove_node(Node* head, int id) { // Função para calcular a tabela finger void calculate_finger_table(Node* head, int max_id) { Node* current = head; - // printf("Max_id:%d\n", max_id); + printf("Max_id:%d\n", max_id); int log2_max_id = ceil(log2(max_id)); - // printf("Log2_max_id:%d\n", log2_max_id); + printf("Log2_max_id:%d\n", log2_max_id); do { for (int k = 1; k <= log2_max_id; k++) { - // printf("N:%d", current->id); + printf("N:%d", current->id); int finger_id = (current->id + (1 << (k-1))) % (1 << log2_max_id); - // printf(" Finger_id:%d\n", finger_id); + printf(" Finger_id:%d\n", finger_id); Node* temp = head; //Inserir na tabela_finger o id do nó que é o menor id maior que o id do finger_id, ou seja, o id mais próximo do finger_id while(temp->id < finger_id && temp->next != head) { @@ -215,8 +228,8 @@ void print_finger_table_completa(Node* head, int timestamp) { // Função para realizar lookup de uma chave -Node ** lookup(Node* head, int timestamp, int node_id, int key, int *num_nodes) { - // printf("Lookup\n"); +Node ** lookup(Node* head, int timestamp, int node_id, int key, int *num_nodes, int max_id) { + printf("Lookup\n"); Node* current = head; Node** nodes_involved = (Node**)malloc(TAM_MAX_FINGER * sizeof(Node*)); *num_nodes = 0; @@ -240,6 +253,7 @@ Node ** lookup(Node* head, int timestamp, int node_id, int key, int *num_nodes) } } printf(","); + //Procura o maior nó conhecido pela finger_table que está acima do valor da chave for (int i = 0; i < current->tam_finger; i++) { if (current->finger[i] > key) { @@ -263,6 +277,12 @@ Node ** lookup(Node* head, int timestamp, int node_id, int key, int *num_nodes) while(current->id != id_aux){ current = current->next; } + + //Previne caso onde a chave nao esta no maior nodo + if(current->id == max_id && key > current->id){ + current = head; + } + nodes_involved[(*num_nodes)++] = current; //Adiciona o nó atual ao array de nós envolvidos //Previne loops infinitos @@ -290,7 +310,7 @@ void insert_key(Node* head, int node_id, int key) { } current->keys[current->key_count++] = key; - // printf("Chave %d inserida no nó %d\n", key, current->id); + printf("Chave %d inserida no nó %d\n", key, current->id); } void imprime_chaves(Node* head) { @@ -322,11 +342,12 @@ int main() { calculate_finger_table(dht, max_id); } else if (op == 'S') { dht = remove_node(dht, id); + max_id = atualiza_max_id(dht); } else if (op == 'I') { insert_key(dht, id, key); } else if (op == 'L') { int num_nodes = 0; - nodes_involved = lookup(dht, timestamp, id, key, &num_nodes); + nodes_involved = lookup(dht, timestamp, id, key, &num_nodes, max_id); print_finger_table(nodes_involved, num_nodes, timestamp); free(nodes_involved); } else if (op == 'P'){ diff --git a/teste1.in b/teste1.in index ce0be837c917b784e45b83340b99112ebf36de04..0d823836dc09173ce87013f7907d282f1c9ded2b 100644 --- a/teste1.in +++ b/teste1.in @@ -8,8 +8,9 @@ 8 L 10 18 9 E 1 - 10 E 56 - -11 I 1 50 +11 I 1 58 12 S 56 - 13 E 52 - 14 E 42 - -15 L 10 50 \ No newline at end of file +15 P 1 - +16 L 28 58 \ No newline at end of file