diff options
| author | 2025-09-16 11:45:09 +0330 | |
|---|---|---|
| committer | 2025-09-16 11:45:09 +0330 | |
| commit | 96bda3794a6a96021dce0f29c4860b4276954784 (patch) | |
| tree | 7dc2b2b60d7ee3e5c789e6098220cc5a69163fa6 /src | |
| parent | compressino + fixed logic (diff) | |
fix duplicate + better propagation
Diffstat (limited to 'src')
| -rw-r--r-- | src/packet_storage.c | 28 | ||||
| -rw-r--r-- | src/server.c | 140 |
2 files changed, 117 insertions, 51 deletions
diff --git a/src/packet_storage.c b/src/packet_storage.c index 5781661..922cc45 100644 --- a/src/packet_storage.c +++ b/src/packet_storage.c @@ -141,17 +141,31 @@ void save_author_packet_hash(const public_key author, const hash packet_hash) { const char *dir = "packets_by_author"; mkdir(dir, 0755); - char author_hex[ 65 ]; + char author_hex[65]; sprintf(author_hex, hash_fmt, hash_ref(author)); - char filename[ 256 ]; + char filename[256]; snprintf(filename, sizeof(filename), "%s/%s.list", dir, author_hex); - FILE *f = fopen(filename, "ab"); - if (!f) return; - fwrite(packet_hash, 32, 1, f); - fputc('\n', f); - fclose(f); + FILE *f = fopen(filename, "rb"); + if (f) { + unsigned char buf[64]; + while (fread(buf, 1, 64, f) >= 32) { + int c = fgetc(f); + (void)c; + if (memcmp(buf, packet_hash, 32) == 0) { + fclose(f); + return; + } + } + fclose(f); + } + + FILE *fa = fopen(filename, "ab"); + if (!fa) return; + fwrite(packet_hash, 32, 1, fa); + fputc('\n', fa); + fclose(fa); } void save_recipient_packet_hash(const recipient recipient, const hash packet_hash) { diff --git a/src/server.c b/src/server.c index 630df87..7dc7382 100644 --- a/src/server.c +++ b/src/server.c @@ -75,6 +75,61 @@ bool add_neighbor(struct relay_neighbor new_neighbor) { return false; } +struct propagation_stream_data { + size_t send_len; + byte* send_data; + struct relay_neighbor neighbor; +}; + +void* call_neighbor_for_propagation(void* arg) { + struct propagation_stream_data* data = arg; + + byte* response_data = NULL; + size_t response_len = 0; + int result = -1; + + if (data->neighbor.has_ipv4) { + char ip_string[ 16 ]; + sprintf( + ip_string, + "%d.%d.%d.%d", + data->neighbor.v4_addr[ 0 ], + data->neighbor.v4_addr[ 1 ], + data->neighbor.v4_addr[ 2 ], + data->neighbor.v4_addr[ 3 ]); + + result = study( + ip_string, + data->neighbor.port, + data->send_data, + data->send_len, + &response_data, + &response_len); + } else if (data->neighbor.has_ipv6) { + char ip_string[ 46 ]; + int offset = 0; + for (int j = 0; j < 8; j++) { + uint16_t word + = (data->neighbor.v6_addr[ j * 2 ] << 8) | data->neighbor.v6_addr[ j * 2 + 1 ]; + offset += sprintf(ip_string + offset, "%x%s", word, (j < 7) ? ":" : ""); + } + + result = study( + ip_string, + data->neighbor.port, + data->send_data, + data->send_len, + &response_data, + &response_len); + } + + if (result != 0) { log(_error, "failed to send packet to neighbor"); } + if (response_data) { free(response_data); } + + free(arg); + return NULL; +} + void* propagate_packet(void* _packet) { struct data_packet packet = *(struct data_packet*) _packet; @@ -82,53 +137,50 @@ void* propagate_packet(void* _packet) { if (!decide_packet_propogation_func(packet)) return NULL; } - log(_debug, "propagating packet " hash_fmt, hash_ref(packet.hash)); + log(_debug, "propagating packet"); - size_t send_len = 1 + sizeof(struct data_packet); - byte send_data[ send_len * sizeof(byte) ]; - send_data[ 0 ] = push_packet; + size_t send_len = 1 + sizeof(struct data_packet); + byte* send_data = malloc(send_len * sizeof(byte)); + send_data[ 0 ] = push_packet; data_packet2s(packet, send_data + 1); pthread_mutex_lock(&neighbor_storage_mutex); - for (uint64_t i = 0; i < neighbor_count; i++) { - struct relay_neighbor neighbor = neighbor_storage[ i ]; - if (neighbor.active) { - byte* response_data = NULL; - size_t response_len = 0; - int result = -1; - - if (neighbor.has_ipv4) { - char ip_string[ 16 ]; - sprintf( - ip_string, - "%d.%d.%d.%d", - neighbor.v4_addr[ 0 ], - neighbor.v4_addr[ 1 ], - neighbor.v4_addr[ 2 ], - neighbor.v4_addr[ 3 ]); - result = study( - ip_string, neighbor.port, send_data, send_len, &response_data, &response_len); - } else if (neighbor.has_ipv6) { - char ip_string[ 46 ]; - int offset = 0; - for (int j = 0; j < 8; j++) { - uint16_t word - = (neighbor.v6_addr[ j * 2 ] << 8) | neighbor.v6_addr[ j * 2 + 1 ]; - offset += sprintf(ip_string + offset, "%x%s", word, (j < 7) ? ":" : ""); - } + uint64_t active_count = 0; + for (uint64_t i = 0; i < neighbor_count; i++) { + if (neighbor_storage[ i ].active) active_count++; + } - result = study( - ip_string, neighbor.port, send_data, send_len, &response_data, &response_len); - } + if (active_count == 0) { + pthread_mutex_unlock(&neighbor_storage_mutex); + free(send_data); + free(_packet); + return NULL; + } - if (result != 0) { log(_error, "failed to send packet to neighbor"); } + pthread_t neighbors_threads[ active_count ]; + int sent_counts = 0; - if (response_data) { free(response_data); } + for (uint64_t i = 0; i < neighbor_count; i++) { + struct relay_neighbor neighbor = neighbor_storage[ i ]; + if (neighbor.active) { + struct propagation_stream_data* data = malloc(sizeof(struct propagation_stream_data)); + *data = (struct propagation_stream_data) { .send_data = send_data, + .send_len = send_len, + .neighbor = neighbor }; + pthread_create( + &neighbors_threads[ sent_counts ], NULL, call_neighbor_for_propagation, data); + pthread_detach(neighbors_threads[ sent_counts ]); } } + pthread_mutex_unlock(&neighbor_storage_mutex); + for (uint64_t i = 0; i < active_count; i++) { pthread_join(neighbors_threads[ i ], NULL); } + + log(_debug, "done"); + + free(send_data); free(_packet); return NULL; } @@ -424,15 +476,15 @@ void paste_server( save_packet(packet); - if (((float) rand() / (float) RAND_MAX) < 0.75) { - struct data_packet* thread_arg = malloc(sizeof(struct data_packet)); - if (thread_arg) { - *thread_arg = packet; - pthread_t prop_thread; - pthread_create(&prop_thread, NULL, propagate_packet, thread_arg); - pthread_detach(prop_thread); - } + // if (((float) rand() / (float) RAND_MAX) < 0.75) { + struct data_packet* thread_arg = malloc(sizeof(struct data_packet)); + if (thread_arg) { + *thread_arg = packet; + pthread_t prop_thread; + pthread_create(&prop_thread, NULL, propagate_packet, thread_arg); + pthread_detach(prop_thread); } + // } } else { output_data[ 1 ] = false; } @@ -866,7 +918,7 @@ void save_packet(const struct data_packet packet) { if (!decide_packet_save_to_disk_func(packet)) return; } - log(_debug, "saving packet " hash_fmt " to disk", hash_ref(packet.hash)); + log(_debug, "saving packet to disk"); mkdir("packets", 0755); |
