summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri.staessens@ugent.be>2017-12-05 21:24:37 +0100
committerSander Vrijders <sander.vrijders@ugent.be>2017-12-05 21:27:38 +0100
commitca2f47d8b1d2061b0fc63ebefe53424e28ef18bb (patch)
tree463f4f0e066b698d64d13e67b7612398f85a1eb8
parenta1b982bf4c052360cd854b9e4c97592893692701 (diff)
downloadouroboros-ca2f47d8b1d2061b0fc63ebefe53424e28ef18bb.tar.gz
ouroboros-ca2f47d8b1d2061b0fc63ebefe53424e28ef18bb.zip
ipcpd: Update DHT buckets in JOINING state
The DHT buckets were not updated in JOINING state, which sometimes caused the DHT to miss its first peer update when joining and become isolated. This also checks if a name is already registered to avoid adding it multiple times. Signed-off-by: Dimitri Staessens <dimitri.staessens@ugent.be> Signed-off-by: Sander Vrijders <sander.vrijders@ugent.be>
-rw-r--r--src/ipcpd/normal/dht.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/ipcpd/normal/dht.c b/src/ipcpd/normal/dht.c
index 836a0c53..221248aa 100644
--- a/src/ipcpd/normal/dht.c
+++ b/src/ipcpd/normal/dht.c
@@ -2223,6 +2223,20 @@ int dht_bootstrap(struct dht * dht,
return -1;
}
+static struct ref_entry * ref_entry_get(struct dht * dht,
+ const uint8_t * key)
+{
+ struct list_head * p;
+
+ list_for_each(p, &dht->refs) {
+ struct ref_entry * r = list_entry(p, struct ref_entry, next);
+ if (!memcmp(key, r->key, dht-> b) )
+ return r;
+ }
+
+ return NULL;
+}
+
int dht_reg(struct dht * dht,
const uint8_t * key)
{
@@ -2237,11 +2251,19 @@ int dht_reg(struct dht * dht,
if (dht_get_state(dht) != DHT_RUNNING)
return -1;
+ pthread_rwlock_wrlock(&dht->lock);
+
+ if (ref_entry_get(dht, key) != NULL) {
+ log_dbg("Name already registered.");
+ pthread_rwlock_unlock(&dht->lock);
+ return 0;
+ }
+
e = ref_entry_create(dht, key);
- if (e == NULL)
+ if (e == NULL) {
+ pthread_rwlock_unlock(&dht->lock);
return -ENOMEM;
-
- pthread_rwlock_wrlock(&dht->lock);
+ }
list_add(&e->next, &dht->refs);
@@ -2305,7 +2327,7 @@ uint64_t dht_query(struct dht * dht,
pthread_rwlock_unlock(&dht->lock);
- if (addrs[0] != 0 && addrs[0] != dht->addr)
+ if (addrs[0] != 0)
return addrs[0];
lu = kad_lookup(dht, key, KAD_FIND_VALUE);
@@ -2477,10 +2499,11 @@ static void * dht_handle_sdu(void * o)
break;
}
- if (msg->code != KAD_JOIN &&
- dht_get_state(dht) == DHT_RUNNING) {
+ if (msg->code != KAD_JOIN) {
pthread_rwlock_wrlock(&dht->lock);
- if (dht_update_bucket(dht, msg->s_id.data, addr))
+ if ((dht->state == DHT_JOINING ||
+ dht->state == DHT_RUNNING) &&
+ dht_update_bucket(dht, msg->s_id.data, addr)
log_warn("Failed to update bucket.");
pthread_rwlock_unlock(&dht->lock);
}
@@ -2606,6 +2629,7 @@ static void * join_thr(void * o)
while (kad_join(info->dht, info->addr)) {
if (retr++ == KAD_JOIN_RETR) {
dht_set_state(info->dht, DHT_INIT);
+ log_warn("DHT enrollment attempt failed.");
goto finish;
}