summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordimitri staessens <[email protected]>2017-07-29 12:49:44 +0200
committerdimitri staessens <[email protected]>2017-07-29 12:49:44 +0200
commit59ce015771719f4a0de14ef6bf91887dc8cf5966 (patch)
treef9c284fcceb9cf61e6426cd3e4847a02d58150af /src
parentbddac9e135e1a412d60de39cf17249507107499d (diff)
downloadouroboros-59ce015771719f4a0de14ef6bf91887dc8cf5966.tar.gz
ouroboros-59ce015771719f4a0de14ef6bf91887dc8cf5966.zip
ipcpd: Some fixes in DHT
Fixes a memory leak when the DHT is destroyed during a send_msg. Fixes a deadlock when destroying the DHT with a pending lookup. Removes some debug logs that clutter output due to expected redundant FIND_VALUE responses.
Diffstat (limited to 'src')
-rw-r--r--src/ipcpd/normal/dht.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/src/ipcpd/normal/dht.c b/src/ipcpd/normal/dht.c
index b79d9480..9072ee5a 100644
--- a/src/ipcpd/normal/dht.c
+++ b/src/ipcpd/normal/dht.c
@@ -827,13 +827,6 @@ static enum lookup_state lookup_wait(struct lookup * lu)
pthread_cleanup_pop(false);
- if (lu->state == LU_DESTROY) {
- lu->state = LU_NULL;
- pthread_cond_signal(&lu->cond);
- pthread_mutex_unlock(&lu->lock);
- return -1;
- }
-
state = lu->state;
pthread_mutex_unlock(&lu->lock);
@@ -1320,7 +1313,7 @@ static int send_msg(struct dht * dht,
ipcp_sdb_release(sdb);
#endif /* __DHT_TEST__ */
- if (msg->code < KAD_STORE) {
+ if (msg->code < KAD_STORE && dht->state != DHT_SHUTDOWN) {
req = kad_req_create(dht, msg, addr);
if (req != NULL)
list_add(&req->next, &dht->requests);
@@ -1478,6 +1471,7 @@ static void lookup_set_state(struct lookup * lu,
pthread_mutex_lock(&lu->lock);
lu->state = state;
+ pthread_cond_signal(&lu->cond);
pthread_mutex_unlock(&lu->lock);
}
@@ -1526,6 +1520,9 @@ static struct lookup * kad_lookup(struct dht * dht,
kad_find(dht, id, addrs, code);
break;
case LU_DESTROY:
+ pthread_rwlock_wrlock(&dht->lock);
+ list_del(&lu->next);
+ pthread_rwlock_unlock(&dht->lock);
lookup_set_state(lu, LU_NULL);
return NULL;
default:
@@ -1932,7 +1929,6 @@ static int kad_handle_find_resp(struct dht * dht,
lu = dht_find_lookup(dht, req->key);
if (lu == NULL) {
- log_dbg("Response for unknown lookup.");
pthread_rwlock_unlock(&dht->lock);
return -1;
}
@@ -1974,8 +1970,7 @@ static void kad_handle_response(struct dht * dht,
case KAD_FIND_NODE:
if (dht_get_state(dht) != DHT_RUNNING)
return;
- if (kad_handle_find_resp(dht, req, msg))
- log_dbg("Invalid or outdated response.");
+ kad_handle_find_resp(dht, req, msg);
break;
default:
break;
@@ -2265,8 +2260,10 @@ void dht_post_sdu(void * ae,
pthread_rwlock_unlock(&dht->lock);
}
- if (msg->code < KAD_STORE)
- send_msg(dht, &resp_msg, addr);
+ if (msg->code < KAD_STORE) {
+ if (send_msg(dht, &resp_msg, addr))
+ log_warn("Failed to send response.");
+ }
kad_msg__free_unpacked(msg, NULL);