KS_DECLARE(uint8_t) ks_dhtrt_findclosest_nodes(ks_dhtrt_routetable_t* table, ks_dhtrt_querynodes_t* query);
KS_DECLARE(ks_dht_node_t*) ks_dhtrt_find_node(ks_dhtrt_routetable_t* table, ks_dht_nodeid_t id);
+
KS_DECLARE(ks_status_t) ks_dhtrt_release_node(ks_dht_node_t* node);
+KS_DECLARE(ks_status_t) ks_dhtrt_release_querynodes(ks_dhtrt_querynodes_t* query);
KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t* table);
if (bucket != 0) { /* probably a logic error ?*/
ks_rwl_read_lock(bucket->lock);
- ks_dht_node_t* node = ks_dhtrt_find_nodeid(bucket, nodeid.id);
+ node = ks_dhtrt_find_nodeid(bucket, nodeid.id);
if (node != NULL) {
ks_rwl_read_lock(node->reflock);
uint8_t total = 0;
uint8_t cnt;
- if (max == 0) return 0; /* sanity check */
+ if (max == 0) return 0; /* sanity checks */
+ if (max > KS_DHTRT_MAXQUERYSIZE) { /* enforce the maximum */
+ max = KS_DHTRT_MAXQUERYSIZE;
+ query->max = KS_DHTRT_MAXQUERYSIZE;
+ }
query->count = 0;
ks_dhtrt_sortedxors_t *x = tofree->next;
ks_pool_free(table->pool, tofree);
- tofree = x->next;
+ tofree = x;
}
return query->count;
KS_DECLARE(ks_status_t) ks_dhtrt_release_node(ks_dht_node_t* node)
{
- return KS_STATUS_SUCCESS;
return ks_rwl_read_unlock(node->reflock);
}
-
+KS_DECLARE(ks_status_t) ks_dhtrt_release_querynodes(ks_dhtrt_querynodes_t *query)
+{
+ for(int ix=0; ix<query->count; ++ix) {
+ ks_rwl_read_unlock(query->nodes[ix]->reflock);
+ }
+ return KS_STATUS_SUCCESS;
+}
KS_DECLARE(void) ks_dhtrt_process_table(ks_dhtrt_routetable_t *table)
{
ks_dhtrt_bucket_entry_t *e = &b->entries[ix];
if (e->inuse == 1) {
- /* more than n pings outstanding? */
- if (e->outstanding_pings >= KS_DHTRT_MAXPING) {
- e->flags = DHTPEER_EXPIRED;
- ++b->expired_count;
- continue;
- }
+ if (e->gptr->type != KS_DHT_LOCAL) { /* 'local' nodes do not get expired */
+
+ /* more than n pings outstanding? */
+
+ if (e->outstanding_pings >= KS_DHTRT_MAXPING) {
+ e->flags = DHTPEER_EXPIRED;
+ ++b->expired_count;
+ continue;
+ }
+
+ if (e->flags == DHTPEER_SUSPECT) {
+ ks_dhtrt_ping(e);
+ continue;
+ }
- if (e->flags == DHTPEER_SUSPECT) {
- ks_dhtrt_ping(e);
- continue;
- }
+ ks_time_t tdiff = t0 - e->tyme;
- ks_time_t tdiff = t0 - e->tyme;
+ if (tdiff > KS_DHTRT_INACTIVETIME) {
+ e->flags = DHTPEER_SUSPECT;
+ ks_dhtrt_ping(e);
+ }
- if (tdiff > KS_DHTRT_INACTIVETIME) {
- e->flags = DHTPEER_SUSPECT;
- ks_dhtrt_ping(e);
- }
+ } /* end if not local */
} /* end if e->inuse */