Add comments
This commit is contained in:
+39
-28
@@ -13,30 +13,32 @@
|
|||||||
#include "tcp.h"
|
#include "tcp.h"
|
||||||
#include "chunk_server.h"
|
#include "chunk_server.h"
|
||||||
|
|
||||||
static void
|
static void download_targets_init(DownloadTargets *targets)
|
||||||
download_targets_init(DownloadTargets *targets)
|
|
||||||
{
|
{
|
||||||
targets->count = 0;
|
targets->count = 0;
|
||||||
targets->capacity = 0;
|
targets->capacity = 0;
|
||||||
targets->items = NULL;
|
targets->items = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void download_targets_free(DownloadTargets *targets)
|
||||||
download_targets_free(DownloadTargets *targets)
|
|
||||||
{
|
{
|
||||||
sys_free(targets->items);
|
sys_free(targets->items);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void download_targets_remove(DownloadTargets *targets,
|
||||||
download_targets_remove(DownloadTargets *targets, SHA256 hash)
|
SHA256 hash)
|
||||||
{
|
{
|
||||||
assert(0); // TODO: remove all downloads of this chunk
|
assert(0); // TODO: remove all downloads of this chunk
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int download_targets_push(DownloadTargets *targets,
|
||||||
download_targets_add(DownloadTargets *targets, Address addr, SHA256 hash)
|
Address addr, SHA256 hash)
|
||||||
{
|
{
|
||||||
// Avoid duplicates
|
// Avoid duplicates! This is important as the metadata server may
|
||||||
|
// tell us to download our missing chunks again while we are still
|
||||||
|
// going through the previous list of downloads. This check becomes
|
||||||
|
// relevant as the update period approaches the time the chunk server
|
||||||
|
// needs to go through a list of downloads.
|
||||||
for (int i = 0; i < targets->count; i++)
|
for (int i = 0; i < targets->count; i++)
|
||||||
if (addr_eql(targets->items[i].addr, addr) && !memcmp(&targets->items[i].hash, &hash, sizeof(SHA256)))
|
if (addr_eql(targets->items[i].addr, addr) && !memcmp(&targets->items[i].hash, &hash, sizeof(SHA256)))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -66,6 +68,32 @@ download_targets_add(DownloadTargets *targets, Address addr, SHA256 hash)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool download_targets_pop(DownloadTargets *targets,
|
||||||
|
DownloadTarget *target)
|
||||||
|
{
|
||||||
|
// Read the head
|
||||||
|
if (targets->count == 0)
|
||||||
|
return false;
|
||||||
|
*target = targets->items[0];
|
||||||
|
|
||||||
|
// Pop the head
|
||||||
|
for (int i = 0; i < targets->count-1; i++)
|
||||||
|
targets->items[i] = targets->items[i+1];
|
||||||
|
targets->count--;
|
||||||
|
|
||||||
|
// We expect the download list to be empty most
|
||||||
|
// of the time, so if this was the last element
|
||||||
|
// there may not be a new one for a while and we
|
||||||
|
// can clear the array.
|
||||||
|
if (targets->count == 0) {
|
||||||
|
free(targets->items);
|
||||||
|
targets->items = NULL;
|
||||||
|
targets->capacity = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static int chunk_store_init(ChunkStore *store, string path)
|
static int chunk_store_init(ChunkStore *store, string path)
|
||||||
{
|
{
|
||||||
if (create_dir(path) && errno != EEXIST)
|
if (create_dir(path) && errno != EEXIST)
|
||||||
@@ -216,23 +244,6 @@ static int send_error(TCP *tcp, int conn_idx,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool download_targets_pop(DownloadTargets *targets,
|
|
||||||
DownloadTarget *target)
|
|
||||||
{
|
|
||||||
if (targets->count == 0)
|
|
||||||
return false;
|
|
||||||
*target = targets->items[0];
|
|
||||||
for (int i = 0; i < targets->count-1; i++)
|
|
||||||
targets->items[i] = targets->items[i+1];
|
|
||||||
targets->count--;
|
|
||||||
if (targets->count == 0) {
|
|
||||||
free(targets->items);
|
|
||||||
targets->items = NULL;
|
|
||||||
targets->capacity = 0;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void start_download(ChunkServer *state)
|
static void start_download(ChunkServer *state)
|
||||||
{
|
{
|
||||||
if (state->downloading)
|
if (state->downloading)
|
||||||
@@ -445,14 +456,14 @@ process_metadata_server_sync_4(ChunkServer *state, int conn_idx, ByteView msg)
|
|||||||
|
|
||||||
// Add to pending download list
|
// Add to pending download list
|
||||||
for (uint32_t k = 0; k < total_ipv4; k++)
|
for (uint32_t k = 0; k < total_ipv4; k++)
|
||||||
download_targets_add(
|
download_targets_push(
|
||||||
&state->download_targets,
|
&state->download_targets,
|
||||||
(Address) { .is_ipv4=true, .ipv4=ipv4[k], .port=ipv4_port[k] },
|
(Address) { .is_ipv4=true, .ipv4=ipv4[k], .port=ipv4_port[k] },
|
||||||
hash
|
hash
|
||||||
);
|
);
|
||||||
|
|
||||||
for (uint32_t k = 0; k < total_ipv6; k++)
|
for (uint32_t k = 0; k < total_ipv6; k++)
|
||||||
download_targets_add(
|
download_targets_push(
|
||||||
&state->download_targets,
|
&state->download_targets,
|
||||||
(Address) { .is_ipv4=false, .ipv6=ipv6[k], .port=ipv6_port[k] },
|
(Address) { .is_ipv4=false, .ipv6=ipv6[k], .port=ipv6_port[k] },
|
||||||
hash
|
hash
|
||||||
|
|||||||
Reference in New Issue
Block a user